C # Winforms Как нарисовать прямоугольник на кнопке при наведении мыши? - PullRequest
0 голосов
/ 08 сентября 2011

В нашем приложении у нас есть белые кнопки на белой форме.Когда мышь наводит курсор на кнопку, мы хотим, чтобы над ней был светло-голубой прозрачный прямоугольник.

Я хочу создать этот пользовательский элемент управления, но не знаю, как это сделать.Я пробовал Google, но я не нашел ничего, что могло бы мне помочь, поэтому я надеюсь, что вы, ребята, сможете указать мне правильное направление.

1 Ответ

6 голосов
/ 08 сентября 2011

Вы можете просто получить свой собственный элемент управления WinForms из Button и переопределить событие OnPaint. В обработчике событий у вас будет параметр PaintEventArg, который содержит свойство с именем Graphics. Вы можете использовать это свойство для рисования всего, что вам нужно, непосредственно там, где вы управляете.

Вот пример непосредственно из MSDN: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.onpaint.aspx

Добавлено: просто перечитайте ваш вопрос и обнаружите, что я не ответил правильно.

По сути, вам нужно переопределить два события и добавить одно свойство, показывающее, должен ли ваш элемент управления быть закрашен наложенным прямоугольником или нет, скажем, IsDrawRectangle. Как только событие OnMouseEnter сработало, вы проверяете, установлен ли IsDrawRectangle, а если нет, устанавливаете его в true и вызываете this.Invalidate(). Метод Invalidate() заставит элемент управления перерисовываться, а затем в вашем событии OnPaint вы просто снова проверяете значение вашего свойства IsDrawRectangle и рисуете прямоугольник, если это необходимо. Вы также должны переопределить OnMouseLeave, чтобы установить для свойства значение false и заставить перерисовку удалить прямоугольник.

Добавлено: , если вам нужно перерисовать больше, чем просто один элемент управления (в случае, если ваш прямоугольник покрывает некоторые другие элементы управления, которые необходимо перерисовать), поместите все, что вы хотите перерисовать в одном контейнере и вызовите метод Parent.Invalidate() в ваших обработчиках событий.

...