Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лекции / Shchupak_Yu._Win32_API_Razrabotka_prilozheniy_dlya_Windows

.pdf
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
13.15 Mб
Скачать

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

61

 

 

 

Первый метод получения дескриптора контекста устройства

Этот метод используется при обработке сообщения WM_PAINT. Контекст устрой ства получают вызовом функции BeginPaint, имеющей следующий прототип:

HDC BeginPaint(

 

 

HWND hwnd,

//

дескриптор окна

LPPAINTSTRUCT lPaint

//

указатель на структуру типа PAINTSTRUCT

);

 

 

В случае успешного завершения функция возвращает дескриптор контекста дисплея для клиентской области окна.

Кроме этого функция заполняет поля структуры PAINTSTRUCT, имеющей следу ющее определение:

typedef

struct tagPAINTSTRUCT {

HDC

hdc;

//

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

BOOL fErase;

//

признак стирания фона клиентской области

RECT rcPaint; // границы недействительного прямоугольника BOOL fRestore;

BOOL fIncUpdate;

BYTE rgbReserved[32]; } PAINTSTRUCT;

Последние три поля используются операционной системой.

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

Поле fErase определяет, будет ли Windows обновлять фон недействительного ре гиона. Чаще всего fErase имеет значение TRUE, что означает стирание (обновление) фона. Когда обновляемый регион формируется вызовом функции InvalidateRect или InvalidateRgn, один из параметров этих функций разрешает или подавляет стирание фона.

Если задано стирание фона, то функция BeginPaint посылает оконной процедуре сообщение WM_ERASEBKGND. Приложение может обработать это сообщение, чтобы отобразить однородный или растровый фон. Однако обычно оно обрабатывается по умолчанию функцией DefWindowProc, которая обновляет фон с использованием кисти, определенной в поле hbrBackground класса окна.

Следует отметить, что функция BeginPaintсбрасывает обновляемый регион в NULL, или, другими словами, превращает недействительный регион в действительный. Это предотвращает повторную генерацию системой сообщения WM_PAINTдо тех пор, пока обновляемый регион вновь не изменится.

До своего завершения функция BeginPaint посылает оконной процедуре еще одно сообщение — WM_NCPAINT. Оно заставляет приложение перерисовать так на зываемую неклиентскую область, которая представляет собой остальную часть окна — кроме клиентской области. Как правило, это сообщение обрабатывается также функцией DefWindowProc.

Типовой процесс обработки сообщения WM_PAINT выглядит следующим образом:

case WM_PAINT:

hDC = BeginPaint(hWnd, &ps); [ использование функций GDI ] EndPaint(hWnd, &ps);

return 0;

62

Глава 2. GDI — графический интерфейс устройства

 

 

После завершения операций рисования приложение должно вызвать функцию EndPaint, чтобы освободить контекст устройства.

Примеры использования контекста дисплея в блоке обработки сообщения WM_PAINT были приведены в листингах из первой главы.

Второй метод получения дескриптора контекста устройства

Иногда рисование должно происходить не в блоке обработки сообщения WM_ PAINT, а при обработке других сообщений. Или, быть может, дескриптор кон текста устройства нужен не для рисующих, а для иных функций (например, в качестве аргумента функции GetTextMetrics), вызываемых вне блока обработки сообщения WM_PAINT. В таких ситуациях контекст устройства получают либо вы зовом функции GetDC:

hdc = GetDC(hWnd);

либо вызовом функции GetWindowDC:

hdc = GetWindowDC(hWnd);

Первая функция возвращает дескриптор контекста дисплея для клиентской области окна hWnd, а вторая — для всего окна. Если в качестве аргумента hWnd передать значение NULL, то обе функции вернут дескриптор устройства для все го экрана.

По окончании работы с функциями GDI необходимо освободить контекст ус тройства с помощью функции ReleaseDC, например:

hDC = GetDC(hWnd);

[ использование функций GDI ]

ReleaseDC(hWnd, hDC);

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

Обычно вторым методом получения дескриптора контекста дисплея пользу ются программы текстовых редакторов, обрабатывая сообщения от клавиату ры, а также программы рисования, обрабатывая сообщения от мыши. Это позво ляет обновлять клиентскую область непосредственно в ответ на ввод информации с клавиатуры или от мыши и при этом не объявлять часть окна недействитель ной для генерации сообщения WM_PAINT. Тем не менее, подобные программы долж ны уметь обновлять окно в любой момент, когда они получают сообщение

WM_PAINT.

Но на этом наше знакомство с контекстом дисплея еще не закончилось. Win32 API предлагает к использованию два подтипа контекста дисплея, различающие ся механизмами выделения и освобождения памяти1.

