Опубликован: 15.11.2010 | Доступ: свободный | Студентов: 643 / 18 | Оценка: 4.00 / 5.00 | Длительность: 17:30:00
Специальности: Программист
Лекция 10:

Общие сведения о контексте GDI

< Лекция 9 || Лекция 10: 123 || Лекция 11 >

10.2.4. Контекст отображения для класса окна

В Microsoft Windows можно создать такой контекст отображения, который хранится отдельно в единственном экземпляре и используется всеми окнами, созданными на базе класса окна. При регистрации такого класса окна Вы должны в стилях окна указать стиль CS_CLASSDC:

wc.style = CS_CLASSDC;
Листинг 10.6.

Все окна, созданные на базе класса, будут использовать один общий контекст отображения. Зачем это нужно?… Вы можете использовать его в тех случаях, когда по соображениям производительности нежелательно вызывать настройку атрибутов вывода общего контекста отображения перед каждым его использованием. Эту настройку можно выполнить один раз. Каждый раз, когда функция окна получает контекст отображения класса окна (с помощью функций BeginPaint или GetDC ), в нём выполняется настройка только двух атрибутов - области ограничения и начала системных физических координат устройства. Остальные атрибуты остаются без изменений и, следовательно, не требуют повторной настройки;

10.2.5. Личный контекст отображения

Указав в стиле класса окна значение CS_OWNDC, можно добиться того, что для каждого окна, созданного на базе такого класса, операционная система Microsoft Windows создаст отдельную структуру памяти для контекста отображения. Этот контекст будет "жёстко привязан" к данному приложению Windows. Использовать такой контекст проще и безопаснее, однако при этом неэффективно расходуется оперативная память.

wc.style = CS_OWNDC;
Листинг 10.7.

10.2.6. Родительский контекст отображения

Этот контекст используется для дочерних окон. Он позволяет дочерним окнам "унаследовать" атрибуты контекста отображения у родительского окна. Например, дочернее окно может использовать для вывода текста тот же шрифт и цвета, что и родительское окно. Для использования родительского контекста перед регистрацией дочернего окна необходимо указать стиль CS_PARENTDC:

wc.style = CS_PARENTDC;
Листинг 10.8.

10.2.7. Контекст отображения для окна

Все описанные выше контексты позволяют рисовать только во внутренней области окна (client region). С помощью функции: GetWindowDC приложение может получить "общий контекст отображения", позволяющий рисовать в любом месте окна (например, в области заголовка окна, в области системного меню, рамки окна, кнопок изменения размера и т.п.). Освобождать такой контекст отображения необходимо функцией ReleaseDC (как и "общий контекст отображения").

Особенность данного контекста состоит в том, что в нём выбрана система координат, начало которой находится в левом верхнем углу окна (всего окна, а не его внутренней области).

Это контекст обычно используется при необходимости заменить стандартные элементы окна (заголовок, полосы просмотра и т.п.) на собственные элементы оформления (смотри, например, интерфейс проигрывателя Windows Media Player).

10.2.8. Контекст физического устройства

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

Для создания контекста устройства используется функция CreateDC. Её параметры:

  • LPCSTR lpszDriver - имя драйвера. Этот параметр является указателем на строку символов, содержащую имя драйвера, обслуживающего физическое устройство. Имя драйвера совпадает с именем файла "*.drv", содержащего сам драйвер и расположенный в системном каталоге Windows;
  • LPCSTR lpszDevice - имя устройства. Название самого устройства, описанного в системном реестре Windows;
  • LPCSTR lpszOutput - имя файла или порта вывода;
  • const void FAR *lpvInitData - данные для инициализации. Это поле указывает на структуру данных типа DEVMODE, используемую для инициализации устройства вывода. Если настройки наследуются из Control Panel (панели управления Windows), то данный параметр нужно устанавливать в NULL ;

Пример вызова функции CreateDC для принтера Epson FX-800, подключённого к порту LPT1 и работающему через драйвер epson9.drv:

Пример 10.1.

hdc = CreateDC( "epson9", "Epson FX-800", "LPT1:", NULL );

Созданный при помощи функции CreateDC контекст нужно удалить функцией DeleteDC:

