Нарисованный владельцем ToolStripDropDownButton - PullRequest
2 голосов
/ 19 февраля 2011

Я пишу свое собственное поведение для ToolStripDropDown элемента управления.Я также хотел бы изменить сам ToolStripDropDownButton для отображения цветной фигуры.

Я вижу, что могу обработать событие Paint и рисовать все, что мне нравится.Тем не менее, есть ли способ сделать кнопку нарисовать фон по умолчанию, прежде чем я рисую форму?Было бы трудно получить правильный фон, особенно в будущих версиях .NET и Windows.

В простой старой Windows я мог бы вызывать обработчик процедур по умолчанию до или после кода рисования.Я не вижу никакого способа сделать это в .NET.Или, может быть, есть способ заставить кнопку рисовать только фон?

1 Ответ

2 голосов
/ 19 февраля 2011

Когда вы обрабатываете событие Paint (в отличие от переопределения OnPaint метода в производном классе), базовый класс (обработчик процедуры по умолчанию) уже вызывается,Все рисуется как обычно, и тогда вы, по сути, рисуете поверх этого в событии Paint.Вы можете ясно видеть это здесь:

Lime rectangle drawn over part of the drop-down button, clearly showing the default contents underneath

Хитрость заключается в том, что вы оставляете достаточно прямоугольника отсечения элемента управления, выставляя 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.Решив действовать таким образом, вы получаете больше контроля над тем, какие именно части рендерера базового класса вы хотите вызывать, так как вы сами написали код явно.Настоятельно рекомендуется, если вы
тип, который вообще заботится об интерфейсе пользователя, нативном восприятии или пользовательском опыте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...