Логическая палитра
логическая палитра — это цветовая палитра, которую приложение создает и связывает с заданным контекстом устройства. Логические палитры позволяют приложениям определять и использовать цвета, соответствующие конкретным потребностям. Приложения могут создавать любое количество логических палитр, используя их для отдельных контекстов устройств или переключения между ними для одного контекста устройства. Максимальное количество палитр, которые может создавать приложение, зависит от ресурсов системы.
Приложение создает логическую палитру с помощью функции CreatePalette. Приложение заполняет структуру LOGPALETTE, которая указывает количество записей и значения цвета для каждой записи, а затем приложение передает структуру CreatePalette. Функция возвращает дескриптор палитры, который приложение использует во всех последующих операциях для идентификации палитры. Чтобы использовать цвета в логической палитре, приложение выбирает палитру в контекст устройства с помощью функции SelectPalette, а затем реализует палитру с помощью функции RealizePalette. Цвета в палитре доступны сразу после реализации логической палитры.
Приложение должно ограничить размер логических палитр до достаточного количества записей, чтобы представить необходимые цвета. Приложения не могут создавать логические палитры, превышающие максимальный размер палитры, значение, зависящее от устройства. Приложения могут получить максимальный размер с помощью функции GetDeviceCaps, чтобы получить значение SIZEPALETTE.
Хотя приложение может указать любое значение цвета для заданной записи в логической палитре, не все цвета могут быть созданы заданным устройством. Система не предоставляет способ обнаружения поддерживаемых цветов, но приложение может обнаружить общее количество этих цветов, извлекая разрешение цветов устройства. Разрешение цвета, указанное в битах цвета на пиксель, равно значению COLORRES, возвращаемого функцией GetDeviceCaps. Устройство с разрешением цвета 18 имеет 262 144 возможных цвета. Если приложение запрашивает цвет, который не поддерживается, система выбирает соответствующее приближение.
После создания логической палитры приложение может изменить цвета в палитре с помощью функции SetPaletteEntries. Если выбрана логическая палитра и реализована, изменение палитры не сразу влияет на отображаемые цвета. Приложение должно использовать функции UnrealizeObject и RealizePalette для обновления цветов. В некоторых случаях приложению может потребоваться отменить выбор, нереализировать, выбрать и реализовать логическую палитру, чтобы убедиться, что цвета обновляются точно так же, как запрашивается. Если приложение выбирает логическую палитру в несколько контекстов устройства, изменения в логической палитре влияют на все контексты устройства, для которых он выбран.
Приложение может изменить количество записей в логической палитре с помощью функции ResizePalette. Если приложение уменьшает размер, остальные записи не изменяются. Если приложение расширяет размер, система задает цвет для каждой новой записи черным (0, 0, 0, 0) и флагом до нуля.
Приложение может получить значения цвета и флага для записей в заданной логической палитре с помощью функции GetPaletteEntries. Приложение может получить индекс для записи в заданной логической палитре, которая наиболее тесно соответствует указанному значению цвета с помощью функции GetNearestPaletteIndex.
Если приложению больше не нужна логическая палитра, она может удалить ее с помощью функции DeleteObject. Приложение должно убедиться, что логическая палитра больше не выбрана в контексте устройства перед удалением палитры.