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

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

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

Активное приложение имеет больший приоритет в использовании свободных ячеек системной палитры. Как правило, запрос активного приложения (точнее говоря, активного окна) на реализацию логической палитры выполняется полностью, так как перед реализацией все ячейки системной палитры (кроме 20 зарезервированных) отмечаются как свободные.

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

На рисунке показан процесс реализации логической палитры для активного окна.

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

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

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

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

Создание и выбор логической палитры

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

Структура LOGPALETTE и указатели на нее определены в файле windows.h:

typedef struct tagLOGPALETTE

{

palVersion;

 

WORD

 

WORD

palNumEntries;

PALETTEENTRY palPalEntry[1];

} LOGPALETTE;

PLOGPALETTE;

typedef LOGPALETTE*

typedef LOGPALETTE NEAR* NPLOGPALETTE; typedef LOGPALETTE FAR* LPLOGPALETTE;

Поле palVersion должно содержать значение 0x300.

В поле palNumEntries нужно записать размер палитры

(количество элементов в массиве структур PALETTEENTRY).

Сразу после структуры LOGPALETTE в памяти должен следовать массив структур PALETTEENTRY, описывающих содержимое палитры:

typedef struct tagPALETTEENTRY

{

BYTE peRed; BYTE peGreen; BYTE peBlue; BYTE peFlags;

} PALETTEENTRY;

Значения

Результат применения

поля

 

peFlags

В полях peRed, peGreen и peBlue находятся RGB-компоненты

NULL

 

цвета. В процессе реализации логической палитры для этого

 

элемента используется описанный нами ранее алгоритм.

PC_EXPLICIT

Младшее слово элемента палитры содержит индекс цвета в

 

системной палитре.

PC_NOCOLLAPS

В процессе реализации логической палитры данный элемент

E

будет отображаться только на свободную ячейку системной

 

палитры. Если же свободных ячеек нет, используется обычный

 

алгоритм реализации.

PC_RESERVED

Используется для анимации палитры с помощью функции

 

AnimatePalette. Анимация палитры позволяет динамически

 

вносить изменения в палитру. Такой элемент палитры после

 

реализации не подвергается изменениям при реализации других

После подготовки структуры LOGPALETTE и массива структур PALETTEENTRY приложение может создать логическую палитру, вызвав функцию CreatePalette :

HPALETTE WINAPI CreatePalette(const LOGPALETTE FAR* lplgpl);

В качестве параметра следует передать функции указатель на заполненную структуру LOGPALETTE.

Функция возвращает идентификатор созданной палитры или NULL при ошибке.

Созданная палитра перед использованием должна быть выбрана в контекст отображения. Выбор палитры выполняется функцией SelectPalette :

HPALETTE WINAPI SelectPalette( HDC hdc, HPALETTE hpal, BOOL fPalBack);

Функция выбирает палитру hpal в контекст отображения hdc, возвращая в случае успеха идентификатор палитры, которая была выбрана в контекст отображения раньше. При ошибке возвращается значение NULL.

Указав для параметра fPalBack значение TRUE, вы можете заставить GDI в процессе реализации палитры использовать

Реализация, использование и удаление палитры

Процедура реализации палитры заключается в вызове функции

RealizePalette :

UINT WINAPI RealizePalette(HDC hdc);

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

Если приложению нужно создать перо или кисть, определить цвет текста функцией SetTextColor или вызвать одну из функций, которой в качестве параметра передается переменная типа COLORREF, содержащая цвет, вы можете вместо макрокоманды RGB воспользоваться одной из следующих макрокоманд:

#define PALETTEINDEX (i) #define PALETTERGB (r,g,b)

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

Макрокоманда PALETTERGB имеет параметры, аналогичные знакомой вам макрокоманде RGB, однако работает по-другому. GDI просматривает системную палитру и подбирает из нее цвет, наилучшим образом соответствующий указанному в параметрах макрокоманды.

После использования палитры приложение должно обязательно ее удалить. Для удаления логической палитры лучше всего воспользоваться макрокомандой

DeletePalette :

#define DeletePalette(hpal)

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

Учтите, что как и любой другой объект GDI, нельзя удалять палитру, выбранную в контекст отображения. Перед удалением следует выбрать старую палитру, вызвав функцию SelectPalette.

Больше информации о палитрах:

http://www.frolov-lib.ru/books/bsp/v14/ch3.htm

Файлы в WinAPI

Файлами обычно называют взаимосвязанные блоки данных на запоминающем устройстве, обозначенные именем, а в Win32API файлами считают именованные каналы, ресурсы связи, дисковые устройства, потоки ввода или вывода на консоль или обычные файлы.

По принципу организации все эти типы файлов одинаковы, но отличаются друг от друга своими дополнительными свойствами и ограничениями.

Файловые функции Win32API позволяют приложениям получать доступ к файлам независимо от основопологающей файловой системы или типа устройства, однако предоставляемые при этом возможности зависят от файловой системы, устройства или операционной системы.

Создание и открытие файлов

Для создания и открытия файлов используют одну и ту же функцию – CreateFile().

Функция CreateFile создает или открывает каталог, физический диск, том, буфер консоли (CONIN$ или CONOUT$), устройство на магнитной ленте, коммуникационный ресурс, почтовый слот или именованный канал. Функция возвращает дескриптор, который может быть использован для доступа к объекту.

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