1На самом деле есть еще и третий подтип — классовый контекст устройства, но он реализован лишь для совместимости с 16 разрядными версиями Windows и не рекомендован к примене нию в 32 разрядных приложениях.

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

63

 

 

 

Подтипы контекста дисплея

Любая из функций, BeginPaint, GetDC, GetWindowDC, возвращает либо общий (common), либо частный (private) контекст устройства в зависимости от стиля, указанного в классе данного окна (поле style в структуре типа WNDCLASS).

Общий контекст дисплея

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

Система Windows получает все общие контексты устройств из кэша экранных контекстов. Поэтому приложение должно освобождать общий контекст устрой ства сразу же после окончания рисования. При освобождении контекста теряют ся все сделанные изменения атрибутов.

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

Частный контекст дисплея

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

Частный контекст устройства не является частью системного кэша, и память для него выделяется системой специально для данного приложения. Система ав томатически освобождает частный контекст устройства после того, как уничто жается последнее окно данного класса.

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

Использование сообщения WM_PAINT

Обычно приложение рисует что либо в окне, реагируя на сообщение WM_PAINT. Система посылает это сообщение окну во всех случаях, требующих перерисовки клиентской области окна. Например, типичными причинами генерации этого со общения могут быть следующие события:

изменились размеры или местоположение окна;

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

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

Кроме того, приложение может само инициировать посылку сообщения WM_PAINT посредством вызова одной из функций, InvalidateRect, InvalidateRgn или

UpdateWindow.

Функция UpdateWindow посылает сообщение WM_PAINT непосредственно в окон ную процедуру, минуя очередь приложения.

Работа с сообщением WM_PAINT требует от разработчика понимания общей па радигмы отображения графики на экране, которая принята в системах семейства

64

Глава 2. GDI — графический интерфейс устройства

 

 

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

Использование функций InvalidateRect и InvalidateRgn

Если в каком то месте алгоритма необходимо сгенерировать сообщение WM_PAINT для перерисовки некоторой части окна, то приложение может воспользоваться функциями InvalidateRect и InvalidateRgn.

Функция InvalidateRect имеет следующий прототип:

BOOL IvalidateRect(HWND hWnd, CONST RECT* lpRect, BOOL bErase);

Параметры этой функции перечислены в следующем списке:

hWnd — дескриптор окна, у которого изменился обновляемый регион. Если этот параметр равен NULL, то система обновляет и перерисовывает все окна прило жения, а также посылает сообщения WM_ERASEBKGND и WM_NCPAINT оконной про цедуре до возврата из функции.

lpRect — указатель на структуру типа RECT, содержащую клиентские координа ты прямоугольника, который добавляется к обновляемому региону. Если этот параметр имеет значение NULL, то к обновляемому региону добавляется вся клиентская область.

bErase — флаг, определяющий, будет ли стираться фон обновляемого региона. Если этот параметр равен TRUE, то фон стирается, когда вызывается функция BeginPaint. Если указано значение FALSE, то фон остается без изменения.

Последний параметр очень важен. Нужно быть очень внимательным, опреде ляя его значение. Ни в коем случае нельзя передавать значение TRUE, если можно обойтись значением FALSE, так как это может оказаться причиной очень неприятного мерцания фона окна. Если же стирание фона все таки необходимо, следует поста раться минимизировать обновляемый регион. Иными словами, если можно ограни чить стираемую область некоторым прямоугольником rcUpdate, то в качестве второ го параметра следует передавать ссылку на этот прямоугольник, а не значение NULL.

Функция InvalidateRgn имеет следующий прототип:

BOOL InvalidateRgn(HWND hWnd, HRGN hRgn, BOOL bErase);

В этой функции все параметры, кроме второго, имеют тот же смысл, что и в пре дыдущей функции. Параметр hRgn содержит дескриптор региона, добавляемого к обновляемому региону. Этот дескриптор можно получить при помощи функций типа CreateRectRgn, CreatePolygonRgn и других функций, рассматриваемых в разделе «Регионы».

Таким образом, и функция InvalidateRect, и функция InvalidateRgn изменяют об новляемый регион так, что в любом случае он уже не является пустым. Если же обновляемый регион не пуст, то система отправляет окну hWndсообщение WM_PAINT.

Типичная ошибка

Если не нужно что либо выводить в клиентскую область окна, то можно доверить обработку сообщения WM_PAINT функции DefWindowProc. Но не следует писать та кой код:

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

65

 

 

 

case WM_PAINT:

return 0; // ОШИБКА !!!

Дело в том, что, как только появится непустой обновляемый регион, Windows поставит сообщение WM_PAINT в очередь. А оконная процедура в приведенном при мере не вызывает функцию BeginPaint, которая делает обновляемую область дей ствительной. Поэтому Windows снова отправит сообщение WM_PAINT. И система будет отсылать это сообщение постоянно, создавая бесконечный цикл.

