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


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

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

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

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

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

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

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

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