Изменение системной палитры для устройства отображения может иметь драматическое и иногда нежелательное воздействие на цвета, используемые в окнах на рабочем столе. Чтобы минимизировать воздействие этих изменений, система обеспечивает ряд сообщений, которые помогают приложениям управлять их логическими палитрами, гарантируя, что цвета в активном окне являются насколько возможно близкими к предназначенным цветам.
Система отправляет сообщение WM_QUERYNEWPALETTE верхнего уровня или перекрывающему окну как раз перед активизацией окна. Это сообщение дает приложению возможность выбрать и реализовать его логическую палитру так, чтобы оно получило возможно лучшее отображение цветов для своей логической палитры. Когда приложение получает это сообщение, оно должно использовать функции SelectPalette, UnrealizeObject и RealizePalette, чтобы выбрать и реализовать логическую палитру. Такое действие предписывает системе обновить цвета в системной палитре так, чтобы эти цвета соответствовали, насколько возможно, цветам в логической палитре.
Когда приложение становится причиной изменений системной палитры в результате реализации его логической палитры, система отправляет сообщение WM_PALETTECHANGED всем верхнего уровня и перекрывающим окнам. Это сообщение дает приложениям возможность обновить цвета в рабочих областях своих окон, заменяя цвета, которые изменились, цветами, которые наиболее близко подобраны к планируемому цвету. Приложение, которое получает сообщение WM_PALETTECHANGED, должно использовать функции UnrealizeObject и RealizePalette, чтобы возвратить в исходное положение логические палитры, связанные со всеми неактивными окнами и затем модернизировать цвета в рабочей области для каждого неактивного окна при помощи использования функции UpdateColors. Эта техника не гарантирует самое большое число точных подборов цвета; однако, она действительно гарантирует, что цвета в логической палитре отображаются корректными цветами системной палитры.
Обратите внимание! на то, чтобы избежать создания бесконечного цикла, приложение никогда не должно реализовывать палитру для окна, дескриптор которого соответствует дескриптору переданному в параметре wParam сообщения WM_PALETTECHANGED. |
Функция UpdateColors обычно обновляет рабочую область неактивного окна быстрее, чем перерисовку области. Однако, поскольку функция UpdateColors выполняет преобразование цвета, основанное на цвете каждого пикселя прежде, чем системная палитра изменилась, каждый вызов этой функции приводит к потере некоторой точности передачи цвета. Это означает, что UpdateColors не может использоваться, чтобы обновлять цвета, когда окно становится активным. В таких случаях, приложение должно перерисовывать рабочую область.
Система может отправить сообщение WM_QUERYNEWPALETTE, когда происходят изменения логической палитры. Кроме того, система может отправить сообщение WM_PALETTEISCHANGING всем верхнего уровня и перекрывающим окнам, когда системная палитра собирается измениться.