Загрузка...
 
Печать

Вывод графики средствами Windows GDI


По Windows GDI написана не одна сотня книг. Так как данная статья не претендует на полноту изложения, рекомендуется прочитать хотя бы пару из них. Не факт, что всё запомнишь, но основные моменты усвоишь.



Windows GDI

  • Применяется только при создании оконных приложений.
  • Аббревиатура расшифровывается как Graphics Device Interface (Интерфейс графических устройств).
  • До появления DirectX, являлась единственной библиотекой для разработки графических приложений в ОС MS Windows.
  • Значительно уступает DirectX по быстродействию. В то же время, функции GDI активно используются совместно с функциями DirectX в примерах, поставляемых вместе с DirectX SDK (например те, что относятся к работке со шрифтами).
  • Является одним из трёх базовых компонентов ОС семейства MS Windows. Два других компонента (Kernel и User) отвечают за управление памятью, файловый ввод/вывод, взаимодействие с пользователем и т.д.
  • Является частью Microsoft ® Windows ® API(external link) (англ. application programming interface - прикладной программный интерфейс).
  • Предоставляет стандартные блоки, используемые прикладными программами, написанными для Windows ®, включая семейство Windows Server 2003, Windows XP, Windows 2000, Windows NT ®, Windows 95, Windows 98 и Windows Me.
  • Представляет собой часть операционной системы, реализованную, как и большинство её компонентов, в виде динамически подключаемой библиотеки (файла с расширением .dll).
  • Обеспечивает аппаратно-независимую графику для приложений в ОС семейства MS Windows. Через драйверы устройств графика отображается на множестве аппаратно-различных устройств (в основном это видеоадаптеры и мониторы). Таким образом, программе нет необходимости знать или учитывать особенности того или иного устройства, так как в Windows реализован так называемый HAL (Hardware Abstraction Level - Уровень аппаратной абстракции).
  • В своё время GDI критиковали за медлительность, что является прямым следствием его универсальности (+ непрямой доступ к видеопамяти). Но это актуально лишь для некоторых функций GDI.
  • Представляет собой одну из самых мощных и массивных составляющих Windows API. Только для работы с текстом предусмотрено более 40 функций.
С точки зрения программиста GDI представляет собой развитый макроязык описания графики, поддерживающий:
  • изменение цвета пикселей;
  • рисование прямых, окружнностей, прямоугольников;
  • вывод надписей с поддержкой различных шрифтов;
  • копирование участков изображения, создание регионов, отсечений;
  • отображение сплайнов Безье;
  • и многое другое.

Типы, используемые в GDI

В файле windef.h (расположен в директории с установленной MSVC++ или Windows Platform SDK) определено несколько типов, активно используемых при работе с GDI. Рассмотрим несколько из них.
Тип POINT определяет координаты точки на плоскости и имеет вид:
Фрагмент windef.h
...
typedef struct tagPOINT {
LONG x;		LONG y;
} POINT;
...

Тип _RECT определяет координаты прямоугольника путём указания его левого верхнего и правого нижнего угла:
Фрагмент windef.h
...
typedef struct _RECT {
LONG  left;
LONG top;
LONG right;	
LONG bottom;
} RECT;
...

Для работы с этими двумя основными типами существует около десятка функций. Вот наиболее полезные из них:

Таблица 1. Функции для работы с типами POINT и RECT
Функция Описание
BOOL PtInRect(CONST RECT *lprc, POINT pt); Возвращает TRUE, если точка, переданная в параметре pt, лежит внутри прямоугольника, на который указывает параметр lprc.
BOOL SetRect(LPRECT lprc, int xLeft, int yTop, int xRight, int yBottom); Позволяет установить поля структуры прямоугольника, адресуемой указателем lprc, четыремя значениями xLeft, yTop, xRight, YBottom. Использование этой функции исзбавляет программиста от написания четырёх операторов присваивания при попытке записать новые значения в уже существующую структуру прямоугольника.
BOOL EqualRect(CONST RECT *lprc1, CONST RECT *lprc2); Позволяет сравнить 2 структуры прямоугольников, адреса которых передаются ей в качестве параметров.
BOOL CopyRect(LPRECT lprcDst, CONST RECT *lprcSrc); Позволяет копировать содержимое одной структуры прямоугольника внутрь другой структуры такого же типа.
BOOL OffsetRect(LPRECT lprc, int dx, int dy); Позволяет переместить прямоугольник, адрес которого указан в первом параметре, на указанное расстояние.
BOOL InflateRect(LPRECT lprc, int dx, int dy); Позволяет увеличить или уменьшить прямоугольник на заданные величины смещений.


