- •КОНТЕКСТ УСТРОЙСТВА
- •Класс CDC и его производные
- •Объявление контекста
- •РАБОТА С ТЕКСТОМ
- •Вывод текста. Функция TextOut
- •Вывод текста в прямоугольнике отсечения. Функция ExtTextOut
- •Цвет фона. Функции GetBkColor, SetBkColor
- •Цвет символов текста. Функции GetTextColor, SetTextColor
- •Выравнивание текста. Функции GetTextAlign, SetTextAlign
- •Пример рисования текста
- •ЦВЕТОВАЯ СИСТЕМА RGB
- •ДИАЛОГОВОЕ ОКНО ВЫБОРА ЦВЕТА
- •Конструктор класса CColorDialog
- •Отображение диалогового окна. Функция DoModal
- •Получение выбранного цвета. Функция GetColor
- •Пример использования диалогового окно выбора цвета
- •МОДЕЛЬ ПЕРЬЕВОГО ПЛОТТЕРА
- •Перемещение карандаша. Функция MoveTo
- •Рисование отрезка. Функция LineTo
- •Рисование точки. Функция SetPixel
- •Получение цвета точки. Функция GetPixel
- •РИСОВАНИЕ ГРАФИЧЕСКИХ ПРИМИТИВОВ
- •Рисование прямоугольника. Функция Rectangle
- •Рисование округлённого прямоугольника. Функция RoundRect
- •Рисование эллипса. Функция Ellipse
- •Рисование эллиптической дуги. Функция Arc
- •Рисование эллиптической дуги и хорды. Функция Chord
- •Рисование ломаной линии. Функция Polyline
- •КАРАНДАШ. КЛАСС CPEN
- •Конструкторы класса СРеn
- •Создание карандаша. Функция CreatePen
- •Создание указателя на карандаш. Тип HPEN
- •Использование объекта. Функция SelectObject
- •Получение атрибутов объекта. Функция GetObject
- •НАСТРОЙКА РЕЖИМА ОТОБРАЖЕНИЯ
- •Выбор единиц измерения. Функция SetMapMode
- •Размер прямоугольника. Структура SIZE
- •Получение размеров клиентской области. Функция GetClientRect
- •Пример настройки режима отображения
- •КИСТЬ. КЛАСС CBRUSH
- •Конструкторы класса CBrush
- •Образец физической кисти. Структура LOGBRUSH
- •Создание кисти
- •Пример создания и использования кисти
- •Создание точечного рисунка. Функция CreateBitmap
- •Создание ресурса точечного рисунка
- •Загрузка ресурса точечного рисунка. Функция LoadBitmap
Лекция 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 В результате работы этого фрагмента кода в форме будет выведен следующий рисунок.
Выжол Ю.А.