Системная палитра


Система поддерживает системную палитру (system palette) для каждого устройства, которое использует палитры. Системная палитра содержит в себе коды цвета для всех цветов, которые могут в текущий момент показываться на экране или рисоваться устройством. По-другому, а не через просмотр содержания системной палитры, приложения не могут обратиться к системной палитре непосредственно. И наоборот, система имеет полное управление системной палитрой и разрешает доступ только с помощью логических палитр.

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

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

Приложения могут модифицировать способ, которым отображаются индексы, устанавливая член peFlags структуры PALETTEENTRY в выбранные значения, когда создают логическую палитру. Например, флажок PC_NOCOLLAPSE предписывает системе немедленно скопировать затребованный цвет в неиспользуемую запись системной палитры независимо от того, содержит ли  уже запись системной палитры в себе этот цвет. Кроме того, флажок PC_EXPLICIT предписывает системе, чтобы отобразить индекс логической палитры в явно данном индексе системной палитры. (Приложение дает индекс системной палитры в младшем слове структуры PALETTEENTRY).

Палитры могут быть реализованы  или как фоновая палитра, или как палитра переднего плана, при помощи определения значений ИСТИНА (TRUE) или ЛОЖЬ (FALSE), соответственно, для параметра bForceBackground в функции SelectPalette. В системе одновременно может быть только одна палитра переднего плана. Если окно является в текущий момент активным окном или потомком активного окна, оно может реализовать палитру переднего плана. Иначе палитра реализуется как фоновая палитра независимо от значения параметра bForceBackground. Критическое свойство палитры переднего плана - то, что, когда она реализуется, то может переписать все записи (за исключением статических записей) в системной палитре. Система выполняет это, отмечая все записи, которые не являются статическими в системной палитре как неиспользуемые перед реализацией палитры переднего плана, таким образом устраняя все используемые записи. Никакой предварительной обработки для реализации фоновой палитры в системной палитре не происходит. Палитра переднего плана устанавливает все возможные нестатические цвета. Фоновые палитры могут установить только то, что остается открытым и расположено по приоритетам по принципу "первым пришел - первым обслужен". Как правило, приложения используют фоновые палитры для дочерних окон, которые реализуют свои собственные отдельные палитры. Это помогает минимизировать число изменений, которые происходят с системной палитрой.

Неиспользуемая запись системной палитры - эта любая запись, которая не сохранена и не содержит статический цвет. Зарезервированные записи явно отмечены значением PC_RESERVED. Эти записи создаются, когда приложение реализует логическую палитру для анимации палитрой. Записи статического цвета создаются системой и соответствуют цветам в палитре по умолчанию. Функция GetDeviceCaps может использоваться, чтобы извлечь значение NUMRESERVED, которое определяет число записей системной палитры, сохраненных для статических цветов.

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

 

Назад в оглавление
На главную страницу

Hosted by uCoz