Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VC Лекции PDF / VC 15 Лек Графика.pdf
Скачиваний:
37
Добавлен:
15.02.2015
Размер:
651.21 Кб
Скачать

Лекция 14

Работа с графикой

13

dc.Rectangle ( &rt ) ;

// рисуем прямоугольник

 

Получение атрибутов объекта. Функция GetObject

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

int GetObject ( int nCount , LPVOID lpObject ) const ;

Функция возвращает количество скопированных байтов или ноль, если произошла ошибка.

Параметры:

 

lpObject

указатель на буфер, который получает информацию;

nCount

определяет количество байтов для копирования в буфер lpObject.

Функция заполняет буфер данными, которые определяют указанный объект. Тип буфера определяется видом графического объекта в соответствии со следующим списком:

Тип объекта

Тип буфера

CPen

LOGPEN

CBrush

LOGBRUSH

CFont

LOGFONT

CBitmap

BITMAP

CPalette

WORD

CRgn

Не поддерживается

НАСТРОЙКА РЕЖИМА ОТОБРАЖЕНИЯ

Все функциями вывода используют координаты заданные в логических единицах. По умолчанию в качестве логических координат используются физические координаты текущего окна. Физические координаты – это расстояние точки от верхнего левого угла окна в пикселях. При этом начало координат (точка x = 0, y = 0 ) располагается в верхнем левом углу, x-координата растёт слева направо, а y-координата – сверху вниз.

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

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

Выбор единиц измерения. Функция SetMapMode

Назначение: устанавливает направление осей и определяет логические единицы, т.е. единицы измерения для задаваемой системы координат.

virtual int SetMapMode ( int nMapMode ) ;

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

Параметры:

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

MM_TEXT

логическая единица равна одному пикселю, ось у направлена вниз (режим

 

по умолчанию)

MM_TWIPS

логическая единица равна 1 твипу), ось у направлена вверх (20 твипов = 1

 

типографскому пункту, 1440 твипов = 1 дюйму

MM_HIENGLISH

логическая единица равна 0.001 дюйма, ось у направлена вверх

MM_HIMETRIC

логическая единица равна 0.01 миллиметра, ось у направлена вверх

MM_LOENGLISH

логическая единица равна 0.01 дюйма, ось у направлена вверх

MM_LOMETRIC

логическая единица равна 0.1 миллиметра, ось у направлена вверх

MM_ISOTROPIC

режим позволяет настраивать с помощью функций SetWindowExt и Set-

 

ViewportExt размерность осей и их направления, однако размерность оси х

 

равна размерности оси у

Выжол Ю.А.

Лекция 14

Работа с графикой

14

MM_ANISOTROPIC

режим позволяет настраивать с помощью функций SetWindowExt и Set-

 

ViewportExt размерность осей координат и их направления (отдельно для

 

каждой)

 

Задание произвольных единиц измерения. Функции SetViewportExt иSetWindowExt

Для настройки размеров физической области вывода используются функции: virtual CSize SetViewportExt ( int cx , int cy ) ;

virtual CSize SetViewportExt ( SIZE size ) ;

Для настройки размеров логической области вывода используются функции: virtual CSize SetWindowExt ( int cx , int cy ) ;

virtual CSize SetWindowExt ( SIZE size ) ;

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

Размер прямоугольника. Структура SIZE

Структура SIZE определяет размер прямоугольника и объявлена в библиотеке MFC следующим образом:

typedef struct tagSIZE

{

LONG

cx;

// ширина прямоугольника

LONG

cy;

// высота прямоугольника

} SIZE, *PSIZE;

 

 

В библиотеке MFC определён также класс CSize, который подобен структуре SIZE.

Этот класс происходит от структуры SIZE. Это означает, что вы можете передавать объект типа CSize в качестве параметра функции типа SIZE и наоборот.

Настройка начала координат. Функции SetViewportOrg и SetWindowOrg

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

Для настройки начала координат физической области вывода используются функции: virtual CPoint SetViewportOrg ( int x , int y ) ;

virtual CPoint SetViewportOrg ( POINT point ) ;

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

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

CPoint SetWindowOrg ( int x , int у ) ; CPoint SetWindowOrg ( POINT point ) ;

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

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

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

CPoint GetViewportOrg ( ) const ; CPoint GetWindowOrg ( ) const ;

Получение размеров клиентской области. Функция GetClientRect

Клиентской областью называется вся площадь диалогового окна или элемента управления за исключением его границы. Рисунок может располагаться во всей клиентской области. Поэтому при формировании рисунка необходимо знать её размеры. Для получения размеров клиентской области можно ис-

Выжол Ю.А.

Лекция 14

Работа с графикой

15

пользовать функцию GetClientRect, которая определена в классе CWnd и у всех его потомков соответственно. Функция копирует координаты клиентской области в структуру, на которую указывает параметр.

void GetClientRect ( LPRECT lpRect ) const ;

lpRect указатель на структуру типа RECT или объект типа CRect. После вызова функции поля left и top будут равны 0, а поля right и bottom будут содержать ширину и высоту окна в пикселях.

Пример настройки режима отображения

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

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

void CMapeModeDlg::OnPicture()

{

const n = 1000 ;

// размер логической области

RECT rtWin ;

// прямоугольник клиентской области

//создаём совместимый контекст устройства и связываем его с текущим окном

CClientDC dc ( this ) ;

//получаем параметры клиентской области в пикселях

GetClientRect ( &rtWin ) ;

//переносим начало координат в середину физической области dc.SetViewportOrg ( rtWin.right / 2 , rtWin.bottom / 2 ) ;

//устанавливаем флаг произвольной шкалы, как по оси X, так и по оси Y dc.SetMapMode ( MM_ANISOTROPIC ) ;

//устанавливаем размеры логической области dc.SetWindowExt ( n , n ) ;

//устанавливаем размеры физической области равными размерам клиентской области

//и изменяем направление оси Y

dc.SetViewportExt ( rtWin.right , -rtWin.bottom ) ;

dc.Rectangle ( 300 , 300 , -200 , -200 ) ;

// рисуем прямоугольник

// рисуем оси координат

 

CPen penBlack ( PS_SOLID , 5 , RGB(0,0,0)) ;

// объявляем сплошной чёрный карандаш

dc.SelectObject ( &penBlack ) ;

// выбираем карандаш для использования

dc.MoveTo (-400 , 0 ) ; dc.LineTo ( 400 , 0 ) ;

// рисуем ось X

dc.MoveTo ( 0 ,-400 ) ; dc.LineTo ( 0 , 400 ) ;

// рисуем ось Y

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

 

COLORREF cr = dc.GetPixel (-499 , 499 ) ;

// определяем цвет фона окна

dc.SetBkColor ( cr ) ;

// устанавливаем цвет фона текста

dc.TextOut (410 , 25 ,"X") ;

// рисуем подпись оси X

dc.TextOut (-10 , 450 ,"Y") ;

// рисуем подпись оси Y

}

 

Приведенный код выполняется в классе CMapeModeDlg при щелчке на кнопке IDC_PICTURE В результате работы этого фрагмента кода в форме будет выведен следующий рисунок.

Выжол Ю.А.