Палитры и согласование цветов, страница 2

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

Логическая палитра

Логической палитрой является цветовая палитра, которая создается в приложении и закрепляется за контекстом устройства. Логические палитры позволяют приложениям определять и использовать в приложениях цвета, которые отвечают конкретным потребностям. В приложениях можно создавать любое число логических палитр, используя их для разных контекстов устройства или переключаясь между ними в одном контексте устройства. В приложении логическая палитра создается с использованием функции CreatePalette.

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

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

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

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

Сообщение WM_PALETTECHANGED отправляется всем окнам, когда одно из приложений реализует свою логическую палитру. Неактивные окна это сообщение информирует о том, что какие-то цвета могли быть заменены другим окном, имеющим фокус ввода. Функция UpdateCoIors позволяет эффективно реагировать на новый состав палитры. В примере, демонстрирующем применение функции UpdateCoIors, показана обычная логика обработки сообщений WM_PALETTECHANGED и WM_QUERYNEW-PALETTE.

Перед использованием функций палитры в приложении необходимо проверить возможности физических аппаратных средств. Функция GetDeviceCaps предоставляет информацию о возможностях аппаратного устройства. В частности, необходимо проверять значение бита RC_PALETTE индекса RASTERCAPS, чтобы узнать, поддерживается ли смена палитры. Индекс NUMCOLORS возвращает число цветов, которые могут быть показаны одновременно.