Могут ли логические палитры использоваться вместо системной палитры? - PullRequest
0 голосов
/ 29 марта 2011

В одном из наших приложений мы хотим использовать пользовательские цвета и по существу игнорировать стандартную палитру окон в ряде случаев (например, для WindowText установите значение Blue, а не Black).Я думал сделать это просто создать логическую палитру и применить ее к приложению, используя SelectPalette и RealizePalette, но я не могу найти хороших примеров их использования.Это возможно сделать?

Ответы [ 3 ]

3 голосов
/ 29 марта 2011

То, что вы запрашиваете, будет обратным к GetStockObject (хорошо, строго говоря, есть еще несколько функций, которые принимают индекс типа GetSysColor, который также будет актуален). Однако, нет такой функции, которая устанавливает их для каждого процесса (если вы не хотите использовать SetSysColors для всей системы, что, по-видимому, исключает ваш вопрос). Лучше всего - и проще всего - было бы перехватить эти функции внутри вашего процесса (Windows выполняет за вас часть копирования при записи, так что перехватить ее внутри памяти, занятой gdi32.dll) и вернуть ваши собственные объекты (кисти, шрифты, ручки, цвета). Постарайтесь очистить объекты GDI после завершения работы приложения. Это будет именно то, что вы просите, но не обязательно самый простой способ добиться эффекта в Delphi. Редактировать: Дэвид Хеффернан отметил, что предложение о подключении не учитывает темы. Он прав. Так что, возможно, это не лучший способ.

Однако, учитывая, что вы используете Delphi, может быть проще всего получить классы VCL, которые вы хотите настроить (практично как для элементов управления, так и для форм). В качестве альтернативы вы можете использовать RTTI для перебора элементов вашей формы и изменения элементов по мере необходимости (единообразно и по типу элемента управления).

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

В любом случае: обратите внимание, что удобство использования и UX (пользовательский опыт) приложений обычно лучше, если приложение использует знакомые элементы управления, стили, цвета ...

2 голосов
/ 29 марта 2011

Почему вы должны использовать палитры в эти дни?Просто используйте значения RGB по своему усмотрению.

Палитры датируются днями 8-битных (и более низких) цветовых устройств.Теперь, когда мы все перешли на 16-битный цвет и совсем недавно 32-битный цвет они стали реликвией.

1 голос
/ 30 марта 2011

Том, то, что вы просите, может быть легче сделано для некоторых элементов управления в VCL, чем для других. Для более тщательного решения вы можете быть заинтересованы в создании тематики или скинов для Delphi. Это поможет вам добиться не только пользовательских цветов, но и полностью индивидуального оформления.

Для Delphi существует множество систем создания тем и скинов. Подход, о котором вы говорите (то, что вы называете «логическими палитрами», на самом деле является системной цветовой схемой Windows), сводится к подключению функции Windows GetSysColor и работает не так хорошо, как вы надеетесь.

Вместо этого попробуйте полное решение: Скины (ссылка показана для SpTbxLib скинов) enter image description here

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

...