dt=Text Лекция 10 0 Общие сведения о контексте GDI Содержание 10.00. Аннотация. 10.01. Определение контекста отображения и устройства 10.02. Правила работы с контекстом 10.03. Резюме определения контекста 10.04. Вопросы и упражнения. 10.05. Г Л О С С А Р И Й 10.06. Приложение №1 5P9i0s8y19Z dt=Text 10.00. Аннотация. 1 На лекции описываются типы контекста отображения, правила их использования и функции для работы с разными типами контекстов. Описывается, почему надо обязательно закрывать контекст после его использования в операциях ввода-вывода. 5P9i0s8y19Z dt=Text 10.01. Определение контекста 1 отображения и устройства GDI – основные понятия. Интерфейс графических устройств операционной системы Microsoft Windows (в дальнейшем – просто GDI) предназначено для взаимодействия приложений Windows с графическими устройствами ЭВМ. Использование такого «промежуточного уровня» между приложением Windows и устройством позволяет решить следующие проблемы: 1. Средствами GDI можно вывести любой текст, изображение, форматирование на любое устройство ЭВМ, которое при подключении к операционной системе Windows имеет для неё собственный драйвер. Следовательно, единообразно можно вывести информацию на любое устройство: принтер, монитор, графопостроитель, в локальную или глобальную сеть, не занимаясь «прямым программированием устройств» (как это Вам пришлось осуществлять бы в MS-DOS); 2. Средствами GDI осуществляется вывод не на физическое, а на «логическое» устройство. Это значит, что Вы, например, можете задать вывод картинки с 16 млн. цветов на монитор, поддерживающий только 256 цветов. Вывод изображения на «логический монитор» средствами GDI будет производиться единообразно, будут задействованы все 16 млн. цветов. Однако драйверы видеокарты и монитора учтут свои ограничения на имеющийся цветовой диапазон, и «автоматически» преобразуют картинку с 16 млн. цветами в картинку с 256 цветами. Драйвер принтера вообще преобразует эту картинку в двухцветное изображение, напечатав полутона в виде растра («мозаики»); 3. Имея параметры физических устройств, подключённых ЭВМ, «ниже среднего уровня», Вы, тем не менее, можете создавать программы для любых «продвинутых устройств» ЭВМ, отсутствующих на Вашем компьютере. Более того, Вы можете осуществлять программирование устройств, ещё не созданных для данных ЭВМ – необходимо только, чтобы эти устройства были, во-первых, совместимые с ЭВМ на аппаратном уровне, а во-вторых, разработка их драйверов должна укладываться в стандарты, по которым создаются драйверы для указанного семейства устройств и стандартами Microsoft в написании драйверов к операционной системе Windows; 4. Такая ситуация, когда приложение запрашивает у Windows одно, а получает другое, возникает не только при работе с цветом. Приложение может запросить для вывода шрифт, описав его характеристики, а GDI подберёт к выводу наиболее подходящий (с его точки зрения) шрифт, соответствующий описанию, и предоставит его приложению для вывода. Вначале такой подход обескураживает, но затем Вы начинаете понимать, что такой способ является единственным способом заставить работать программу Windows на любом оборудовании, любой аппаратной части. В самом деле, шрифтом, которым выводятся данные на экран, часто нельзя выводить данные на принтер – его может не быть в списке поддерживаемых шрифтов для данной модели принтера. И что же, из-за этого не выводить данные на принтер?… Из чего состоит интерфейс GDI с точки зрения приложения? Прежде всего, это контекст отображения и инструменты для рисования. Контекст является как бы листом бумаги, на котором приложения рисует графику и текст. Инструменты рисования – это перья, кисти (а также шрифты, курсоры, иконки, и даже целые графические изображения), с помощью которых создаётся изображение на устройстве. Если же говорить более точно, то контекст – это структура данных, описывающая устройство отображения. В этой структуре хранятся различные характеристики устройства и набор инструментов рисования, выбранные по-умолчанию. Приложение может выбирать в контексте отображения различные инструменты. Но собственно в функциях рисования изображений и вывода текста эти инструменты не указываются – они «наследуются» из контекста. Приложение сможет создать контекст отображения не только для экрана монитора или окна, но и для любого другого графического устройства вывода, например, принтера и графопостроителя. Можно создать контекст изображения для метафайла. Метафайл – это обычный файл или файл в памяти, в котором хранится последовательность команд интерфейса GDI. Приложение может осуществить вывод графической информации в метафайл, а затем вывести содержимое метафайла на любое устройство вывода. Изучение GDI мы начнём с подробного описания контекста изображения и его атрибутов. Собственно схема взаимодействия контекста и драйверов устройства показана на рисунке 10.001. <> Рис. 10.001. Ввод-вывод данных через контекст устройства. Также в вводной части необходимо отметить, что контекст – очень ресурсоёмкая структура данных, которая, к тому же, не освобождается при закрытии приложения, его вызвавшего. Поэтому, если создать множество контекстов, а затем не удалить (или не освободить) эти контексты, Ваша система как бы «ни с того ни с сего» станет работать нестабильно, и это может привести к краху операционной системы и её перезагрузке. Поэтому применяем следующие правила: 1. Контекст открывается и освобождается в пределах описания реакции на одно системное сообщение. То есть оно должно вести себя так же, как и при работе с файлами; 2. Контекст освобождается сразу же, как отпала в нём надобность (после чтения и установки его параметров по-умолчанию, ввода-вывода графической информации и т.п.) 5P9i0s8y19Z dt=Text 10.02. Правила 1 работы с контекстом 10.02.01. Работа с контекстом отображения. 10.02.02. Типы контекстов отображения. 10.02.03. Общий контекст отображения. 10.02.04. Контекст отображения для класса окна 10.02.05. Личный контекст отображения. 10.02.06. Родительский контекст отображения. 10.02.07. Контекст отображения для окна 10.02.08. Контекст физического устройства 10.02.09. Информационный контекст 10.02.10. Контекст памяти 10.02.11. Контекст для метафайла 5P9i0s8y19Z dt=Text 10.02.01. Работа с контекстом отображения. 2 Как правило, приложения выполняют свою работу по рисованию содержимого окна во время обработки сообщения Windows WM_PAINT, хотя часто требуется рисовать и во время обработки других сообщений. В любом случае приложению нужно придерживаться следующей последовательности действий: * получение или создание контекста отображения; * установка необходимых атрибутов в контексте отображения; * выполнение операций рисования; * освобождение либо удаление контекста отображения. Последнее действие (освобождение либо удаление контекста отображения) должно быть обязательно выполнено. Самый простой способ полностью нарушить работоспособность Windows – забыть освободить полученный контекст отображения или забыть удалить созданный контекст отображения или устройства. Так как контекст отображения – «самый критичный» ресурс Microsoft Windows, его необходимо освобождать сразу, как только в нём отпадает необходимость. Операционная система Microsoft Windows выполняет кэширование обычного контекста отображения, причём кэшируется только пять контекстов (информация для Microsoft Windows 3.11). Если операционная система не может удовлетворить запрос какого-либо приложения на выделение контекста отображения, вся операционная система окажется в критическом состоянии, из которой есть только один выход – перезагрузка Windows. 5P9i0s8y19Z dt=Text 10.02.02. Типы контекстов отображения. 2 Можно выделить следующие типы контекста отображения: * общий контекст отображения (common display context); * контекст отображения класса окна (class display context); * личный контекст отображения (private display context); * родительский контекст отображения (parent display context); * контекст отображения для окна (window display context); * контекст физического устройства (device context); * информационный контекст (information context); * контекст для памяти (memory device context); * контекст для метафайла (metafile context); Каждый из перечисленных выше контекстов имеет свои особенности и своё назначение. 5P9i0s8y19Z dt=Text 10.02.03. Общий контекст отображения. 2 Этот контекст используется чаще всего, поэтому для ускорения доступа к нему Windows использует кэширование. Для получения общего контекста отображения приложение должно вызвать функцию BeginPaint (при обработке сообщения WM_PAINT) или GetDC (при обработке других сообщений). При этом перед регистрацией класса окна в структуре WNDCLASS не должны использоваться значения CS_OWNDC, CS_PARENTDC или CS_CLASSDC. Например: wc.style = 0; (10.01) Функция BeginPaint возвращает контекст отображения для окна hwnd: HDC WINAPI BeginPaint( HWND hwnd, PAINTSTRUCT FAR *lpps); (10.02) Перед этим функция подготавливает окно для рисования, заполняя структуру PAINTSTRUCT информацией, которую можно использовать в процессе рисования. Назначение полей структуры PAINTSTRUCT смотри в приложении № I к данной лекции (п. 10.06). Контекст отображения, полученный с помощью функции BeginPaint, необходимо освободить перед завершением обработки сообщения WM_PAINT, вызвав функцию EndPaint с теми же параметрами: void WINAPI EndPaint( HWND hwnd, PAINTSTRUCT FAR *lpps); (10.03) Примечание: функции BeginPaint и EndPaint можно использовать только внутри обработчика сообщения WM_PAINT. Если приложению Microsoft Windows требуется рисовать при обработке других сообщений, оно должно получить контекст отображения с помощью функции GetDC и освободить функцией ReleaseDC; Функция GetDC возвращает контекст отображения для окна с идентификатором hwnd: HDC WINAPI GetDC( HWND hwnd ); (10.04) Функция ReleaseDC освобождает контекст изображения hdc, полученный для окна hwnd: int WINAPI ReleaseDC( HWND hwnd, HDC hdc ); (10.05) Каждый раз, когда приложение получает общий контекст отображения, его атрибуты получают значения по-умолчанию, перечисленные нами в приложении к данной лекции. Если перед выполнением рисования приложение изменит атрибуты контекста отображения, вызвав соответствующие функции GDI, в следующий раз при получении значений эти атрибуты вновь примут значения по-умолчанию. Поэтому установка атрибутов должна выполняться каждый раз после получения общего контекста отображения. Это очень неудобно, не быстро, такая процедура отнимает дополнительное время. Но эта операция необходима при использовании контекста отображения этого типа. Если это Вас не устраивает, смотри ниже другие контексты отображения. 5P9i0s8y19Z dt=Text 10.02.04. Контекст отображения для класса окна 2 В Microsoft Windows можно создать такой контекст отображения, который хранится отдельно в единственном экземпляре и используется всеми окнами, созданными на базе класса окна. При регистрации такого класса окна Вы должны в стилях окна указать стиль CS_CLASSDC: wc.style = CS_CLASSDC; (10.06) Все окна, созданные на базе класса, будут использовать один общий контекст отображения. Зачем это нужно?… Вы можете использовать его в тех случаях, когда по соображениям производительности нежелательно вызывать настройку атрибутов вывода общего контекста отображения перед каждым его использованием. Эту настройку можно выполнить один раз. Каждый раз, когда функция окна получает контекст отображения класса окна (с помощью функций BeginPaint или GetDC), в нём выполняется настройка только двух атрибутов – области ограничения и начала системных физических координат устройства. Остальные атрибуты остаются без изменений и, следовательно, не требуют повторной настройки; 5P9i0s8y19Z dt=Text 10.02.05. Личный контекст отображения. 2 Указав в стиле класса окна значение CS_OWNDC, можно добиться того, что для каждого окна, созданного на базе такого класса, операционная система Microsoft Windows создаст отдельную структуру памяти для контекста отображения. Этот контекст будет «жёстко привязан» к данному приложению Windows. Использовать такой контекст проще и безопаснее, однако при этом неэффективно расходуется оперативная память. wc.style = CS_OWNDC; (10.07) 5P9i0s8y19Z dt=Text 10.02.06. Родительский контекст отображения. 2 Этот контекст используется для дочерних окон. Он позволяет дочерним окнам «унаследовать» атрибуты контекста отображения у родительского окна. Например, дочернее окно может использовать для вывода текста тот же шрифт и цвета, что и родительское окно. Для использования родительского контекста перед регистрацией дочернего окна необходимо указать стиль CS_PARENTDC: wc.style = CS_PARENTDC; (10.09) 5P9i0s8y19Z dt=Text 10.02.07. Контекст отображения для окна 2 Все описанные выше контексты позволяют рисовать только во внутренней области окна (client region). С помощью функции: GetWindowDC приложение может получить «общий контекст отображения», позволяющий рисовать в любом месте окна (например, в области заголовка окна, в области системного меню, рамки окна, кнопок изменения размера и т.п.). Освобождать такой контекст отображения необходимо функцией ReleaseDC (как и «общий контекст отображения»). Особенность данного контекста состоит в том, что в нём выбрана система координат, начало которой находится в левом верхнем углу окна (всего окна, а не его внутренней области). Это контекст обычно используется при необходимости заменить стандартные элементы окна (заголовок, полосы просмотра и т.п.) на собственные элементы оформления (смотри, например, интерфейс проигрывателя Windows Media Player). 5P9i0s8y19Z dt=Text 10.02.08. Контекст физического устройства 2 Вывод изображений на такое устройство, как принтер, может выполняться с использованием тех же приёмов, что и вывод в окно приложения. Прежде всего, нужно создать контекст его отображения. А затем можно выполнить рисование, передавая им идентификатор полученного контекста как параметр. Для создания контекста устройства используется функция 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.01 hdc = CreateDC( "epson9", "Epson FX-800", "LPT1:", NULL ); Созданный при помощи функции CreateDC контекст нужно удалить функцией DeleteDC: BOOL WINAPI DeleteDC( HDC hdc ); (10.10) Эта функция возвращает TRUE при нормальном завершении и FALSE при возникновении ошибки. 5P9i0s8y19Z dt=Text 10.02.09. Информационный контекст 2 Если приложению необходимо получить информацию об устройстве вывода, оно может создать вместо обычного контекста информационный контекст. Информационный контекст нельзя использовать для рисования, но он занимает меньший объём оперативной памяти. Информационный контекст создаётся при помощи функции CreateIC, аналогичной по параметрам с функцией CreateDC. После использования информационный контекст следует удалить, вызвав функцию: DeleteDC. 5P9i0s8y19Z dt=Text 10.02.10. Контекст памяти 2 Создав в качестве «выводного устройства» вместо монитора оперативную память (например, для вывода изображений bitmap), можно значительно сократить время на вывод изображений. Контекст для памяти создаётся совместимым с тем контекстом отображения, в котором будет выполняться вывод на физическое устройство. Для создания совместимого контекста используется функция CreateCompatibleDC: HDC WINAPI CreateCompatibleDC( HDC hdc ); (10.11) Созданный таким образом контекст памяти удаляется функцией DeleteDC. 5P9i0s8y19Z dt=Text 10.02.11. Контекст для метафайла 2 Контекст для метафайла позволяет записывать команды GDI в файл и затем «проигрывать» такой файл на физическом устройстве вывода. Файл может находиться в оперативной памяти или на диске, в последнем случае его можно использовать для перенаправления графического изображения в другое приложение. Для создания контекста метафайла используется функция CreateMetaFile: HDC WINAPI CreateMetaFile( LPCSTR lpszFileName ); (10.12) Параметр lpszFileName должен указывать на строку, содержащую путь к файлу, или NULL. В последнем случае создаётся файл в оперативной памяти. После выполнения рисования в контексте метафайла его нужно закрыть, вызвав функцию CloseMetaFile: HMETAFILE WINAPI CloseMetaFile( HDC hdc ); (10.13) Эта функция закрывает метафайл для контекста hdc и возвращает идентификатор метафайла. Идентификатор закрытого метафайла использовать нельзя, так как он не содержит никакой полезной информации. Что же тогда с ним можно сделать: * Можно скопировать метафайл в обычный дисковый файл, вызвав функцию CopyMetaFile: HMETAFILE WINAPI CopyMetaFile( HMETAFILE hmf, LPCSTR lpszFileName ); (10.14) Параметр hmf определяет метафайл, а параметр lpszFileName содержит путь к имени файла, куда будет записан метафайл * Можно «проиграть» метафайл в контексте отображения или контексте устройства, вызвав функцию PlayMetaFile: BOOL WINAPI PlayMetaFile( HDC hdc, HMETAFILE hmf ); (10.15) * Наконец, при помощи функции DeleteMetaFile можно удалить метафайл из оперативной памяти (но не с диска!), вызвав функцию DeleteMetaFile: BOOL WINAPI DeleteMetaFile( HMETAFILE hmf ); (10.16) * Для того чтобы воспользоваться метафайлом, хранящимся в виде дискового файла, его следует загрузить при помощи функции GetMetaFile, указав в качестве единственного параметра путь к соответствующему файлу: HMETAFILE WINAPI GetMetaFile( LPCSTR lpszFileName ); (10.17) 5P9i0s8y19Z dt=Text 10.03. Резюме определения контекста 1 Итак, с помощью этой лекции Вы разобрались со всем разнообразием и классификацией контекста отображения, научились «перенаправлять» контекст отображения на принтер или в файл, а также научились выделать и освобождать контексты отображений. На данной лекции Вы познакомились с «основным инструментом» вывода и рисования на экране или устройстве информации средствами Windows API. Вы узнали, как рисовать содержимое главного окна Windows, как перенаправлять изображение на принтер (или другое устройство) или в метафайл. Также Вы убедились, что вывод содержимого в окно Windows нельзя производить «порциями», то есть по мере поступления информации. Приложение, созданное средствами WinAPI должно содержать в памяти компьютера всё своё состояние (данные, код, окружение), чтобы с помощью специальных функций оно могла вывести это состояние на экран, в файл, на принтер и т.п., используя соответствующие функции. В следующей лекции в виде справочника будет рассмотрены основные параметры и настраиваемые функции контекста отображения, обзор существующих в контексте Windows установок и функций, их изменяющих, а далее Вам будет представлен материал по организации вывода информации в окно и всплывающие сообщения Windows. 5P9i0s8y19Z dt=Text 10.04. Вопросы и упражнения. 1 5P9i0s8y19Z dt=Text 10.05. Г Л О С С А Р И Й 1 5P9i0s8y19Z dt=Text 10.06. Приложение №1 1 Описание структур и функций контекста отображения. СТРУКТУРА: PAINTSTRUCT НАЗНАЧЕНИЕ: Структура содержит параметры, необходимые для вывода изображений; СИНТАКСИС: typedef struct tagPAINTSTRUCT { HDC hdc; BOOL fErase; RECT rcPaint; BOOL fRestore; BOOL fIncUpdate; BYTE rgbReserved[16]; } PAINTSTRUCT; где hdc – идентификатор полученного контекста отображения (тот же, что возвращает функция BeginPaint); fErase – указывает, нужно ли перерисовывать фон окна. Если в поле стоит True, фон должен быть перерисован; rcPaint – структура, содержащая координаты левого верхнего и правого нижнего угла прямоугольника и указывающая, какую область на экране необходимо перерисовать; Остальные поля зарезервированы Windows и не должны использоваться. ФУНКЦИЯ: CreateDC ОПРЕДЕЛЕНА В СИНТАКСИС: HDC WINAPI CreateDC( LPCSTR lpszDriver, LPCSTR lpszDevice, LPCSTR lpszOutput, const void FAR *lpvInitData ); где * LPCSTR lpszDriver – имя драйвера; * LPCSTR lpszDevice – имя устройства; * LPCSTR lpszOutput – имя файла или порта вывода; * const void FAR *lpvInitData – данные для инициализации); НАЗНАЧЕНИЕ: Функция создаёт контекст отображения для устройства, «связывая» его с конкретным устройством и его драйвером; ПРИМЕЧАНИЕ: Параметры для данной функции берутся либо из файла win.ini, либо из реестра Windows (для новых версий Windows); ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Созданный контекст отображения или нулевое значение в случае ошибки. ФУНКЦИЯ: CreateIC ОПРЕДЕЛЕНА В СИНТАКСИС: HDC WINAPI CreateIC( LPCSTR lpszDriver, LPCSTR lpszDevice, LPCSTR lpszOutput, const void FAR *lpvInitData ); где * LPCSTR lpszDriver – имя драйвера; * LPCSTR lpszDevice – имя устройства; * LPCSTR lpszOutput – имя файла или порта вывода; * const void FAR *lpvInitData – данные для инициализации); НАЗНАЧЕНИЕ: Функция создаёт информационный контекст отображения для устройства, «связывая» его с конкретным устройством и его драйвером; ПРИМЕЧАНИЕ: Параметры для данной функции берутся либо из файла win.ini, либо из реестра Windows (для новых версий Windows); ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Созданный информационный контекст или нулевое значение в случае ошибки. ФУНКЦИЯ: CreateCompatibleDC ОПРЕДЕЛЕНА В: СИНТАКСИС: HDC WINAPI CreateCompatibleDC( HDC hdc ) где * hdc – контекст отображения или устройства, с которого делается копия в оперативной памяти; НАЗНАЧЕНИЕ: Создаёт в оперативной памяти контекст для открытого контекста отображения или устройства. Чаще всего используется для формирования растровых изображений (bitmap); ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Идентификатор копии контекста отображения или ноль в случае ошибки создания контекста. ФУНКЦИЯ: DeleteDC ОПРЕДЕЛЕНА В: СИНТАКСИС: BOOL WINAPI DeleteDC( HDC hdc ); где * hdc – контекст отображения, созданный функциями CreateDC, CreateIC и CreateCompatibleDC; НАЗНАЧЕНИЕ: Удаляет созданный контекст отображения; ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: TRUE, если контекст удалён успешно, и FALSE в случае ошибки. ФУНКЦИЯ: BeginPaint ОПРЕДЕЛЕНА В: СИНТАКСИС: HDC WINAPI BeginPaint( HWND hwnd, PAINTSTRUCT FAR *lpps); где * hwnd – идентификатор окна приложения, получающий для себя контекст отображения; * lpps – дальний указатель на структуру PAINTSTRUCT с параметрами контекста; НАЗНАЧЕНИЕ: Открывает контекст отображения для окна с идентификатором hwnd при обработке системного сообщения WM_PAINT; ПРИМЕЧАНИЕ: Данную функцию можно вызывать только при обработке сообщения WM_PAINT. Во всех остальных случаях необходимо пользоваться функциями GetDC/ReleaseDC для получения/освобождения контекста; ПРИМЕЧАНИЕ: «Парной» для функции BeginPaint является функция EndPaint, вызываемая также при обработке сообщения WM_PAINT; ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Открытый контекст отображения или 0 в случае ошибки. ФУНКЦИЯ: EndPaint ОПРЕДЕЛЕНА В: СИНТАКСИС: void WINAPI EndPaint( HWND hwnd, PAINTSTRUCT FAR *lpps); где * hwnd – идентификатор окна приложения, получивший для себя контекст отображения; * lpps – дальний указатель на структуру PAINTSTRUCT с параметрами контекста; НАЗНАЧЕНИЕ: Закрывает контекст отображения для окна с идентификатором hwnd при обработке системного сообщения WM_PAINT; ПРИМЕЧАНИЕ: Данную функцию можно вызывать только при обработке сообщения WM_PAINT. Во всех остальных случаях необходимо пользоваться функциями GetDC/ReleaseDC для получения/освобождения контекста; ПРИМЕЧАНИЕ: «Парной» для функции EndPaint является функция BeginPaint, вызываемая также при обработке сообщения WM_PAINT; ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Нет. ФУНКЦИЯ: GetDC ОПРЕДЕЛЕНА В: СИНТАКСИС: HDC WINAPI GetDC( HWND hwnd ); где * hwnd – идентификатор окна приложения, получающий для себя контекст отображения; НАЗНАЧЕНИЕ: Функция получает контекст отображения для рисования в окне вне обработчика сообщения WM_PAINT; ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Идентификатор созданного контекста или ноль в случае ошибки. ФУНКЦИЯ: ReleaseDC ОПРЕДЕЛЕНА В: СИНТАКСИС: int WINAPI ReleaseDC( HWND hwnd, HDC hdc ); где * hwnd – идентификатор окна приложения, получивший для себя контекст отображения; НАЗНАЧЕНИЕ: Функция освобождает контекст отображения для рисования в окне вне обработчика сообщения WM_PAINT; ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Ненулевое значение в случае освобождения контекста отображения или ноль в противном случае. ФУНКЦИЯ: CreateMetaFile ОПРЕДЕЛЕНА В: СИНТАКСИС: HDC WINAPI CreateMetaFile( LPCSTR lpszFileName ); где * lpszFileName – имя метафайла на жёстком диске (полное путевое имя) или NULL, если контекст создаётся в оперативной памяти; НАЗНАЧЕНИЕ: Создаёт контекст отображения для метафайла Microsoft Windows, содержащий команды рисования GDI; ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Идентификатор созданного контекста или ноль в случае ошибки. ФУНКЦИЯ: CloseMetaFile ОПРЕДЕЛЕНА В: СИНТАКСИС: HMETAFILE WINAPI CloseMetaFile( HDC hdc ); где * hdc – контекст отображения для метафайла; НАЗНАЧЕНИЕ: Функция закрывает контекст отображения для метафайла и возвращает дескриптор метафайла для дальнейших манипуляций с метафайлом; ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: идентификатор метафайла или ноль в случае ошибки. ФУНКЦИЯ: CopyMetaFile ОПРЕДЕЛЕНА В: СИНТАКСИС: HMETAFILE WINAPI CopyMetaFile( HMETAFILE hmf, LPCSTR lpszFileName ); где * hmf – идентификатор метафайла; * lpszFileName – имя метафайла на жёстком диске (полное путевое имя); НАЗНАЧЕНИЕ: Функция копирует метафайл, связанный с идентификатором hmf, в файл на диске, путь к которому указан в строке lpszFileName; ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: новый идентификатор метафайла или ноль в случае ошибки. ФУНКЦИЯ: PlayMetaFile ОПРЕДЕЛЕНА В: СИНТАКСИС: BOOL WINAPI PlayMetaFile( HDC hdc, HMETAFILE hmf ); где * hdc – контекст для устройства или отображения, в который осуществляется вывод из метафайла с идентификатором hmf; * hmf – идентификатор «проигрываемого» метафайла; НАЗНАЧЕНИЕ: Функция «проигрывает» (осуществляет вывод информации из файла) указанный метафайл на данном контексте отображения или устройства; ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: TRUE в случае успешного завершения функции и FALSE в случае ошибки. ФУНКЦИЯ: DeleteMetaFile ОПРЕДЕЛЕНА В: СИНТАКСИС: BOOL WINAPI DeleteMetaFile( HMETAFILE hmf ); где * hmf – идентификатор удаляемого метафайла; НАЗНАЧЕНИЕ: Функция удаляет (освобождает память) метафайл, связанный со своим идентификатором; ПРИМЕЧАНИЕ: Функция не удаляет метафайл с диска, созданного функциями CreateMetaFile и CopyMetaFile, то есть работает только с оперативной памятью; ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: TRUE в случае успешного удаления из памяти и FALSE в противном случае. ФУНКЦИЯ: GetMetaFile ОПРЕДЕЛЕНА В: СИНТАКСИС: HMETAFILE WINAPI GetMetaFile( LPCSTR lpszFileName ); где * lpszFileName – имя метафайла на жёстком диске (полное путевое имя); НАЗНАЧЕНИЕ: Функция открывает для чтения метафайл на жёстком диске, и связывает с ним идентификатор метафайла; ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Идентификатор метафайла или ноль в случае ошибки. 5P9i0s8y19Z