Когда вы обрабатываете событие Paint
(в отличие от переопределения OnPaint
метода в производном классе), базовый класс (обработчик процедуры по умолчанию) уже вызывается,Все рисуется как обычно, и тогда вы, по сути, рисуете поверх этого в событии Paint
.Вы можете ясно видеть это здесь:
Хитрость заключается в том, что вы оставляете достаточно прямоугольника отсечения элемента управления, выставляя show нужную вам часть.Свойство e.ClipRectangle
извлекает клиентскую область кнопки вся , поэтому, если вы просто
заполните ее образцом цвета, вы также закроете стрелку раскрывающегося списка и фон по умолчанию.Приведенная выше демонстрация была создана с использованием следующего уродливого примера кода:
private void ToolStripDropDownButton1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.FillRectangle(Brushes.Chartreuse,
e.ClipRectangle.X + 3, e.ClipRectangle.Y + 3,
e.ClipRectangle.Width - 12,
e.ClipRectangle.Height - 12);
}
Кроме этого, я не думаю, что есть способ настроить то, что именно рисуется базовым классом.Рисование владельца (по крайней мере в WinForms) имеет тенденцию быть делом "все или ничего".Вы получаете полный контроль,
, но это достигается ценой необходимости реализовать все самостоятельно.
Конечно, если вы еще не заметили, элемент управления ToolStrip
уже не похож на собственный элемент управления Windows.И что еще хуже, всегда будет выглядеть точно так же, как и сейчас,
даже в будущих версиях Windows, которые полностью переработали пользовательский интерфейс.(MenuStrip
страдает от
этого же явления, и различие очень заметно в Windows Vista / 7, где стандартные меню API сильно изменились).Причина в том, что оба элемента управления отрисовываются полностью в коде C #, написанном в их реализациях WinForms.Лично я думаю, что это выглядит нелепо, и я не буду использовать его в одном из моих приложений для ставки.
Вы можете назначить пользовательский рендерер, который использует API UxTheme для рисованиякнопки, которые приблизят намного к приближенному к внешнему виду меню и панелям инструментов.Довольно подробный образец доступен здесь .Я написал нечто очень похожее для разработки WinForms, которое требует дополнительных функций класса ToolStrip
(таких как встраивание комбинированных блоков), не предлагаемых
old-school MainMenu
и ToolBar
элементы управления, которые просто оборачивают свои эквиваленты Windows API.Решив действовать таким образом, вы получаете больше контроля над тем, какие именно части рендерера базового класса вы хотите вызывать, так как вы сами написали код явно.Настоятельно рекомендуется, если вы
тип, который вообще заботится об интерфейсе пользователя, нативном восприятии или пользовательском опыте.