GDI также активно использует тип SIZE, который позволяет хранить высоту и ширину прямоугольника:
Фрагмент windef.h
...
typedef struct tagSIZE {
LONG cx;
LONG cy;
} SIZE;
...


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

Контекст устройства (device context, DC) является основным понятием при работе с GDI.
  • Представляет собой структуру, которую Windows поддерживает для опеределённого участка памяти. Этот участок является своего рода "окном" в реальное устройство (например монитор или принтер).
При попытке вывести что-либо на экран монитора или принтер необходимо сначала получить контекст устройства этого экрана. Все графические функции GDI, связанные с отображением, требуют указания в качестве одного из параметров именно контекст устройства. Приложение никогда не работает напрямую со структурой контекста устройства, а использует для этого дескрипторы, имеющие тип HDC.
С контекстом устройства связан набор графических объектов. Каждый из них имеет свой набор характеристик, влияющих на результаты работы графических функций. К таким объектам относятся:

Таблица 2. Графические объекты для работы со структурой контекста устройства
Объект Описание
Перо (тип HPEN) Влияет на внешний вид отображаемых линий и графических объектов.
Кисть (тип HBRUSH) Влияет на цвет и способ заливки объектов.
Растр (тип HBITMAP) Представляет собой текущее визуальное содержимое контекста устройства, созданного в памяти, а не полученного каким-либо другим способом. Когда выполянется рисование в контексте памяти, поверхностью для рисования служит растр, выбранный в контекст в данный момент.
Палитра (тип HPALETTE) Определяет набор допустимых цветов для данного контекста. Используется только с палитровыми режимами (16 и 256 цветов).
Регион (тип HRGN) Позволяет выполнить отсечение при выводе, копировании и других операциях.
Путь (тип PATH) Позволяет записывать последовательности операций рисования.
Шрифт (тип HFONT) Определяет внешний вид выводимого текста.

Все эти типы также определены в windef.h .

Работа с объектами GDI

Все графические объекты из Таблицы 2 являются объектами GDI. Любой из них в данный момент может:
  • быть помещён внутрь какого-то контекста (говорят "выбран в контекст"); Объекты, выбранные в данный момент в контекст, удалять нельзя. Одновременно в конкретный момент времени в контексте может находиться лишь один экземпляр каждого объекта. Например, при помещении в контекст нового пера, старое перо из него изымается (но не удаляется!).
  • находиться в свободном состоянии. Такие объекты (которые не планируется использовать в будущем) необходимо удалять (с целью эффективного использования системной памяти). Удаление свободных и более неиспользуемых объектов GDI - забота программиста.

Помещение объекта в контекст

Производится с помощью функции SelectObject:
Прототип функции SelectObject
HGDIOBJ SelectObject(HDC hdc, HGDIOBJ hgdiobj);

Параметры функции SelectObject:
Параметр Описание
HDC hdc Дескриптор контекста устройства.
HGDIOBJ hgdiob Дескриптор объекта, помещаемого в контекст.

Возвращаемый результат функции - дескриптор ОСВОБОЖДАЕМОГО объекта GDI, который содержался ранее в контексте (он тоже имеет тип HGDIOBJ). Тип HGDIOBJ представляет собой обобщённый дескриптор объекта GDI.
Производить приведение типов:
  • Желательно при использовании функции SelectObject.
  • Обязательно при определении в начале листинга макроса STRICT.
В данном примере в контекст устройства выбирается объект hUsedFont типа HFONT:
...
SelectObject(hdc, (HGDIOBJ)hUsedFont);
...

Здесь объект hUsedFont приводится к типу HGDIOBJ.
То же самое можно проделать, используя GDI-макрос из файла windowsx.h:
...
SelectFont(hdc, hUsedFont);
...

Здесь приведение типа уже не требуется, да и название функции говорит само за себя. Такие GDI-макросы существуют для большинства объектов GDI и применимы к действиям выбор в контекст, удаления объекта и получения предопределённого (stock) объекта. Все они также определены в windowsx.h .
В файле windowsx.h можно найти соответствующий макрос:
Фрагмент windowsx.h
...
#define SelectFont(hdc, hfont)	((HFONT)SelectObject((hdc), (HGDIOBJ)(HFONT)(hfont)))
...


