Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
экзамен СП.docx
Скачиваний:
13
Добавлен:
22.04.2019
Размер:
515.86 Кб
Скачать

33. Графическая подсистема Win32 (gdi) - общая характеристика, основные концепции, объекты (инструменты).

 Графическая подсистема

Х.1 Общие сведения

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

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

(Можно провести аналогию с BGI (Borland Graphics Interface) DOS-версий сред программирования – однотипным образом происходит инициализация и использование видеосистем различных типов. Но в Windows эта концепция развита дальше.)

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

В простейшем случае контекст (описатель контекста) может быть получен для любого окна (оконного элемента) с помощью функций:

HDC GetDC(HWND hWnd);

HDC GetWindowDC(HWND hWnd);

HDC GetDCEx(HWND hWnd, HRGN hrgnClip, DWORD dwFlags)

Стандартно GetDC и GetDCEx возвращают контекст клиентской области окна (т.е. без заголовка, рамки (border) и пр.). Контекст всего окна может быть получен GetWindowDC или GetDCEx с соответствующим флагом (см. ниже).

Регион – понятие, родственное границе окна и графическому изображению, может формироваться в том числе и путем отрисовки в контексте, задает границы области отсечения. Более подробно рассматривается ниже. Область отсечения региона обычно накладывается по И на область видимости окна, но возможны и более сложные варианты их комбинирования (см. ниже).

Варианты флагов:

DCX_WINDOW – дать контекст всего окна, т.е. включая системную область; DCX_CACHE – работать с контекстом из кэша, что повышает скорость выполнения; DCX_PARENTCLIP – использовать видимую часть родительского окна, т.е. фактически его контекст; DCX_CLIPCHILDREN – исключить (отсечь) подчиненные (порожденные) окна; DCX_SIBLING – исключить дочерние окна того же родительского окна; DCX_NORESETATTRS – не сбрасывать состояние контекста при его освобождении; DCX_LOCKWINDOWUPDATE – работать даже при включенном LockWindowUpdate; DCX_EXCLUDERGN – исключить заданный регион из области отсечения; DCX_INTERSECTRGN – использовать пересечение региона с областью отсечения; DCX_VALIDATE -- ?

При этом поведение функции зависит также от некоторых установок стиля оконного класса (см. выше):

– CS_CLASSDC – использовать единственный разделяемый контекст для всех окон данного класса (контекст класса);

– CS_OWNDC – использовать собственный контекст для каждого экземпляра окна;

– CS_PARENTDC – использовать контекст и регион отсечения родительского окна.

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

Функции CreateDC, CreateCompatibleDC.

Формат функций:

HDC CreateDC(

LPCTSTR lpszDriver, LPCTSTR lpszDevice, LPCTSTR lpszOutput,

CONST DEVMODE* lpInitData

);

HDC CreateCompatibleDC(HDC hPrimDC);

Действие функций: создание нового контекста, связанного с указанным устройством (CreateDC) или совместимого с известным контекстом (CreateCompatibleDC). Во втором случае если "образцовый" контекст не задан, то создается т.н. контекст в памяти (memory context), совместимый с текущими установками экрана.

Возвращаемое значение: описатель контекста или NULL.

Параметры:

lpszDriver – в Win 16 задавал имя драйвера устройства; в Win 32 может быть "DISPLAY" для контекстов, связанных с экраном, и NULL для всех других устройств, кроме того, в Windows NT может быть также имя принтера, обычно "WINSPOOL", в этих случаях остальные параметры должны быть NULL.

lpszDevice – логическое имя, под которым устройство известно в системе.

lpszOutput – имя устройства в файловой системе; в Win 32 не используется (равна NULL).

lpInitData – указатель на структуру DEVMODE с инициализирующими данными для устройства, или NULL если используются настройки по умолчанию.

hPrimDC – "образцовый" контекст, с которым будет совместим вновь создаваемый, если не задан (равен NULL), то подразумевается экран с текущими настройками.

Контексты "в памяти" обычно используются для временного (промежуточного) хранения и изображений. Для обеспечения работоспособности им необходимо предварительно явно задавать объект "битовый образ" (см. ниже), используемый в качестве "устройства отображения".

С одним устройством может быть связано несколько контекстов одновременно. Контексты при этом будут функционировать независимо, и их настройки будут оставаться индивидуальными, но реальное изображение будет комбинироваться из всех контекстов.

По окончании работы с контекстом он должен быть освобожден (закрыт). Для контекстов, полученных с помощью Get... используется функция ReleaseDC() (освобождает "общие" и оконные контексты). Для контекстов, созданных с помощью Create..., используется функция DeleteDC().

Формат функций:

int ReleaseDC(HWND hWnd, HDC hDC);

int DeleteDC(HDC hDC);

Возвращаемое значение: 1 при успешном завершении, 0 при ошибке.

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]