Некоторые возможности графической подсистемы

Основные понятия

В операционной системе Windows для создания программ с использованием графики существует интерфейс программирования приложений API (Application programming interface).

Графическая информация в Windows обрабатывается в основном функциями GDI (Graphics Device interface), представляющими собой единый унифицированный интерфейс устройств (средств) отображения.

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

Все графические устройства отображения делятся на растровые и векторные устройства. Большинство устройств, подключаемых к ЭВМ – растровые, т.е. представляют графические образы как шаблон точек (видеоадаптеры, матричные и лазерные принтеры). Группа векторных устройств, отображающих графические образы с использованием линий, в основном состоит из плоттеров.

Контекст устройства

Работа GDI базируется на понятии контекст устройства (DC – device context), абстрагирующего свойства реальных устройств, к которым в первую очередь относятся экран, принтер и битовый образ в памяти. Контекст является внутренним объектом Windows, и доступ к нему осуществляется с помощью функций API. Контекст идентифицируется его описателем, имеющим тип HDC (handle DC). Практически каждой функции GDI необходим этот параметр.

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

Контекст сопоставляется системой с каждым изображаемым элементом (чаще всего – окном) и может быть получен прикладной программой, после чего можно обращаться к нему с единым набором функций, причем поведение контекста будет одинаковым независимо от того, с каким устройством он связан.

Примитивы GDI

Основные типы графических объектов часто называют «примитивами». К ним относятся:

– прямые (отрезки) и кривые; GDI поддерживает прямые линии, прямоугольники, эллипсы (включая окружности), дуги и сплайны Безье; более


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

– закрашенные области; если набор прямых и кривых линий ограничивает со всех сторон некоторую область, то она может быть закрашена с использованием кисти, выбранной в контексте устройства;

– битовые шаблоны (растровые шаблоны, растровые образы) – это двухмерный массив бит, соответствующий пикселам устройства отображения (базовый инструмент растровой графики); битовые образы используются для отображения сложных изображений (значки, курсоры мыши, кнопки панели инструментов);

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

Пример вывода текста

Чтобы легче было разобраться в некоторых аспектах работы с графикой в среде Windows, рассмотрим программу, создающую окно, в котором выводится текст «Hello, Windows !» [34].

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

#include

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

PSTR szCmdLine, int iCmdShow)

{

static char szAppName[] = "Hello" ;

HWND hwnd ;

MSG msg ;

WNDCLASSEX wndclass ;

wndclass.cbSize = sizeof (wndclass) ;

wndclass.style = CS_HREDRAW | CS_VREDRAW ;

wndclass.lpfnWndProc = WndProc ;

wndclass.cbClsExtra = 0 ;

wndclass.cbWndExtra = 0 ;

wndclass.hInstance = hInstance ;

wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);

wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);

wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);

wndclass.lpszMenuName = NULL ;

wndclass.lpszClassName = szAppName ;

wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION) ;

RegisterClassEx (&wndclass) ;

hwnd = CreateWindow (szAppName,

"First Example",

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT,

CW_USEDEFAULT,

CW_USEDEFAULT,

CW_USEDEFAULT,

NULL, NULL,

hInstance, NULL) ;

ShowWindow (hwnd, iCmdShow) ;

UpdateWindow (hwnd) ;

while (GetMessage (&msg, NULL, 0, 0)) {

TranslateMessage (&msg) ;

DispatchMessage (&msg) ;

}

return msg.wParam ;

}

LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)

{

HDC hdc ;

PAINTSTRUCT ps ;

RECT rect ;

switch (iMsg) DT_CENTER

return DefWindowProc (hwnd, iMsg, wParam, lParam);

}

В программе создается стандартное окно (рис. П 6.1), в центре рабочей области которого выводится текст «Hello, Windows !».

Это окно имеет все свойства Windows: можно захватить указателем мыши заголовок окна и перемещать его по всему экрану, можно изменить размеры окна, можно развернуть и увеличить его до размеров всего экрана, можно свернуть или завершить программу кнопкой закрытия окна.

Рис. П 6.1. Результат программы Hello

Рассмотрим действия данной программы.


9537425984324763.html
9537494259342627.html
    PR.RU™