- •Лекция 10
- •Палитры
- •Цветовая палитра - это не более чем набор цветов, который используется для рисования.
- •Схематически системная цветовая палитра изображена на рисунке.
- •Выбор цвета без использования палитры
- •В файле windows.h определены также макрокоманды, извлекающие из переменной типа COLORREF, упакованной с
- •Для того чтобы узнать цвет той или иной системной компоненты экрана Windows, вы
- •COLOR_BTNTEXT
- •Вы можете создать приложение, изменяющее системные цвета. Для этого обратите внимание на функцию
- •Логические палитры
- •Первоначально в системной палитре 20 ячеек отмечены как занятые для статических цветов и
- •Фоновые приложения довольствуются теми свободными ячейками, что остались после реализации логической палитры активного
- •Допустим, что фоновое приложение реализует логическую палитру для своего окна. В его распоряжении
- •Создание и выбор логической палитры
- •Сразу после структуры LOGPALETTE в памяти должен следовать массив структур PALETTEENTRY, описывающих содержимое
- •После подготовки структуры LOGPALETTE и массива структур PALETTEENTRY приложение может создать логическую палитру,
- •Реализация, использование и удаление палитры
- •После использования палитры приложение должно обязательно ее удалить. Для удаления логической палитры лучше
- •Файлы в WinAPI
- •Создание и открытие файлов
- •HANDLE CreateFile (
- •dwShareMode – Определяет способ совместного доступа к объекту. Допустимые значения параметра:
- •dwFlagsAndAttributes - Атрибуты и флажки файла. Когда CreateFile открывает существующий файл, он объединяет
- •Пример: Открытие файла для записи
- •Чтение и запись в файлы
- •Функция ReadFile читает данные из файла, начиная с позиции, обозначенной указателем файла. После
- •Функция ReadFileEx читает данные из файла асинхронно. Она предназначена исключительно для асинхронных операций,
- •Функция WriteFile пишет данные в файл с места, обозначенного указателем позиции в файле.
- •Функция WriteFileEx пишет данные в файл. Она сообщает о своем состоянии завершения асинхронно,
- •Перемещение и замена файлов
- •Закрытие и удаление файлов
Первоначально в системной палитре 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$), устройство на магнитной ленте, коммуникационный ресурс, почтовый слот или именованный канал. Функция возвращает дескриптор, который может быть использован для доступа к объекту.