4.2. Организация рисования
Процедура рисования осуществляется обычно в обработчике события WM_PAINT и состоит из следующих этапов:
4.2.1. Создание дескриптора устройства для рисования в окне
Если рисование реализуется самим же окном, то лучше воспользоваться контекстом, который создается следующим образом:
CPaintDC dc(this);
В других случаях, нужно получить контекст уcтройства для окна, в котором будет осуществляться рисование:
CDC* dc = wnd.GetDC();
Например, при рисовании на диалоговом окне можно создать специальный элемент рисования и рисовать на нем:
CDC* dc = m_pict.GetDC();
4.2.2. Установка системы координат
На этом этапе используются следующие функции базового класса CDC :
virtual int CDC::SetMapMode (int nMapMode) - определяет направления осей координат и логические единицы измерения для данной системы координат.
virtual CPoint CDC::SetViewportOrg (int x, int y) - осуществляет перенос начала координат физической области вывода.
virtual CPoint CDC::SetWindowOrg (int x, int y) - осуществляет перенос начала координат в логической системе координат.
virtual CSize CDC::SetVieportExt (int сx, int сy) - осуществляет настройку размеров физической области вывода.
virtual CSize CDC::SetWindowExt (int сx, int сy) - осуществляет установку логической системы координат.
Установка системы координат подробно описана в разделе "4.3. Установка системы координат".
4.2.3. Установка режимов рисования
На этом этапе используются функции базового класса CDC :
int CDC::SetBkMode (int nBkMode) - установка режимов закрашивания фона. Возможные значения параметра nBkMode :
OPAQUE - непрозрачный фон закрашивается текущим цветом фона
TRANSPARENT - прозрачный фон.
int CDC::SetROP2 (int nDrawMode) - установка режимов комбинирования цвета экрана и карандаша. Наиболее часто употребляемые значения параметра nDrawMode :
R2_COPYPEN - цвет карандаша
R2_NOTCOPYPEN - инверсный цвет по отношению к цвету карандаша
R2_NOT - инверсный цвет по отношению к экрану
R2_XORPEN - цвет фомируется как логическое XOR ("исключающее ИЛИ") цвета карандаша и цвета экрана.
4.2.4. Создание инструментов рисования
Для работы с инструментами рисования в библиотеке MFC предусмотрены следующие классы:
CPen::CPen (int nPenStyle, int nWidth, COLORREF color) - карандаш - рисование линий определенной толщины, цвета и стиля. Работа с карандашом подробно описана в разделе "4.4.1.
Карандаш (Pen)".
CBrush::CBrush (COLORREF color) или CBrush::CBrush (int nIndex, COLORREF color) - кисть - заливка замкнутых контуров определенным цветом и стилем.
Работа с кистью подробно описана в разделе "4.4.2. Кисть (Brush)".
CBitmap (битовая карта) - прямоугольный массив точек определенного размера, формирующие растровые изображения. Работа с битовой картой подробно описана в разделе "4.4.3.
Растровое изображение (Bitmap)".
BOOL CFont::CreatePointFont (int nPointSize, LPCSTR lpszFaceName) - шрифт - создание шрифта определенной гарнитуры и размера символов. Работа со шрифтами подробно описана
в разделе "4.4.4. Шрифт (Font)".
Regions - регионы - замкнутые фигуры, составленные из прямоугольников, многоугольников, эллипсов и их комбинаций для более сложных операций с графикой:
BOOL CRgn::CreateRectRgn (int x1, int y1, int x2, int y2) - создание прямоугольного региона
BOOL CRgn::CreateEllipticRgn (int x1, int y1, int x2, int y2) - создание эллиптического региона
BOOL CRgn::CreatePolygonRgn (LPPOINT lpPoints, int nCount, int nPolyFillMode) - создание региона на базе многоугольников
BOOL CRgn::CreateRoundRectRgn (int x1, int y1, int x2, int y2, int x3, int y3) - создание региона с закруглеными краями
int CRgn::CombineRgn (CRgn* pRgn1, CRgn* pRgn2, int nCombineMode) - комбинирование регионов
BOOL CRgn::PtInRegion (int x, int y) - определение попадания точки внуть региона.
Работа с регионами подробно описана в разделе "4.4.5. Регионы (Regions)".
СPaths (контуры) - используются для целей заполнения или выделения контура различных фигур. Работа с контурами подробно описана в разделе "4.4.6.
Контуры (Paths)".
4.2.5. Выбор графического инструмента в качестве текущего
Для выбора текущего инструмента можно воспользоваться полиморфной функцией SelectObject класса CDC , например:
CPen* oldPen = dc.SelectObject(&newPen);
При этом в переменной oldPen запоминаются параметры инструмента, которые были до этого.
4.2.6. Рисование
Рисование осуществляется с использованием следующих функций класса CDC :
BOOL CDC::TextOut (int x, int y, const CString& str) - вывод строки текста.
COLORREF CDC::SetPixel (int x, int y, COLORREF crColor) - рисование точки.
CPoint CDC::MoveTo (int x, int y) - перенос курсора к указанной точки без рисования.
BOOL CDC::LineTo (int x, int y) - рисование линии и перенос курсора от предыдущего положения курсора до указанной точки.
BOOL CDC::Rectangle (int x1, int y1, int x2, int y2) - рисование прямоугольника.
BOOL CDC::Ellipse (int x1, int y1, int x2, int y2) - рисование эллипса.
BOOL CDC::Arc (int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) - рисование эллиптической дуги.
BOOL CDC::Chord (int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) - рисование замкнутой эллиптической дуги.
BOOL CDC::Polyline (LPPOINT lpPoints, int nCount) - рисование ломаной линии.
BOOL CDC::Polygon (LPPOINT lpPoints, int nCount) - рисование многоугольника.
Инструменты рисования подробно описана в разделе "4.5. Функции для визуализации графических примитивов".
4.2.7. Возврат старого инструмента
Для корректной организации вложенных процедур рисования различных объектов необходимо следить за выбором и возвратом старых инструментов рисования:
dc.SelectObject(oldPen);
4.2.8. Пример организации рисования линзы в диалоговом окне
Для рисование в диалогом окне можно воспользоваться функцией OnPaint() , которая вызывается при необходимости перерисовки окна. В этой функции обычно уже есть сгенерированный код лдя
рисования иконки, после него можно добавлять свой. Для класса "Линза" можно создать функцию OnDraw() , которая будет рисовать линзу в устройстве, заданном контекстом pDC. Перед
вызовом функции рисования линзы необходимо узнать контекст устройства и установить систему координат. Здесь же можно вызывать функции рисования других объектов, например плоскости предметов, луча,
оптической оси и т.д.
void CTest4Dlg::OnPaint()
{
if (IsIconic())
{
... // рисование иконки
}
else
{
CDialog::OnPaint();
//-----------------------------------------------------------
// здесь можно добавлять свое рисование:
// получение контекста устройства для элемента диалогового окна
CDC* pDC=m_pict.GetDC();
// Установка системы координат
m_pict.GetClientRect(rect); // получить размеры области вывода
pDC->SetMapMode(MM_ISOTROPIC);
pDC->SetWindowExt(win_h*100, win_d*100);
pDC->SetViewportExt(rect.Width(), -rect.Height() );
pDC->SetViewportOrg(0, rect.Height()/2 );
// Установка режимов рисования - можно оставить значения по умолчанию
// Создание инструментов рисования
CBrush brush(RGB(0,255,255));
CPen pen(PS_SOLID , 1, RGB(0, 0, 255));
// Выбор графического инструмента в качестве текущего
CBrush* old_brush=pDC->SelectObject(&brush);
CPen* old_pen=pDC->SelectObject(&pen);
// вызов функции рисования линзы
lens.Draw(pDC);
// Возврат старого инструмента
pDC->SelectObject(old_brush);
pDC->SelectObject(old_pen);
}
}
|