Контекст устройств. GDI, драйверы и устройства вывода., страница 7

Палитра по умолчанию обычно содержит 20 цветов, хотя это число может меняться от устройства к устройству. Если приложение запрашивает цвет, отсутствующий в этой палитре, Windows выбирает ближайшее совпадение в палитре или, в случае сплошной кисти, использует оттенки. Однако этого может быть недостаточно для "чувствительных" к цветам приложений.

В таком случае приложение может указать логическую палитру, чтобы заменить палитру по умолчанию. Логическая палитра может содержать несколько цветов (их количество ограничено значением SIZEPALETTE, возвращаемым функцией GetDeviceCaps). Логическая палитра создается при вызове функции CreatePalette, а ее цвета впоследствии можно изменять, с помощью функции SetPaletteEntries. Палитра выбирается в контекст устройства с помощью функции SelectPalette. Палитру, которая больше не нужна, можно удалить, вызвав функцию DeleteObject.

Перед использованием палитру необходимо реализовать посредством функции RealizePalette. В случае дисплея Windows палитра реализуется по-разному, в зависимости от того, является она палитрой переднего плана или палитрой фона. Палитру можно выбрать в качестве палитры фона, если окно, для которого она выбирается, является активным окном или потомком активного окна. В любой момент в системе может быть только одна палитра переднего плана. Критическим различием между ними является то, что палитра переднего плана может переопределить все нестатические цвета системной палитры. Для этого перед реализацией палитры переднего плана помечаются все неиспользуемые нестатические цвета.

При реализации палитры Windows заполняет все неиспользуемые элементы системной палитры элементами логической палитры. Если неиспользуемые элементы исчерпаны, то Windows помечает оставшиеся цвета логической палитры, используя ближайшие соответствующие цвета физической палитры или полутона. Windows всегда сначала реализует палитру переднего плана, за которой следуют оставшиеся палитры фона по принципу "первый пришел — первый обслужился".

Очень важно осознать, что любые изменения системной палитры являются в действительности глобальными, т.е. они влияют на поверхность экрана, а не только на окно приложения. Изменения системной палитры могут привести к перерисовке приложениями содержимого своих окон. Поэтому лучше определять палитру как палитру фона, что позволяет избежать изменения палитры, когда окно, для которого реализована палитра, получает или теряет фокус.

В Windows определены некоторые связанные с палитрой сообщения. Окно верхнего уровня получает сообщение WM_PALETTECHANGED, если Windows изменяет системную палитру. Перед тем, как окно верхнего уровня активизируется, оно получает сообщение WM_QUERYNEWPALETTE, позволяющее приложению реализовать свою палитру. Оно может сделать это, вызвав функции SelectPalette, UnrealizePalette и RealizePalette.

Интересную возможность предоставляет анимация палитры. Этот механизм использует периодическое изменение логической палитры для создания впечатления анимации. Для этой цели служит функция AnimatePalette.

Для гарантии того, что данный цвет из палитры выбран (что особенно важно в случае анимации палитры), приложения используют макросы PALETTEINDEX или PALETTERGB.

Объекты растровых изображений

Растровые изображения также обрабатываются как объекты GDI. Обычно приложение рисует на битовом изображении или передает его содержимое на устройство вывода.

Что представляет собой растровое изображение? С точки зрения его внешнего вида — это прямоугольный массив пикселов. Каждый пиксел имеет свой цвет, представленный одним или несколькими битами. Это число битов зависит от глубины цвета растрового изображения. Например, растровое изображение с глубиной цвета в 8 бит может представить до 256 цветов (28); растровое изображение с реальным цветом может представить до 16777216 цветов, используя 24 бита для одного пиксела.