Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2 курс / Лекции / Лекция 10.pptx
Скачиваний:
59
Добавлен:
18.02.2023
Размер:
174.74 Кб
Скачать

Лекция 10

Палитры.

Работа с файлами в WinAPI

Палитры

В операционной системе Windows приложения определяют цвет, задавая интенсивности трех его RGB-компонент: красной (R), зеленой

(G) и голубой (B). Интенсивность каждой компоненты задается числом в диапазоне от 0 (минимальная интенсивность) до 255 (максимальная интенсивность). Такая система позволяет приложению указать любой из 16,777,216 цветов (256*256*256 = 16,777,216).

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

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

Цветовая палитра - это не более чем набор цветов, который используется для рисования.

В GDI встроены средства для работы с 256-цветными палитрами. Если видеоконтроллер способен работать с палитрами, создается одна системная палитра, которая содержит отображаемые на экране цвета.

Часть системной палитры (20 элементов) зарезервированы для использования операционной системой. В зарезервированных элементах хранятся статические цвета, которые нужны для рисования таких объектов, как рамки окон, полосы просмотра и т.п., а также изображений, рисуемых приложением. Если видеоконтроллер работает в режиме низкого цветового разрешения (16 цветов) или приложение не использует цветовые палитры (несмотря на наличие соответствующих возможностей аппаратуры), цветовая гамма приложения ограничена статическими цветами.

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

Схематически системная цветовая палитра изображена на рисунке.

Странное на первый взгляд расположение статических цветов в системной палитре (десять цветов находятся в начале таблицы, десять - в конце) выбрано для обеспечения правильной работы часто используемой растровой операции "ИСКЛЮЧАЮЩЕЕ ИЛИ".

Выбор цвета без использования палитры

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

В простейшем случае цвет можно определить с помощью макрокоманды RGB , комбинирующей цвет из отдельных компонент:

#define RGB(r,g,b)

Эта макрокоманда упаковывает отдельные цветовые компоненты в двойное слово, причем (что важно) старший байт этого слова должен быть равен нулю. На рисунке отображено представление цвета, полученное с помощью макрокоманды RGB.

В файле windows.h определены также макрокоманды, извлекающие из переменной типа COLORREF, упакованной с помощью макрокоманды RGB, отдельные цветовые компоненты:

#define GetRValue (rgb) #define GetGValue (rgb) #define GetBValue (rgb)

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

Функция GetNearestColor возвращает для запрошенного логического цвета clrref физический цвет, составленный только из компонент чистого цвета:

COLORREF WINAPI GetNearestColor(HDC hdc, COLORREF clrref);

Через параметр hdc необходимо передать идентификатор контекста отображения.

Для того чтобы узнать цвет той или иной системной компоненты экрана Windows, вы можете вызвать функцию GetSysColor :

COLORREF WINAPI GetSysColor(int nDspElement);

В качестве единственного параметра следует передать этой

функции идентификатор компоненты:

Компонент

Описание

COLOR_ACTIVEBORDER

Рамка вокруг активного окна

COLOR_ACTIVECAPTION

Заголовок активного окна

COLOR_APPWORKSPACE

Фон окна приложения MDI (приложение,

использующее многооконный интерфейс)

 

COLOR_BACKGROUND

Окно Desktop

COLOR_BTNFACE

Кнопка

COLOR_BTNHIGHLIGHT

Выбранная кнопка

COLOR_BTNSHADOW

Тень, "отбрасываемой" кнопкой

COLOR_BTNTEXT

Текст надписи на поверхности кнопки

 

 

COLOR_CAPTIONTEXT

Текст заголовка окна, кнопки изменения

размера, кнопки полосы просмотра

 

 

 

COLOR_GRAYTEXT

Текст серого цвета

 

 

COLOR_HIGHLIGHT

Фон выбранного элемента в органе

управления

 

 

 

COLOR_HIGHLIGHTTEXT

Текст для выбранного органа управления

 

 

COLOR_INACTIVEBORDER

Рамка вокруг неактивного окна

 

 

COLOR_INACTIVECAPTION

Заголовок неактивного окна

 

 

COLOR_INACTIVECAPTIONTEXT

Текст заголовка для неактивного окна

 

 

COLOR_MENU

Фон меню

 

 

COLOR_MENUTEXT

Текст меню

 

 

COLOR_SCROLLBAR

Полоса просмотра

 

 

COLOR_WINDOW

Фон окна

 

 

COLOR_WINDOWFRAME

Рамка окна

 

 

COLOR_WINDOWTEXT

Текст в окне

 

 

Вы можете создать приложение, изменяющее системные цвета. Для этого обратите внимание на функцию SetSysColors :

void WINAPI SetSysColors( int cDspElements,

const int FAR* lpnDspElements,

const COLORREF FAR* lpdwRgbValues);

cDspElements - определяет количество элементов, для которых изменяются цвета;

lpnDspElements - указатель на массив идентификаторов элементов изображения, список которых приведен выше;

lpdwRgbValues - указатель на массив из cDspElements элементов, содержащих новые значения для цветов. Его необходимо подготовить еще перед вызовом функции.

Внесенные изменения сохраняются только до очередного перезапуска операционной системы Windows.

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

Стоит отметить, что использовать данную функцию НЕ РЕКОМЕНДУЕТСЯ.

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

Любое приложение может создать свою собственную палитру цветов в виде массива размером до 256 элементов, содержащего данные типа PALETTEENTRY, которые могут хранить RGB-цвета или номера цветов в системной палитре.

Подготовив массив, содержащий цвета, приложение может создать логическую палитру , вызвав функцию CreatePalette. Затем палитру нужно выбрать в контекст отображения функцией SelectPalette. Так как на экране могут отображаться только цвета, находящиеся в системной палитре, в процессе реализации палитры приложение должно перенести (или отобразить) цвета из логической палитры в системную палитру, вызвав функцию RealizePalette. Последний шаг называется реализацией палитры .

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

Соседние файлы в папке Лекции