BOOL WINAPI DeleteDC( HDC hdc );
Листинг 10.9.

Эта функция возвращает TRUE при нормальном завершении и FALSE при возникновении ошибки.

10.2.9. Информационный контекст

Если приложению необходимо получить информацию об устройстве вывода, оно может создать вместо обычного контекста информационный контекст. Информационный контекст нельзя использовать для рисования, но он занимает меньший объём оперативной памяти.

Информационный контекст создаётся при помощи функции CreateIC, аналогичной по параметрам с функцией CreateDC. После использования информационный контекст следует удалить, вызвав функцию: DeleteDC.

10.2.10. Контекст памяти

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

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

HDC WINAPI CreateCompatibleDC( HDC hdc );
Листинг 10.10.

Созданный таким образом контекст памяти удаляется функцией DeleteDC.

10.2.11. Контекст для метафайла

Контекст для метафайла позволяет записывать команды GDI в файл и затем "проигрывать" такой файл на физическом устройстве вывода. Файл может находиться в оперативной памяти или на диске, в последнем случае его можно использовать для перенаправления графического изображения в другое приложение.

Для создания контекста метафайла используется функция CreateMetaFile:

HDC WINAPI CreateMetaFile( LPCSTR lpszFileName );
Листинг 10.11.

Параметр lpszFileName должен указывать на строку, содержащую путь к файлу, или NULL. В последнем случае создаётся файл в оперативной памяти. После выполнения рисования в контексте метафайла его нужно закрыть, вызвав функцию CloseMetaFile:

HMETAFILE WINAPI CloseMetaFile( HDC hdc );
Листинг 10.12.

Эта функция закрывает метафайл для контекста hdc и возвращает идентификатор метафайла. Идентификатор закрытого метафайла использовать нельзя, так как он не содержит никакой полезной информации. Что же тогда с ним можно сделать:

  • Можно скопировать метафайл в обычный дисковый файл, вызвав функцию CopyMetaFile:
    HMETAFILE WINAPI CopyMetaFile( HMETAFILE hmf, LPCSTR lpszFileName );
    Листинг 10.13.
    Параметр hmf определяет метафайл, а параметр lpszFileName содержит путь к имени файла, куда будет записан метафайл
  • Можно "проиграть" метафайл в контексте отображения или контексте устройства, вызвав функцию PlayMetaFile:
    BOOL WINAPI PlayMetaFile( HDC hdc, HMETAFILE hmf );
    Листинг 10.14.
  • Наконец, при помощи функции DeleteMetaFile можно удалить метафайл из оперативной памяти (но не с диска!), вызвав функцию DeleteMetaFile:
    BOOL WINAPI DeleteMetaFile( HMETAFILE hmf );
    Листинг 10.15.
  • Для того чтобы воспользоваться метафайлом, хранящимся в виде дискового файла, его следует загрузить при помощи функции GetMetaFile, указав в качестве единственного параметра путь к соответствующему файлу:
    HMETAFILE WINAPI GetMetaFile( LPCSTR lpszFileName );
    Листинг 10.16.

10.3. Резюме определения контекста

Итак, с помощью этой лекции Вы разобрались со всем разнообразием и классификацией контекста отображения, научились "перенаправлять" контекст отображения на принтер или в файл, а также научились выделать и освобождать контексты отображений.

На данной лекции Вы познакомились с "основным инструментом" вывода и рисования на экране или устройстве информации средствами Windows API. Вы узнали, как рисовать содержимое главного окна Windows, как перенаправлять изображение на принтер (или другое устройство) или в метафайл. Также Вы убедились, что вывод содержимого в окно Windows нельзя производить "порциями", то есть по мере поступления информации. Приложение, созданное средствами WinAPI должно содержать в памяти компьютера всё своё состояние (данные, код, окружение), чтобы с помощью специальных функций оно могла вывести это состояние на экран, в файл, на принтер и т.п., используя соответствующие функции.

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

< Лекция 9 || Лекция 10: 123 || Лекция 11 >
Дмитрий Карпов
Дмитрий Карпов
Россия, Нижний Новгород
Олег Корсак
Олег Корсак
Латвия, Рига