Состав и назначение GDI
Графический интерфейс в MS WINDOWS
Графический интерфейсе GDI (Graphicс Device Interface - интерфейс графических устройств, посредством этого интерфейса Windows выводит графику на экран монитора, принтер и другие устройства. GDI избавляет программиста учитывать многие аппаратные особенности компьютеров, например, особенности различных видеокарт. Рисование, с использованием GDI, имеет как положительные так и отрицательные стороны. К положительным сторонам можно отнести переносимость программ, в том числе и на различные платформы. С дугой стороны GDI является довольно «толстой» прослойкой, поэтому программы, использующие GDI, работают медленно.
Альтернативой GDI является графические библиотеки DirectDraw, OpenGL. Это довольно тонкие прослойки между приложением и видеокартой, что существенно сказывается на скорости работы. Кроме того эти библиотеки обладает еще целым рядом достоинств по сравнению с GDI.
Некоторые предупреждения
Приложения Windows не работают непосредственно с физическими устройствами (например, с монитором или принтером). Выполняя запрос приложения (нарисовать линию или написать текст), приложение обращается к GDI, которое, в свою очередь, обращается к соответствующему драйверу, а тот, непосредственно к физическому устройству. В процессе выполнения команды GDI (или драйвер) учитывают ограничения, накладываемые соответствующим физическим устройством. Например, приложение может использовать любой из примерно 16 миллионов цветов, но если данное устройство не поддерживает такого количества цветов, то GDI будет подбирать наиболее близкие цвета, в этом случае многие нарисованные приложением линии могут оказаться одного цвета.
Примерно такая же ситуация может сложиться и со шрифтами. Программист может описать в приложении характеристики необходимого шрифта. GDI подберет наиболее подходящий (по его мнению ) и выведет его на экран. В результате Вы получите отображение не того шрифта, который хотели бы видеть.
На первый взгляд, это может показаться неудобным моментом, тем не менее, именно так можно обеспечить полную аппаратную независимость, и освобождает пользователя от непосредственной работы с конкретным физическим устройством.
Состав и назначение GDI
GDI, с точки зрения программиста - это контекст отображения. Контекст отображения можно сравнить с листом бумаги на котором приложение рисует, а также инструментом для рисования. Инструменты для рисования - это перья, кисти (а также шрифты и целые графические изображения), с помощью которых приложение создаст необходимый рисунок. Кроме контекста отображения (листа бумаги) и инструмента для рисования, приложению доступны десятки функций программного интерфейса GDI.
Если же говорить точно, то контекст отображения является структурой данных, описывающих устройство отображения. В этой структуре хранятся различные характеристики устройства (бумаги) и набор инструментов для рисования, выбранные по умолчанию. Приложение может выбрать в контекст отображения различные инструменты (например, перья различной толщины и цвета). Поэтому, если Вам необходимо нарисовать линию красного цвета, то перед выполнением операции рисования, необходимо выбрать в контекст отображения соответствующее перо.
Функции рисования не имеют параметров, указывающих цвет и толщину линий. Такие параметры хранятсяв контексте отображения.
Приложение может создать контекст отображения не только для экрана монитора, но и для любого другою графического устройства, например, для принтера. В этом случае, оно может рисовать на принтере различные изображения, используя те же функции, что и при рисовании на экране. Можно создать контекст отображения для метафайла. Метафайл - это обычный файл на диске или в памяти, в котором хранятся последовательности команд интерфейса GDI. Приложение может выполнить вывод графической информации в метафайл, как в обычное устройство вывода, а затем «проиграть» метафайл на реальном устройстве вывода (экран монитора или принтер).
5.3 Контекст отображения и контекст устройства. Атрибуты контекста отображения.
Опишем более подробно, что такое «лист бумаги», на которой приложение рисует, то есть контекста отображения.
Может существовать два типа контекста: контекст отображения и контекст устройства,
Если приложению необходимо выполнить вывод в одно из своих окон, то оно должно получить контекст для отображения в этом окне. Такой контекст - носит название контекста отображения. С его помощью можно рисовать только в клиентской части окна.
Если же требуется выполнить вывод на экран монитора или принтер, то приложение, перед выполнением операции вывода, должно создать контекст физического устройства или просто контекст устройства (монитора или принтера).
Необходимо иметь в виду, что оба контекста представляют собой одну и ту же структуру.
Всего контекст отображения (структура) имеет 20 атрибутов. Это:
1. описание применяемой системы координат;
2. цвет графических объектов и цвет фона;
3. описание цветовой палитры (набора цветов используемых для рисования);
4. описание пера для рисования линий;
5. описание кисти для закрашивания;
6. описание области, где приложение может рисовать, или наоборот, области, в которой рисовать запрещено;
7. атрибуты, предназначенные для рисования текста (это шрифт и цвет текста, расстояние между буквами, а также цвет текста).
Когда приложение получает контекст, то все перечисленные атрибуты устанавливаются по умолчанию, но Вы можете изменить их по своему усмотрению.
5.4 Работа с контекстами
Всего существует около 10 различных контекстов отображения. Чаще всего используется общий контекст отображения.
5.4.1 Общий контекст отображения
Если обрабатывается сообщениеWM_PAINT. то для получения общего контекста отображения необходимо вызвать функцию BeginPaint, возвращающую этот контекст:
HDC BeginPalnt(
HWND hWnd, II дескриптор окна
LPPAINTSTRUCT *lрРаint II указатель на структуру для рисования );
Функция подготавливает для рисования окно, заполняя структуруPAINTSTRUCT информацией, которую можно использовать в процессе рисования.
Контекст отображения, полученный с помощью функцииBeginPaint, необходимо освободить перед завершением обработки сообщенияWM_PAINT, вызвав функциюEndPaint.
BOOL EndPaint(
HWND hWnd, II дескриптор окна
CONST PAINTSTRUCT *lpPaint II указатель на структуру для рисования );
Обработчик сообщений WM_PAINT выглядит следующим образом:
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc;
// Получаем общий контекст отображения
hdc= BeginPaint(/nwnd, &ps);
Text0ut(hdc, 10, 20, "String",6);
// Отдаем контекст отображения EndPaint(hwnd, &ps);
return 0;
}
Функции BeginPaint и EndPaint можно использовать только в обработчике сообщенийWM_PAINT. Если же приложению необходимо рисовать во время обработки других сообщений, то необходимо использовать функции соответственно:
HDC GetDC(
HWND hWnd //дескриптор окна
);
И
Int ReleaseDC(
HWND hwnd, // дескриптор окна
HDC hdc II дескриптор контекста отображения ){
5.4.2 Контекст физического устройства
Нет разницы между рисованием в окне или рисование на принтере. Просто перед рисованием на принтере необходимо создать контекст принтера. Обратите внимание - контекст физического устройства не получается, а создается. С этой целью используется функцияCreateDC.
HDC CreateDC(
LPCSTR lp4:Driver, II имя драйвера
LPCSTR lps:De\'ice, II имя устройства
LPCSTR 1рч:0шри1, II имя файла или порта вывода
CONST DEVMODE *lpvlnitDala II данные для инициализации принтера
);
Например, для создания контекста отображения струйного принтера Lexmark 1020 ColorFine 2, работающего с
драйвером wwlxru.drv и подключенного к порту LPT1, необходимо вызвать функцию CreateDC следующим образом:
hdc = CreateDC( "wwlxru", "Lexmark 1020 ColorFine 2 ", ''LPT1". NULL);
Созданный таким образом контекст устройств необходимо удалить (но не освободить) при помощи функции DeleteDC:
BOOL DeleteDC (
HDC hdc II дескриптор контекста отображения
);
5.4.3 Контекст для устройства DISPLAY
Что бы рисовать в любом месте экрана, необходимо создать контекст монитора:
Hdc = -CreateDC("DISPLAY", NULL, NULL, NULL);
После использования контекста, его необходимо удалить, вызвав функциюDeleteDC.
Для монитора контекст физического устройства можно не только создать, но и получить, вызвав функцию GetDC:
hdc = GetDC{NULL);
Этот контекст нужно не удалять, • освобождать:
ReleaseDC( NULL, hdc );
5.4.4 Контекст для памяти
Чаще, значительно приятнее для пользователя, когда изображение рисуется в памяти, а затем быстро отображается на экране монитора.
Контекст для памяти создается совместимым с тем контекстом отображения, в котором будет выполняться вывод на физическое устройство. Для этих целей служит функция CreateCompatibleDC:
Дата добавления: 2017-01-26; просмотров: 1518;