Вернуться наверх
aco.ifmo.ru photonic
вернуться в оглавление предыдущая глава предыдущий параграф следующий параграф следующая глава


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);
    }
}