Поделиться через


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

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

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

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

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

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

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

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