Удаление объекта из контекста

Производится с помощью функции DeleteObject:
Прототип функции DeleteObject
HGDIOBJ DeleteObject(HGDIOBJ hgdiobj);

Её единственный параметр - дескриптор удаляемого объекта GDI. В случае успеха функция возвращает значение отличное от нуля.
В данном примере из контекста изымается объект hUsedFont:
...
DeleteObject((HGDIOBJ)hUsedFont);
...

Здесь объект hUsedFont приводится к типу HGDIOBJ.
То же самое можно проделать, используя GDI-макрос из файла windowsx.h:
...
DeleteFont(hUsedFont);
...

Здесь приведение типа уже не требуется, да и название функции говорит само за себя.
В файле windowsx.h можно найти соответствующий макрос:
Фрагмент windowsx.h
...
#define DeleteFont(hfont)	DeleteObject((HGDIOBJ)(HFONT)(hfont))
...


Создание объектов GDI

Операционная система поддерживает набор предопределённых (stock) объектов GDI (перо, кисть, шрифт и др.) с характеристиками по умолчанию. Для получения дескриптора предопределённого объекта GDI применяется функция GetStockObject:
Прототип функции GetStockObject
HGDIOBJ GetStockObject(int fnObject);

В качестве параметра указывается один из следующих типов предопределённых объектов:
Таблица 3. Некоторые типы предопределённых объектов GDI
Тип Описание
BLACK_BRUSH Сплошная кисть чёрного цвета.
WHITE_BRUSH Сплошная кисть белого цвета.
GRAY_BRUSH Сплошная кисть серого цвета.
DKGRAY_BRUSH Сплошная кисть тёмно-серого цвета.
LTGRAY_BRUSH Сплошная кисть светло-серого цвета.
DC_BRUSH Windows 2000/XP: Кисть сплошного тона. Цвет по умолчанию является белым. Цвет может измениться при помощи использования функция SetDCBrushColor.
HOLLOW_BRUSH Пустая кисть (эквивалент NULL_BRUSH).
HOLLOW_BRUSH Нулевая (пустая) кисть (эквивалент HOLLOW_BRUSH).
NULL_BRUSH Пустая кисть. Применяется для рисования фигур, у которых отсутствует заливка.
BLACK_PEN Чёрное перо.
WHITE_PEN Белое перо.
DC_PEN Windows 2000/XP: Сплошной цвет пера. Цвет по умолчанию является белым. Цвет может измениться при помощи использования функции SetDCPenColor.
DEFAULT_GUI_FONT Шрифт, используемый по умолчанию в графическом интерфейсе пользователя. Заданный по умолчанию (типичный) шрифт для объектов пользовательского интерфейса таких как меню и диалоговые окна. Им является MS Sans Serif.
SYSTEM_FONT Системный шрифт, используемый для отображения меню и текста в диалоговых окнах. Windows 95/98 and Windows NT: Системный шрифт - MS Sans Serif. Windows 2000/XP: Системный шрифт - Tahoma.
SYSTEM_FIXED_FONT Моноширинный (фиксированной ширины) системный шрифт . Этот предопределенный (стандартный) объект предусматривается только для совместимости с 16-битовыми версиями Windows ранее чем 3.0.
ANSI_FIXED_FONT Моноширинный системный шрифт (фиксированной ширины) Windows.
ANSI_VAR_FONT Системный шрифт Windows с переменным шагом (разноширинный шрифт).
DEVICE_DEFAULT_FONT Windows NT/2000/XP: Аппаратно-зависимый шрифт.
OEM_FIXED_FONT Предусматриваемый поставщиком основного оборудования (OEM) моноширинный шрифт (фиксированной ширины).
DEFAULT_PALETTE Заданная по умолчанию (Типичная) палитра. Состоит из статических цветов системной палитры.

