Рисование пользовательской кнопки в горячем или нажатом состоянии
Я создал пользовательский элемент управления кнопки. В основном один прямоугольник кнопки, но с двумя областями внутри прямоугольника, которые имеют другое поведение. По этой причине я хочу нарисовать горячее и нажатое состояние ТОЛЬКО для определенных областей, а не кнопку отверстия.
Мой текущий подход - рисование базовой кнопки с помощью ButtonRenderer.DrawButton(...)
с пустым текстом, нарисуйте горячее или нажатое состояние, если необходимо, и, наконец, отрисовку текста. Пока все хорошо, но как мне получить (градиент) цвета для горячего / нажатого состояния?
я пробовал SystemColors
, KnownColors
а также VisualStyleRenderer.GetColor(ColorProperty.XYZ)
но никто из них не подходит? Как я могу прочитать эти цвета из хост-системы?
РЕДАКТИРОВАТЬ:
Пример изображения ниже:
Я хочу, чтобы цвета как горячего, так и нажатого состояния кнопки - (светло) синий в случае этого скриншота win7. Если вы увеличите масштаб, вы увидите, что используется небольшой градиент цвета как в верхней, так и в нижней половине.
Последняя кнопка показывает, чего я хочу достичь.
Конечно, я мог бы извлечь цвета из скриншотов и жестко закодировать их или использовать изображения, как предложено, но это будет работать только для этой конкретной системы, не так ли?
1 ответ
Спасибо за ваши ответы, Джими.
Согласно принятому ответу на ваш связанный SO-вопрос я проверил ButtonBaseAdapter
а также ButtonStandardAdapter
, Как вы также упомянули, ButtonRenderer.DrawButton
звонки VisualStyleRenderer.DrawBackground
который вызывает нативный API UxTheme.DrawThemedBackground
нарисовать кнопку - определение цвета происходит внутри. Этот нативный вызов API также рисует границу кнопки, и поэтому я не могу его использовать.
Но я смог решить мою проблему необычным способом, но он работает.
Я отображаю оба соответствующих состояния (горячие и нажатые) на растровое изображение и извлекаю цвета, используя .GetPixel
, В OnPaint
я создаю LinearGradientBrush
-экземпляры из извлеченных цветов и рисовать эффект горячей / нажатой над определенными областями нормальной кнопки.
Это не совсем то же самое поведение, что и у обычной кнопки (для обоих состояний цвет границы также изменяется), но я думаю, что было бы очень странно, если бы я изменил цвет границы только для части кнопки (где эффект горячей / нажатой кнопки отображается), чтобы соответствовать нормальному поведению кнопки...
Если не появятся другие ответы или решения, я отмечу этот пост через несколько дней как ответ...