Вы можете просто получить свой собственный элемент управления 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()
в ваших обработчиках событий.