Каков алгоритм или функция MFC для расчета яркости, тени и т. Д. Элементов управления? - PullRequest
0 голосов
/ 19 мая 2019

Я сделал ColorButton подкласс CButton, установив флаг BS_OWNERDRAW в стилях.

Он работает нормально: я могу установить его текст, фон и т. Д. И т. Д.

Однако я не хочу устанавливать второстепенные цвета вручную (выделение, тень и т. Д.). У меня есть эвристика, чтобы выбрать белый или черный для текста на основе фона.Я мог бы сделать то же самое для других второстепенных цветов, но мои формулы отличались бы от того, что делал бы Windows, если бы цвет был таким же, как фон, и, следовательно, выглядели бы странно.Итак:

Вопрос: есть ли способ узнать, что Windows вернула бы для GetSysColor(COLOR_BTNSHADOW) с заданным цветом фона?

Чтобы предвидеть ответ, я вижу CMFCButton позволяет настраивать цвета без создания целого подкласса.То, что я видел снова, позволяет микроуправлению настраивать каждый цвет, но не обладает способностью высокого уровня, которую я ищу.Я бы предпочел придерживаться своего решения, поскольку оно уже запущено и работает на XP и более поздних версиях.(Это бесплатная утилита, так что, кто знает, что могут иметь старые пользователи ОС.) Тем не менее, если есть решение CMFCButton, которое также может представлять интерес.

Ответы [ 2 ]

0 голосов
/ 22 мая 2019

Совсем не полный ответ, но пока цвет является монохромным (с равными компонентами RG и B):

  • цвет выделения 127 + значение канала / 2 (целочисленная математика)

  • цвет тени - значение канала / 3 * 2 (снова целочисленная математика)

Пример: фон с R, G,и значения B, равные 200, будут иметь выделение 227 и тень 132.

Для не серого фона, похоже, имеет место совсем другой расчет.Я получаю очень полезные результаты, просто используя вышеупомянутые формулы канал за каналом, но оригинальный вопрос не «что даст полезные результаты», а конкретно «что такое расчет Windows?»

В Windows также естьтемный цвет, который всегда равен 0x404040 для каждого цвета, который я пробовал.

0 голосов
/ 19 мая 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...