В случае успешного завершения возвращается дескриптор затребованного логического объекта. Иначе - 0 (ноль).
У предопределённых объектов есть одна особенность - их не требуется самостоятельно удалять с помощью функции DeleteObject. Впрочем, это не запрещено.
Используйте флажки DKGRAY_BRUSH, GRAY_BRUSH и объекты предопределения LTGRAY_BRUSH только в окнах со стилями CS_HREDRAW и CS_VREDRAW . Использование серой предопределенной кисти в любом другом стиле окна может привести к нарушению границ шаблонов кисти после того, как окно перемещается или изменяется по размеру. Начало координат предопределенных кистей не могут быть откорректированы.
Стандартные объекты HOLLOW_BRUSH и NULL_BRUSH эквивалентны.
Windows 2000/XP: И DC_BRUSH и DC_PEN могут быть использованы взаимозаменяемо с другими предопределенными объектами подобно BLACK_BRUSH и BLACK_PEN.
Шрифт, используемый объектом предопределения DEFAULT_GUI_FONT может измениться. Используйте этот стандартный объект, когда Вы хотите использовать шрифт, который используют меню, диалоговые окна, и другие объекты пользовательского интерфейса.

В GDI предусмотрена возможность создания собственных объектов, удовлетворяющих любым требуемым характеристикам. Для создания нового объекта GDI конкретного типа предусмотрена своя, уникальная для этого типа функция (часто их даже несколько).
Рассмотрим создание объекта GDI на примере шрифта. Для этого используются функции CreateFont и CreateFontIndirect.

Прототип функции CreateFont выглядит так:
Прототип функции CreateFont
HFONT CreateFont(
int nHeight,	// Высота шрифта в логических единицах
int nWidth,		// Средняя ширина шрифта в логических единицах
int nEscapement,		// Угол наклона шрифта
int Orientation,			// Угол наклона базовой линии шрифта
int fnWeight,		// Плотность
DWORD fdwItalic,				// Является ли шрифт наклонным
DWORD fdwUnderline,		// Является ли шрифт подчёркнутым
DWORD fdwStrikeOut,		// Является ли шрифт зачёркнутым
DWORD fdwCharSet,		// Идентификатор набора символов
DWORD fdwOutputPrecision,				// Точность вывода
DWORD fdwOutputClipPrecision,		// Точность отсечения
DWORD fdwQuality,		// Качество вывода
DWORD fdwPitchAndFamily,		// Шаг и семейство шрифта
LPCTSTR lpszFace			// Название шрифта
);

Несмотря на обилие параметров, эта функция проста для понимания. Большинство параметров можно устанавливать в значения по умолчанию.
  • Если параметр nWidth равен нулю, то при создании шрифта Windows руководствуется лишь параметром nHeight. Возможные значения параметра fnWeight - FW_NORMAL, FW_BOLD, FW_EXTRABOLD и др.
Пример:
hUsedFont=CreateFont(38, 0, 0, 0, FW_EXTRABOLD, FALSE, TRUE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, BARIABLE_PITCH, "Times New Roman");

Здесь создаётся шрифт размером 38 единиц, без наклона. жирный, подчёркнутый, использующий качество по умолчанию, с названием "Times New Roman".

Прототип функции CreateFontIndirect выглядит так:
Прототип функции CreateFontIndirect
HFONT CreateFontIndirect(CONST LOGFONT *lplf);

Здесь параметром является адрес структуры типа LOGFONT. Поля этой структуры полностью эквиваленты полям функции CreateFont:
Прототип структуры LOGFONT
typedef struct tagLOGFONT(
LONG lfHeight;	// Высота шрифта в логических единицах
LONG lfWidth;		// Средняя ширина шрифта в логических единицах
LONG lfEscapement;		// Угол наклона шрифта
LONG lfOrientation;			// Угол наклона базовой линии шрифта
LONG lfWeight;		// Плотность
BYTE lfItalic;				// Является ли шрифт наклонным
BYTE lfUnderline;		// Является ли шрифт подчёркнутым
BYTE lfStrikeOut;		// Является ли шрифт зачёркнутым
BYTE lfCharSet;			// Идентификатор набора символов
BYTE lfOutPrecision;				// Точность вывода
BYTE lfClipPrecision;		// Точность отсечения
BYTE lfQuality;					// Качество вывода
BYTE lfPitchAndFamily,		// Шаг и семейство шрифта
TCHAR lfFaceName[LF_FACESIZE];			// Название шрифта
) LONGFONT;

Функцию CreateFontIndirect обычно применяют при необходимости создать несколько объектов-шрифтов, имеющих схожие характеристики и небольшие различия.
Объект-шрифт также удаляется с помощью функции DeleteObject.

