Нарисованный владельцем инструмент stripdropdownbutton
-
15-11-2019 - |
Вопрос
Я пишу некоторое пользовательское поведение для ToolStripDropDown
контроль.Я также хотел бы изменить ToolStripDropDownButton
сам по себе для отображения цветной фигуры.
Я вижу, что могу справиться с этим Paint
событие и рисую все, что мне нравится.Однако есть ли какой-нибудь способ заставить кнопку нарисовать фон по умолчанию, прежде чем я нарисую фигуру?Было бы трудно точно настроить фон, особенно с будущими версиями .NET и Windows.
В обычной старой Windows я мог бы вызвать обработчик proc по умолчанию до или после моего кода paint.Я не вижу никакого способа достичь этого в .NET.Или, возможно, есть способ указать кнопке рисовать только фон?
Решение
Когда вы обращаетесь с Paint
событие (в отличие от переопределения OnPaint
метод в производном классе) базовый класс (обработчик proc по умолчанию) уже вызывается.Все рисуется как обычно, и тогда вы, по сути, рисуете вдобавок ко всему этому в Paint
событие.Вы можете ясно видеть это здесь:
Хитрость заключается в том, чтобы убедиться, что вы оставляете открытой достаточную часть отсекающего прямоугольника элемента управления показывать та часть, которую ты хочешь.То 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.Лично я считаю, что это выглядит до смешного банально, и ни за что не стал бы использовать это ни в одном из своих приложений.
Вы мочь назначьте пользовательский рендерер, использующий UxTheme API для рисования кнопок, который получит много ближе к тому, чтобы приблизить внешний вид встроенных меню и панелей инструментов.Имеется довольно подробный образец здесь.Я написал что-то очень похожее для разработки WinForms, которую я выполнил, требуя дополнительных функций ToolStrip
класс (например, встраивание полей со списком), не предлагаемый
олдскульный MainMenu
и ToolBar
элементы управления, которые просто обертывают свои эквиваленты Windows API.Решив действовать таким образом, вы получаете больше контроля над тем, какие именно части средства визуализации базового класса вы хотите вызвать, поскольку вы сами явно написали код.Настоятельно рекомендуется, если вы
тип, который вообще заботится об пользовательском интерфейсе, нативном ощущении или опыте работы с пользователем.