Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top