Контекст принтера

При необходимости вывода информации на принтер приложение должно создать контекст устройства, вызвав функцию CreateDC. В качестве аргументов функции передаются имя драйвера устройства, имя устройства и, при необходимости, дан ные для инициализации устройства. Используя полученный дескриптор контек ста, можно подготовить устройство для печати и вывести необходимую информа цию. Завершив работу с принтером, приложение должно удалить контекст принтера с помощью функции DeleteDC.

Контекст в памяти (совместимый контекст)

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

Такой контекст создается функцией, имеющей следующий прототип:

HDC CreateCompatibleDC (HDC hdc);

Параметр hdc позволяет указывать дескриптор существующего контекста уст ройства, с которым должен быть совместим создаваемый контекст. Если этот па раметр равен NULL, то функция создает контекст в памяти, совместимый с теку щим экраном приложения.

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

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

CreateCompatibleBitmap.

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

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

Пример использования совместимого контекста приведен в главе 3.

66

Глава 2. GDI — графический интерфейс устройства

 

 

Метафайловый контекст

Другой разновидностью контекста, не соответствующего реальному физическо му устройству, является метафайловый контекст устройства.

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

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

Вопросы использования метафайлового контекста будут рассматриваться в главе 3.

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

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

Информационный контекст создается функцией CreateIC, прототип которой приведен ниже:

HDC CreateIC(

 

LPCTSTR lpszDriver,

// имя драйвера

LPCTSTR lpszDevice,

// имя устройства

LPCTSTR lpszOutput,

// имя порта или файла

CONST DEVMODE* lpDvm

// указатель на структуру DEVMODE

);

 

В Win32 приложениях третий параметр всегда игнорируется и при вызове функ ции должен быть равным NULL.

Четвертый параметр задает адрес структуры типа DEVMODE, в которую записы вается извлекаемая информация.

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

Системы координат и преобразования

Экранные, оконные и клиентские координаты

Система координат для окна базируется на координатной системе дисплея. Основ ной единицей измерения служит пиксел. Точки на экране задаются парой коорди нат (x, y). При этом x координаты возрастают слева направо, а y координаты — сверху вниз. Расположение начала координат зависит от режима отображения.

Системы координат и преобразования

67

 

 

 

Позиция окна на экране задается в приложениях в так называемых экранных координатах (screen coordinates), для которых началом координат является левый верхний угол экрана. Часто эта позиция описывается структурой типа RECT, содер жащей экранные координаты левого верхнего угла и правого нижнего угла окна.

Позиция точки в окне задается либо в оконных координатах (window coordinates), либо в клиентских координатах (client coordinates) (см. рис. 1.3). Выбор системы координат зависит от используемых функций Win32 GDI, поэтому следует обра щать внимание на спецификацию системы координат, читая описание функции в MSDN. Оконные и клиентские координаты гарантируют надлежащее позицио нирование точки в окне независимо от положения окна на экране.

Типы координатных систем

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

Мировая система координат (world space) может использоваться как началь ная система координат, обеспечивающая любое преобразование.

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

Система координат устройства (device space) используется после страничной системы. В ней осуществляется только перемещение начала координат, чтобы обеспечить надлежащее положение изображения в физической системе коор динат.

Физическая система координат (physical device space) — последняя система в конвейере геометрических преобразований. Она используется драйвером гра фического устройства.

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

Рис. 2.2. Типичные преобразования систем координат для вывода изображения

68

Глава 2. GDI — графический интерфейс устройства

 

 

Физическая система координат

Физическая система координат представляет собой матрицу пикселов фиксиро ванной ширины и высоты. Начало координат находится в левом верхнем углу. Ось X направлена слева направо, а ось Y — сверху вниз. Максимальный размер физического устройства равен 227 × 227 пикселов.

Для дисплея физические координаты называют также экранными координа тами1. Экранные координаты обычно используются в операциях управления окнами. Например, функция GetWindowRect возвращает ограничивающий пря моугольник окна в экранных координатах. Также экранные координаты содер жатся в параметрах таких сообщений, как WM_NCMOUSEMOVE. Это сообщение ге нерируется при перемещении курсора мыши в пределах неклиентской части окна.

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

Система координат устройства

Координаты устройства (device coordinates) используются при работе с контек стами устройств. В общем случае система координат устройства является под множеством соответствующей физической системы координат.

Для контекстов устройств, созданных функциями CreateDC, CreateIC и Create CompatibleDC, система координат устройства идентична физической системе ко ординат.

Для контекстов устройств, связанных с конкретными окнами (то есть возвра щаемых функциями GetDC, GetWindowDC и BeginPaint), система координат устрой ства определяется прямоугольником окна или его клиентской области.

