4.4. Инструменты и средства визуализации
4.4.1. Карандаш (Pen)
CPen - карандаш - рисование линий определенной толщины, цвета и стиля.
CPen::CPen (int nPenStyle, int nWidth, COLORREF color) - Параметры:
nPenStyle - стиль карандаша:
 PS_SOLID - сплошная линия
PS_DASH - длинные штрихи
PS_DOT - короткие штрихи
PS_DASHDOT - штрих-пунктир
PS_DASHDOTDOT - двойной штрих-пунктир
nWidth - толщина карандаша в логических единицах
color - цвет карандаша, задается в виде структуры RGB(red, green, blue) , где red, green,
blue - величина красного, зеленого и синего цвета в диапазоне от 0 до 255.
Например, сплошной карандаш красного цвета толщиной 3 л.е.:
CPen pen(PS_SOLID, 3, RGB(255, 0, 0));
Пример создания карандаша для рисования оптической оси:
CPen pen(PS_DASHDOT, 1, RGB(0, 0, 0)); // создание штрих-пунктирного карандаша
CPen* old_pen=pDC->SelectObject(&pen); // запомнить старый карандаш
... // рисование оптической оси
pDC->SelectObject(old_pen); // вернуть старый карандаш
По умолчанию задан карандаш CPen pen(PS_SOLID, 1, RGB(0, 0, 0)).
4.4.2. Кисть (Brush)
CBrush - кисть - заливка замкнутых контуров определенным цветом и стилем. У кисти несколько конструкторов:
CBrush::CBrush (COLORREF color) - заливка сплошным цветом. Параметры:
color - цвет карандаша, задается в виде структуры RGB(red, green, blue).
CBrush::CBrush (int nIndex, COLORREF color) - заливка со штриховкой. Параметры:
nIndex - стиль штриховки:
HS_HORIZONTAL - горизонтальная штриховка
HS_VERTICAL - вертикальная штриховка
HS_CROSS - горизонтальная и вертикальная штриховка крест накрест
HS_DIAGCROSS - 45-градусная штриховка крест накрест
HS_BDIAGONAL - 45-градусная штриховка слева направо и сверху вниз
HS_FDIAGONAL - 45-градусная штриховка слева направо и снизу вверх
color - цвет карандаша, задается в виде структуры RGB(red, green, blue).
CBrush::CBrush( CBitmap* pBitmap) - заливка растровой картинкой. Параметры:
pBitmap - указатель на растровый массив.
Например, для рисования линзы можно создать кисть цвета cyan:
CBrush brush(RGB(0,255,255));
CBrush* old_brush=pDC->SelectObject(&brush);
По умолчанию задана кисть CBrush brush(RGB(255, 255, 255)).
4.4.3. Растровое изображение (Bitmap)
CBitmap (битовая карта) - прямоугольный массив
точек определенного размера, формирующие растровые изображения.
4.4.4. Шрифт (Font)
CFont - шрифт - создание шрифта определенной гарнитуры и размера символов.
CFont::CFont () - конструктор шрифта
BOOL CFont::CreatePointFont (int nPointSize, LPCSTR lpszFaceName, CDC* pDC = NULL) - создание шрифта определенной гарнитуры и размера символов. Параметры:
nPointSize - размер шрифта в десятых долях точки (т.е. для шрифта размером 12 pt - nPointSize=120 )
lpszFaceName - имя шрифта (например "Arial" )
pDC - указатель на контекст устройства.
Например, создание шрифта семейства Arial размером 10 pt:
CFont font;
font.CreatePointFont(100, "Arial", pDC);
CFont *old_font=pDC->SelectObject(font);
По умолчанию задан шрифт CFont font(80, "system").
4.4.5. Регионы (Regions)
CRgn - регионы - замкнутые фигуры, составленные из прямоугольников, многоугольников, эллипсов и их комбинаций для более сложных операций с графикой.
Создание регионов:
BOOL CRgn::CreateRectRgn (int x1, int y1, int x2, int y2) - создание прямоугольных регионов. Параметры:
(x1, y1) - координаты верхнего левого угла прямоугольника
(x2, y2) - координаты нижнего правого угла прямоугольника.
BOOL CRgn::CreateEllipticRgn (int x1, int y1, int x2, int y2) - создание эллиптических регионов. Параметры:
(x1, y1) - координаты верхнего левого угла описанного прямоугольника
(x2, y2) - координаты нижнего правого угла описанного прямоугольника.
BOOL CRgn::CreatePolygonRgn (LPPOINT lpPoints, int nCount, int nPolyFillMode) - создание регионов на базе многоугольников. Параметры:
lpPoints - массив координат вершин многоугольника
nCount - количество вершин многоугольника
nPolyFillMode - режим закраски (ALTERNATE или WINDING ).
BOOL CRgn::CreateRoundRectRgn (int x1, int y1, int x2, int y2, int x3, int y3) - создание регионов с закруглеными краями. Параметры:
(x1, y1) - координаты верхнего левого угла прямоугольника
(x2, y2) - координаты нижнего правого угла прямоугольника
(x3, y3) - ширина и высота эллипса, на основе которого строятся закругленные углы.
Регионы можно комбинировать и получать новые более сложные фигуры.
int CRgn::CombineRgn (CRgn* pRgn1, CRgn* pRgn2, int nCombineMode) - комбинирование регионов. Параметры:
pRgn1 - указатель на первый регион
pRgn2 - указатель на второй регион
nCombineMode - режим комбинирования:
RGN_AND - пересечение регионов
RGN_COPY - копия первого региона
RGN_DIFF - области первого региона, которые не пересекаются со вторым
RGN_OR - объединение обоих регионов
RGN_XOR - объединение обоих регионов исключая области пересечения.
BOOL CRgn::PtInRegion( int x, int y) - определяет попадание точки внуть региона. Параметры:
(x, y) - координаты точки.
Для рисование региона можно воспользоваться функциями:
BOOL CRgn::FillRgn (CRgn* pRgn) - рисование региона текущей кистью. Параметры:
pRgn - указатель на регион.
BOOL CRgn::FillRgn (CRgn* pRgn, CBrush* pBrush) - рисование региона. Параметры:
pRgn - указатель на регион
pBrush - указатель на кисть, которой закрашивается регион.
Пример рисования линзы при помощи регионов:
// x, y - координаты вершины линзы
// r1, r2 - радиусы кривизны 1-ой и 2-ой поверхностей линзы
// d - толщина линзы
// h = max(h1, h2) - световая высота линзы
CRgn lens, first, second;
float x1=x, x2=x+d;
// создание эллипса для первой поверхности
if(r1 > 0)
first.CreateEllipticRgn(x, y+r1, x+2*r1, y-r1);
else if(r1 < 0)
...
// создание эллипса для второй поверхности
if(r2 < 0)
second.CreateEllipticRgn(x+d-2*r2, y+r2, x+d, y-r2);
else if(r2 > 0)
...
// создание прямоугольника для верхних краев линзы, фасок и плоских поверхностей
lens.CreateRectRgn(x1, y+h, x2, y-h);
// пересечение первой поверхности и прямоугольника
if(r1 > 0)
lens.CombineRgn(&lens, &first, RGN_AND);
else if(r1 < 0)
...
// пересечение второй поверхности и прямоугольника
if(r2> 0)
lens.CombineRgn(&lens, &second, RGN_AND);
else if(r2< 0)
...
pDC->FillRgn(&lens, &brush);
4.4.6. Контуры (Paths)
CPaths (контуры) - используются для заполнения или выделения контура различных фигур.
Функции создания контура:
BOOL CDC::BeginPath( ) - начало контура
BOOL CDC::EndPath( ) - конец контура
Все функции рисования, которые находятся между BeginPath( ) и EndPath( ) объединяются в контур. Контур обязательно должен быть замкнутым, и далее с ним можно
производить следующие операции:
BOOL CDC::StrokePath( ) - обвести контур текущим карандашом
BOOL CDC::FillPath( ) - закрасить контур текущей кистью
BOOL CDC::StrokeAndFillPath( ) - обвести и закрасить контур текущими карандашом и кистью.
Пример рисования многоугольника при помощи контура:
// n - количество вершин
pDC->BeginPath(); // начало контура
pDC->MoveTo(0,100);
double fi=0;
for(int i=0; i<=n; i++) // цикл по вершинам
{
pDC->LineTo(int(100*sin(fi)), int(100*cos(fi)));
fi+=2*PI/n;
}
pDC->EndPath(); // конец контура
pDC->StrokeAndFillPath(); // обводка и закрашивание контура
|