Рисование пользовательской кнопки в горячем или нажатом состоянии - PullRequest
0 голосов
/ 04 июня 2018

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

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

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

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

enter image description here

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

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

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

1 Ответ

0 голосов
/ 06 июня 2018

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

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

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

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

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

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

...