Порядок действий при работе с объектами GDI

На основе материала из предыдущих подпунктов, сформулируем алгоритм работы с объектом GDI:
  1. Получить дескриптор объекта GDI (а. Воспользоваться одним из предопределённых объектов. б. Создать новый объект при помощи соответствующей функции.)
  2. Выбрать объект GDI в контекст устройства при помощи функции SelectObject (либо воспользовавшись макросом из файла windowsx.h). Не забываем сохранить при этом дескриптор объекта GDI, находившегося в контексте до этого.
  3. Выполнить необходимые действия с контекстом устройства (обычно это рисование или перерисовка).
  4. Выбрать в контекст устройства дескриптор объекта GDI, сохранённый в шаге 2. При этом дескриптор объекта, созданного нами, освободится.
  5. Удалить созданный объект GDI. Если этот объект является предопределённым, то удалять его необязательно.

Получение контекста устройства

Для рисования в окне необходимо сначала получить дескриптор его контекста устройства. Это можно сделать с помощью функций GetDC или GetWindowDC. Вот их прототипы:
Прототип функции GetDC
HDC GetDC(HWND hWnd);

Прототип функции GetWindowDC
HDC GetWindowDC(HWND hWnd);

Обе этих функции получают в качестве параметра дескриптор окна и возвращают его контекст. Отличие состоит в том, что GetDC возвращает дескриптор клиентской области окна, а GetWindowDC - дескриптор всего окна целиком, включая заголовк и полосы прокрутки.
По завершении работы с контекстом устройства, его необходимо освободить при помощи функции ReleaseDC:
Прототип функции ReleaseDC
int ReleaseDC(HWND hWnd, HDC hDC);

Первый параметр - дескриптор окна, для которого получили контекст. Второй - дескриптор освобождаемого контекста. При успешном завершении функция возвращает 1, иначе - 0.
Пример применения:
Вывод надписи в клиентскую область окна
...
HDC hdc;
char* szString="Тестовое сообщение";
...
hdc=GetDC(hwnd);
TextOut(hdc, 10, 10, szString, strlen(szString));
ReleaseDC(hWnd, hdc);
...

Данный фрагмент, при включении его в исходный код оконного приложения, выводит в клиентской области окна надпись "Тестовое сообщение". Используем функцию GetDC, т.к. вывод осуществляется именно в клиентскую область окна. Освобождаем контекст функцией ReleaseDC. Функция TextOut имеет прототип:
Прототип функции TextOut
BOOL TextOut(HDC hdc, int x, int y, LPCSTR lpStr, int cbLen);

Параметры функции TextOut:
Параметр Описание
HDC hdc Дескриптор контекста устройства, в который будет осуществляться вывод.
int x Координата точки по оси x (отсчитывается от левого верхнего угла), где будет размещена надпись.
int y Координата точки по оси y (отсчитывается от левого верхнего угла), где будет размещена надпись.
LPCSTR lpStr Указатель на строку с текстом. Строка обязательно заканчивается комбинацией символов \0.
int cbLen Число символов в строке с текстом.

При успешном завершении функция возвращает 1, иначе - 0.

Особый случай: сообщение WM_PAINT

  • Указывает на необходимость перерисовки окна приложения.
  • Занимает особое положение среди сообщений приложения, использующего графический интерфейс пользователя (Graphic User Interface - GUI).
  • Практически не используется при создании приложений DirectX.
Большинство обычных окон, использующий GUI, создаются с использованием стиля окна WS_OVERLAPPEDWINDOW (обыкновенное перекрывающееся окно). Это значит, что любое может частично или полностью закрывать собой другое окно, расположенное под ним.
Как только ранее скрытый участок окна становится видимым, ОС помечает его как "недействительный участок" (invalid region) и помещает сообщение WM_PAINT в очередь сообщений приложения.
В ответ на это сообщение приложение дожно не только восстановить содержимое недействительного участка, но и объявить его действительным. Именно поэтому в ответ на сообщение WM_PAINT приложение получает контекст своим особым способом, совершенно отличным от использования функций GetDC и GetWindowDC (т.к. эти функции неспособны делать участок окна действительным или недействительным).
При обработке сообщения WM_PAINT дескриптор контекста устройства получают при помощи функции BeginPaint:
Прототип функции BeginPaint
HDC BeginPaint(HWND hWnd, LPPAINTSTRUCT lpPaint);

