2013-07-07 2 views
0

У меня довольно неприятная проблема с изображениями на кнопках в .NET. Они не ведут себя так, как вы ожидали бы, что изображение на кнопке будет вести себя.Изображение кнопки не совпадает с текстом при нажатии кнопки?

В свойствах кнопки вы можете установить изображение. Поэтому я выбираю изображение, и изображение появляется на кнопке! Все идет нормально. Когда кнопка нажата или нажата, текст кнопки будет перемещаться вниз и вправо на один пиксель, чтобы создать глубину. Но не образ! Он останется в том же положении, и это будет выглядеть странно. Существует также свойство BackgroundImage, но это еще хуже! Потому что, если я установил BackgroundImageLayout на None вместо Center, изображение переместит вверх и оставит при нажатии, полное противоположное направление текста! Что с этим?

В любом случае, то, что я хочу достичь, - это изображение кнопки, которое движется так же, как текст будет перемещаться, когда кнопка находится в нажатом состоянии. Есть ли способ сделать это?

ответ

0

Просто создайте новое изображение и вставьте оригинал в офсет. Затем установите это как ButtonImage.

Пример:

private void button1_MouseDown(object sender, MouseEventArgs e) 
{ 
    // replace "button_image.png" with the filename of the image you are using 
    Image normalImage = Image.FromFile("button_image.png"); 
    Image mouseDownImage = new Bitmap(normalImage.Width + 1, normalImage.Height + 1); 
    Graphics g = Graphics.FromImage(mouseDownImage); 
    // this will draw the normal image at an offset on mouseDownImage 
    g.DrawImage(normalImage, 1, 1); // offset is one pixel each for x and y 
    // clean up 
    g.Dispose(); 
    button1.Image = mouseDownImage; 
} 

private void button1_MouseUp(object sender, MouseEventArgs e) 
{ 
    // reset image to the normal one 
    button1.Image = Image.FromFile("button_image.png"); 
} 

EDIT: Следующая функция устраняет проблему, при которой изображение не будет «поп» обратно вверх, когда курсор покидает область кнопки, пока кнопка мыши все еще нажата (см лейбористов комментарий ниже):

private void button1_MouseMove(object sender, MouseEventArgs e) 
{ 
    Point relMousePos = e.Location; 
    bool mouseOverButton = true; 
    mouseOverButton &= relMousePos.X > 0; 
    mouseOverButton &= relMousePos.X < button1.Width; 
    mouseOverButton &= relMousePos.Y > 0; 
    mouseOverButton &= relMousePos.Y < button1.Height; 
    if (mouseOverButton != MouseButtons.None) 
    { 
     button1_MouseDown(sender, e); 
    } 
    else 
    { 
     button1_MouseUp(sender, e); 
    } 
} 
+0

Это хорошо работает, пока вы не переместите курсор за пределы кнопки при нажатии кнопки. Кнопка снова появится, как и текст, но не изображение. Кроме того, некоторые графические макеты не имеют перемещения текста вниз/вправо, поэтому было бы здорово иметь какой-то способ определить положение текста или что-то еще, поэтому изображение всегда имеет такое же смещение, как текст. – Labbed

+0

@Labbed: Я не уверен в получении смещения текста, вам, вероятно, потребуется нарисовать кнопку для растрового изображения (для этого есть функция: 'button1.DrawToBitmap') и искать черные пиксели. Я отредактирую свой ответ, чтобы исправить проблему, когда курсор покинет область кнопки. – Timo

+0

Спасибо, но теперь он запустит MouseDown, как только я навещу кнопку. Поиск черных пикселей тоже не является хорошей идеей, так как вы можете изменить цвет текста, и большинство систем сегодня используют ClearType для управления текстом, поэтому вы также не можете искать Системный цвет. Я на самом деле даже не использую текст на кнопке, я просто хочу, чтобы изображение перемещалось, как в других программах с изображениями на кнопках. Я не понимаю, почему .NET имеет это странное поведение по умолчанию. – Labbed

Смежные вопросы