Окт 16

Основные принципы управления палитрами

Цветовая палитра представляет собой таблицу (массив) цветов, которые способно воспроизвести устройство. Вход в таблицу для доступа к каждому цвету осуществляется по индексу.
В Win32 GDI используется несколько типов палитр.
Системная палитра {system palette) определяет все цвета, которые могут быть одновременно отображены устройством. Диапазон цветов зависит от аппаратной палитры, реализуемой видеоадаптером, и от настроек экрана. В любом случае системная палитра является неким «программным представителем» аппаратной палитры. Приложение не может непосредственно модифицировать системную палитру. Системная палитра обычно содержит 256 элементов (входов), из которых 20 зарезервировано для так называемых статических цветов, которые никогда не изменяются. Эти цвета используются всеми приложениями для вывода меню, кнопок, фона окна, текстовых надписей и других элементов стандартного интерфейса.
Логическая палитра (logical palette) — это палитра уровня приложения. Она создается приложением и закрепляется за контекстом устройства. Логическая палитра позволяет определять и использовать цвета, которые соответствуют потребностям приложения. После создания логической палитры с помощью функции CreatePalette или CreateHalftonePalette она должна быть реализована вызовом функции ReaHzePalette. В процессе реализации Windows заполняет неиспользуемые элементы в системной палитре цветами из логической палитры. Если неиспользованных элементов меньше, чем нужно, то Windows распределяет оставшиеся цвета из логической палитры, либо подыскивая ближайший цвет в аппаратной палитре, либо определяя подходящее смешение (dithering) цветов, если применяются сплошные кисти.
Для успешного применения логической палитры нужно учесть еще один нюанс, о котором в MSDN практически ничего не говорится. Во всех функциях, требующих передачи аргумента типа COLORREF, соответствующее значение должно быть определено с помощью макроса PALETTERGB, а не при помощи макроса RGB.
Если приложение явно не создает логическую палитру, то используется палитра по умолчанию (default palette), содержащая только те 20 цветов, которые имеются в системной палитре. В этом случае для аппроксимации цвета, отсутствующего в палитре, будут использоваться указанные 20 цветов.
Чтобы обеспечить одновременную работу нескольких приложений, использующих различные логические палитры, Windows предоставляет активному окну1 приоритет в установлении цветов для логической палитры. Неактивным окнам приходится пользоваться оставшимися цветами. Неактивные окна используют все незадействованные элементы в логической палитре и применяют ближайшие согласованные цвета для всех невыполненных запросов к палитре. Однако эта проблема обычно не очень существенна, поскольку в большинстве приложений используются только системные цвета.
Для координации функционирования активных и неактивных окон при работе с палитрами, прежде чем предоставить фокус ввода приложению, которое использует логическую палитру, Windows отправляет ему сообщение WM_QUERYNEWPALETTE. Это сообщение дает возможность приложению еще раз реализовать палитру и восстановить цвета, которые могли быть изменены другими приложениями, пока окно было неактивным.
Сообщение WM_PALETTECHANGED отправляется всем окнам, когда одно из приложений реализует свою логическую палитру. Для неактивных окон это сообщение несет информацию о том, что некоторые цвета в палитре могли быть изменены другим окном, имеющим фокус ввода.