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