Первый параметр - дескриптор окна, нуждающегося в обновлении. Второй - адрес структуры PAINTSTRUCT, из которой можно извлечь информацию, например, о размерах и положении недействительного участка. При этом перерисовывается только этот недействительный участок (в целях экономии памяти) - GDI автоматически выполнит отсечение в случае необходимости.
При обработке сообщения WM_PAINT контекст устройства освобождают при помощи функции EndPaint:
Прототип функции EndPaint
HDC EndPaint(HWND hWnd, CONST PAINTSTRUCT *lpPaint);

Функция EndPaint имеет такие же параметры, что и функция BeginPaint.
Пример применения:
Вывод надписи в клиентскую область окна в ответ на сообщение WM_PAINT
...
HDC hdc;
PAINTSTRUCT ps;
char* szString="Тестовое сообщение";
...
hdc=BeginPaint(hwnd, &ps);
TextOut(hdc, 10, 10, szString, strlen(szString));
EndPaint(hwnd, &ps);
...

В отличие от предыдущего примера, здесь присутствуют две специализированные функции BeginPaint и EndPaint + инициализирована структура PAINTSTRUCT.

Режимы отображения

Для каждого устройства его контекст в GDI поддерживает определённый режим отображения (mapping mode). Он определяет единицы измерения, используемые для преобразования логических координат в физические координаты устройства, а также направление осей координат.
  • Логические координаты - это те координаты, которые использует программист при вызове графических функций.
  • Физические координаты используются GDIдля реального вывода изображения на устройстве.
Режим отображения устанавливается с помощью функции SetMapMode:
Прототип функции SetMapMode
int SetMapMode(HDC hdc, int fnMapMode);

Здесь первый параметр - дескриптор контекста устройства. Второй параметр - устанавливаемый режим отображения, где указывается одно из следующих значений:
Таблица 4. Возможные значения параметра fnMapMode
Значение параметра Описание
MM_TEXT Логические координаты совпадают с физическими координатами устройства. В качестве единиц измерения используются пиксели. Левый верхний угол экрана имеет координаты (0, 0); ось Х направлена вправо, а ось Y - вниз. Этот режим отображения принят по умолчанию.
MM_HIMETRIC Каждая единица логических координат соответствует 0,01 мм. Левый нижний угол имеет координаты (0, 0). Ось Х направлена вправо. Ось Y направлена вверх.
MM_LOMETRIC Каждая единица логических координат соответствует 0,1 мм. Левый нижний угол имеет координаты (0, 0). Ось Х направлена вправо. Ось Y направлена вверх.
MM_HIENGLISH Каждая единица логических координат соответствует 0,001 дюйма. Левый нижний угол имеет координаты (0, 0). Ось Х направлена вправо. Ось Y направлена вверх.
MM_LOENGLISH Каждая единица логических координат соответствует 0,01 дюйма. Левый нижний угол имеет координаты (0, 0). Ось Х направлена вправо. Ось Y направлена вверх.
MM_TWIPS Каждая единица логических координат соответствует 1/1440 дюйма. Левый нижний угол имеет координаты (0, 0). Ось Х направлена вправо. Ось Y направлена вверх.
MM_ANISOTROPIC Каждая единица логических координат может соответствовать произвольному количеству точек устройства, которое независимо масштабируется по каждой из осей. Задавать поведение этого режима можно при помощи функций SetWindowExtEx и SetViewportExtEx.
MM_ISOTROPIC Каждая единица логических координат может соответствовать произвольному количеству точек устройства, которое одинаково масштабируется по осям. Задавать поведение этого режима можно при помощи функций SetWindowExtEx и SetViewportExtEx.

Большинство функций GDI, в том числе и CreateFont, получают свои параметры именно в логических единицах контекста устройства.

Узнать текущий режим отображения можно с помощью функции GetMapMode:
Прототип функции GetMapMode
int GetMapMode(HDC hdc);

Единственный параметр функции - дескриптор контекста устройства, а возвращаемый результат - одно из значений, приведённых в Таблице 4. В случае неудачи функция возвращает 0 (ноль).

Contributors to this page: slymentat .
Последнее изменение страницы Воскресенье 25 / Сентябрь, 2016 10:31:01 MSK автор slymentat.

Помочь проекту

Яндекс-деньги: 410011791055108