Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
3 семестр, WinAPI, MFC.pdf
Скачиваний:
370
Добавлен:
15.06.2014
Размер:
6.17 Mб
Скачать

Режимы масштабирования и преобразования

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

Физические координаты имеют непосредственное отношение к физическому устройству вывода. В качестве единицы измерения длины всегда используется пиксел.. .

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

Режим отображения - это атрибут контекста устройства, влияющий на используемую функциями GDI систему координат.

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

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

Установки режима отображения - функция SetMapMode. Определение режима отображения - функции GetMapMode.

Поддерживаемые GDI режимы отображения с ограничениями:

MM_TEXT – начало системы логических координат находится в верхнем левом углу, и значения вертикальных координат увеличиваются вниз.

MM_LOENGLISH – начало отсчета находится в левом нижнем углу, и значения вертикальных координат увеличиваются вверх.

MM_HIENGLISH – начало отсчета находится в левом нижнем углу, и значения вертикальных координат увеличиваются вверх.

MM_LOMETRIC – начало отсчета находится в левом нижнем углу, и значения вертикальных координат увеличиваются вверх.

MM_HIMETRIC – начало отсчета находится в левом нижнем углу, и значения вертикальных координат увеличиваются вверх.

MM_TWIPS – начало отсчета находится в левом нижнем углу, и значения вертикальных координат увеличиваются вверх.

MM_ISOTROPIC – можно выбирать произвольное направление осей координат и произвольный (но одинаковый) масштаб для осей.

GDI поддерживает только один режим отображения без ограничений, для которого все сказанное в этом пункте относится полностью – режим MM_ANISOTROPIC - самый универсальный режим. Он позволяет устанавливать произвольное направление осей координат, произвольный масштаб для осей координат, причем для каждой оси можно устанавливать свой собственный масштаб.

Преобразование логических координат в физические координаты: xViewport = (xWindow — xWinOrg) × (xViewExt/xWinExt) + xViewOrg yViewport = (yWindow — yWinOrg) × (yViewExt/yWinExt) + yViewOrg

или с помощью функции:

LPtoDP (hdc, pPoints, iNumber);

Преобразование физических координат в логические координаты:

xWindow = (xViewport — xViewOrg) × (xWinExt/xViewExt) + xWinOrg yWindow = (yViewport — yViewOrg) × (yWinExt/yViewExt) + yWinOrg

где

(xWindow, yWindow) — логическая точка для преобразования; (xViewport, yViewport) — преобразованная точка в координатах устройства. (xWinOrg, yWinOrg) — начало координат окна в логических координатах; (xWinExt, yWinExt) — протяженность окна в логических координатах;

(xViewExt, yViewExt) — протяженность области вывода в координатах устройства.

илиспомощьюфункции:

DPtoLP (hdc, pPoints, iNumber);

Метафайл

Это набор вызовов команд GDI, сохраненный в двоичном виде.

Использование: для разделения изображений между программами посредством буфера обмена(clipboard)., хотя они могут также быть сохранены на диске в виде файлов.

Формат .WMF

Создание: при создании контекста устройств метафайла – вызов функции CreateMetaFile во время обработки сообщения WM_CREATE.

hdcMeta = CreateMetaFile (NULL) ;

hmf = CloseMetaFile (hdcMeta) ;

Удаление: процедура удаления реализуется в теле обработчика сообщения

WM_DESTROY с помощью функции DeleteMetaFile.

Сохранение на диске: при создании контекста устройств метафайла в функции CreateMetaFile параметр NULL заменяется именем файла во время обработки сообщения

WM_CREATE.

hdcMeta = CreateMetaFile (szFileName) ;

Удаление описателя с помощью DeleteMetaFile, но файл на диске остаётся.

Получения описателя метафайла, соответствующего дисковому файлуhmf = GetMetaFile (szFileName);

Удалениедисковогофайлаremove (szFileName);

Формат .EMF(расширенный метафайл)

Создание: при создании контекста устройств метафайла – вызов функции

CreateEnhMetaFile во время обработки сообщения WM_CREATE.

hdcEMF = CreateEnhMetaFile (NULL, NULL, NULL, NULL) ;

hemf = CloseEnhMetaFile (hdcEMF) ;

Удаление: процедура удаления реализуется в теле обработчика сообщения

WM_DESTROY с помощью функции DeleteEnhMetaFile.

Сохранение на диске: при создании контекста устройств метафайла в функции CreateEnhMetaFile параметр NULL заменяется именем файла во время обработки сообщения WM_CREATE.

hdcEMF = CreateEnhMetaFile (NULL, szFileName, NULL, NULL) ;

hemf = CloseEnhMetaFile (hdcEMF) ; DeleteEnhMetaFile (hemf) ;

Получения описателя метафайла, соответствующего дисковому файлуhemf = GetMetaFile (szFileName);

Регионы

Это описание области дисплея, состоящей из комбинации прямоугольников, многоугольников и эллипсов.

Использование: для рисования или для отсечения (ограничения рисования в заданной области рабочей зоны).

Создание: при создании региона, Windows возвращает описатель региона, имеющий тип HRGN. Регионы задаются 2 способами(рассмотрим на примере прямоугольника-простейшего региона)

hRgn = CreateRectRgn (xLeft, yTop, xRight, yBottom);

или

hRgn = CreateRectRgnIndirect (&rect);

Функциирисования:

FillRgn закрашиваетрегионзаданнойкистью;

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

InvertRgn инвертирует все пиксели в регионе, устанавливая все единичные биты в ноль, а нулевые

— в единицу. Таким образом, функция переводит белую область в черную, черную — в белую, зеленую — в фиолетовую.

PaintRgn закрашивает внутреннюю область региона текущей выбранной в контекст устройства

кистью.

Удаление: после завершения работы с регионом при помощи функции DeleteObject

DeleteObject (hRgn);

Отсечение.

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

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

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

Создание: Приложение может выбрать созданную область отсечения в контекст устройства, вызвав функцию SelectObject или SelectClipRgn. Существующие области отсечения можно объединять с новыми областями при помощи функции SelectClipRgnExt.

или

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

InvalidateRect (hwnd, NULL, TRUE);

GetUpdateRect – получениекоординатнедействительногопрямоугольника.

ValidateRect – делаетдействительнымпрямоугольникврабочейобласти

длярегионов:

InvalidateRgn (hwnd, hRgn, bErase);

ValidateRgn (hwnd, hRgn);

Удаление: процедура удаления реализуется в теле обработчика сообщения WM_DESTROY с помощью функции DeleteObject

Путь

Это набор отрезков и кривых, хранящихся внутри GDI.

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

Создание: для определения пути вызывается функция BeginPath (hdc)- любая линия запоминается как часть пути и не воспроизводится в контексте устройства.

Функции для создания связанных линий:

LineTo

PolylineTo

BezierTo

EndPath (hdc) - завершениеопределенияпути.

Функции, уничтожающиеопределениепути(послезавершения)

StrokePath (hdc); - рисуетпуть, используятекущееперо;

FillPath (hdc); - закрашиваетпуть, используятекущуюкисть, всоответствиистекущим режимомзакрашиваниямногоугольников;

StrokeAndFillPath (hdc); - тожечто StrokePath иFillPath hRgn = PathToRegion (hdc);

SelectClipPath (hdc, iCombine);

Удаление: процедура удаления реализуется в теле обработчика сообщения WM_DESTROY с помощью функции DeleteObject

Палитры