Как и в физической системе координат, левый верхний угол системы коорди нат устройства имеет координаты (0, 0), ось X направлена слева направо, а ось Y — сверху вниз. Зная дескриптор контекста устройства, можно узнать относитель ную позицию системы координат устройства в его физических координатах при помощи функции GetDCOrgEx.

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

BOOL ClientToScreen(HWND hWnd, LPOINT lpPoint);

BOOL ScreenToClient(HWND hWnd, LPOINT lpPoint);

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

1 См. выше раздел «Экранные, оконные и клиентские координаты».

Системы координат и преобразования

69

 

 

 

Страничная система координат и режимы отображения

Обе рассмотренные системы координат ограничиваются представлением в виде аппаратно зависимого массива пикселов. Размер окна на экране с высоким разре шением отличается от размера окна при низком разрешении, а толщина напеча танной линии из трех пикселов будет зависеть от разрешения принтера. Чтобы графическое программирование в меньшей степени зависело от устройства, Win32 GDI позволяет приложениям создавать собственные логические системы коорди нат, приближенные к их геометрическим моделям. В таких системах координат удобнее работать, и они гораздо меньше зависят от оборудования.

Одной из двух логических систем координат в Win32 API является странич ная система координат. Это единственная логическая система координат, кото рая поддерживается 16 разрядными ОС семейства Windows и даже реализация ми Win32 в Windows 95/98. Мировые координаты, которые являются второй логической системой координат, поддерживаются только в Windows NT/2000. По историческим причинам в Windows под логической системой координат обыч но понимается именно страничная система.

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

окно (window);

область просмотра (viewport).

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

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

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

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

Окно (window) определяется четырьмя переменными в страничных коорди натах:

xWO — абсцисса начала координат (x origin).

yWO — ордината начала координат (y origin).

xWE — горизонтальные габариты окна (x extent).

yWE — вертикальные габариты окна (y extent).

Область просмотра (viewport) определяется четырьмя переменными в коорди натах устройства:

xVO — абсцисса начала координат (x origin).

yVO — ордината начала координат (y origin).

xVE — горизонтальные габариты области просмотра (x extent).

yVE — вертикальные габариты области просмотра (y extent).

70

Глава 2. GDI — графический интерфейс устройства

 

 

Точка (x, y) в страничной системе координат отображается на точку (x', y') в координатах устройства по следующим формулам:

x' = (x – xWO) xVE / xWE + xVO; y' = (y – yWO) yVE / yWE + yVO.

Существует несколько вариантов отображений логической области вывода

вфизическую область вывода.

Тождественное отображение. Окно и область просмотра задаются квартета ми (0, 0, 1, 1). В этом случае x' = x, y' = y, а страничные координаты идентичны координатам устройства.

Смещение. Окно определяется квартетом (0, 0, 1, 1), а область просмотра — квар тетом (dx, dy, 1, 1). В этом случае x' = x + dx, y' = y + dy. Каждая точка странич ного пространства при отображении в систему координат устройства смеща ется на величину (dx, dy).

Масштабирование. Окно определяется квартетом (0, 0, 1, 1), а область про смотра — (0, 0, mx, my). В этом случае x' = x mx, y' = y my. Каждая точка страничного пространства при отображении в систему координат устройства масштабируется с коэффициентами (mx, my).

Отражение. Окно определяется квартетом (0, 0, w, h), а область просмотра — квартетом (w, h, –w, –h). В этом случае x' = w x, а y' = h y. При отображении из страничной системы координат в координаты устройства рисунок может подвергаться зеркальному отражению относительно горизонтальной и верти кальной осей. Отражение позволяет использовать в страничной системе коор динат направления осей, которые отличаются от фиксированных направлений системы координат устройства.

Эти варианты отображений можно комбинировать в необходимой последова тельности.

В Win32 API имеются соответствующие функции для настройки страничной системы координат при помощи задания параметров окна и области просмотра:

BOOL SetWindowOrgEx

(

HDC hdc,

// дескриптор контекста устройства

int X,

// новая x-координата начала координат окна

int Y,

// новая y-координата начала координат окна

LPPOINT lpPoint // указатель на структуру типа POINT для

 

// сохранения прежнего начала координат окна

);

 

BOOL SetWindowExtEx

(

HDC hdc,

// дескриптор контекста устройства

int nXExtent,

// новый размер окна по оси X

int nYExtent,

// новый размер окна по оси Y

LPSIZE lpSize

// указатель на структуру типа SIZE для

 

// сохранения прежних размеров окна

);

 

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

BOOL SetViewportOrgEx (

HDC hdc, // дескриптор контекста устройства