Рисование пользовательской кнопки в горячем или нажатом состоянии

Я создал пользовательский элемент управления кнопки. В основном один прямоугольник кнопки, но с двумя областями внутри прямоугольника, которые имеют другое поведение. По этой причине я хочу нарисовать горячее и нажатое состояние ТОЛЬКО для определенных областей, а не кнопку отверстия.

Мой текущий подход - рисование базовой кнопки с помощью ButtonRenderer.DrawButton(...) с пустым текстом, нарисуйте горячее или нажатое состояние, если необходимо, и, наконец, отрисовку текста. Пока все хорошо, но как мне получить (градиент) цвета для горячего / нажатого состояния?

я пробовал SystemColors, KnownColors а также VisualStyleRenderer.GetColor(ColorProperty.XYZ) но никто из них не подходит? Как я могу прочитать эти цвета из хост-системы?

РЕДАКТИРОВАТЬ:
Пример изображения ниже:

Я хочу, чтобы цвета как горячего, так и нажатого состояния кнопки - (светло) синий в случае этого скриншота win7. Если вы увеличите масштаб, вы увидите, что используется небольшой градиент цвета как в верхней, так и в нижней половине.

Последняя кнопка показывает, чего я хочу достичь.

Конечно, я мог бы извлечь цвета из скриншотов и жестко закодировать их или использовать изображения, как предложено, но это будет работать только для этой конкретной системы, не так ли?

1 ответ

Решение

Спасибо за ваши ответы, Джими.

Согласно принятому ответу на ваш связанный SO-вопрос я проверил ButtonBaseAdapter а также ButtonStandardAdapter, Как вы также упомянули, ButtonRenderer.DrawButton звонки VisualStyleRenderer.DrawBackground который вызывает нативный API UxTheme.DrawThemedBackground нарисовать кнопку - определение цвета происходит внутри. Этот нативный вызов API также рисует границу кнопки, и поэтому я не могу его использовать.

Но я смог решить мою проблему необычным способом, но он работает.

Я отображаю оба соответствующих состояния (горячие и нажатые) на растровое изображение и извлекаю цвета, используя .GetPixel, В OnPaint я создаю LinearGradientBrush-экземпляры из извлеченных цветов и рисовать эффект горячей / нажатой над определенными областями нормальной кнопки.

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

Если не появятся другие ответы или решения, я отмечу этот пост через несколько дней как ответ...

Другие вопросы по тегам