Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
dc. MoveTo( 0, 0 ); dc. LineTo( 0, 100 ); |
При выводе нескольких соединяющихся отрезков MoveTo достаточно вызвать только для одного из концов первого отрезка, например:
dc. MoveTo( 0, 0 ); dc. LineTo( 0, 100 ); dc. LineTo( 100, 100 ); |
Несколько отрезков можно построить одним вызовом Polyline или PolylineTo (отличие между ними в том, что PolylineTo пользуется текущей позицией, а Polyline – нет). Например, квадрат можно нарисовать так:
POINT aPoint[5] = { 0, 0, 0, 100, 100, 100, 100, 0, 0, 0 }; dc. Polyline( aPoint, 5 ); |
или с помощью PolylineTo:
dc. MoveTo( 0, 0 ); POINT aPoint[4] = { 0, 100, 100, 100, 100, 0, 0, 0 }; dc. PolylineTo( aPoint, 4 ); |
Для рисования дуг окружностей и эллипсов предназначена функция CDC::Arc. В качестве параметров ей передаются координаты описывающего эллипс прямоугольника и координаты начальной и конечной точек дуги (эти точки задают углы для вырезания дуги из эллипса, поэтому могут точно на него не попадать). Ниже приведен пример для рисования левой верхней четверти эллипса шириной 200 единиц и высотой 100 единиц:
CRect rect(0, 0, 200, 100); CPoint point1(0, -500); CPoint point2(-500, 0); dc. Arc(rect, point1, point2); |
Важная особенность всех функций GDI для рисования отрезков и кривых в том, что последняя точка не рисуется. Т. е. при рисовании отрезка из точки (0, 0) в точку (100, 100):
dc. MoveTo( 0, 0 ); dc. LineTo( 100, 100 ); |
пиксел (100, 100) принадлежать отрезку не будет. Если необходимо, чтобы последний пиксел тоже был закрашен цветом отрезка, это можно сделать с помощью функции CDC::SetPixel, предназначенной для закраски отдельных пикселов.
2.2 Рисование эллипсов, многоугольников и других фигур
В GDI есть функции для рисования более сложных примитивов, чем отрезки и кривые. Некоторые из них перечислены в табл. 5.6.
Таблица 5.6. Функции-члены CDC для рисования замкнутых фигур
Функция | Описание |
Chord | Замкнутая фигура, образованная пересечением эллипса и отрезка |
Ellipse | Эллипс или окружность |
Pie | Сектор круговой диаграммы |
Polygon | Многоугольник |
Rectangle | Прямоугольник |
RoundRect | Прямоугольник с закругленными углами |
Функциям GDI, рисующим замкнутые фигуры, передаются координаты описывающего прямоугольника. Например, чтобы функцией Ellipse нарисовать окружность, надо указать не центр и радиус, а описывающий квадрат, например:
dc. Ellipse( 0, 0, 100, 100 ); |
Координаты описывающего прямоугольника можно передавать в виде структуры RECT или как объект CRect:
CRect rect( 0, 0, 100, 100 ); dc. Ellipse( rect ); |
Как и последняя точка отрезка, нижняя строка и правый столбец описывающего прямоугольника не заполняются. Т. е. при вызове CDC::Rectangle:
dc. Rectangle( 0, 0, 8, 4 ); |
результат будет такой, как на рис. 5.2.

Рис. 5.2. Прямоугольник, нарисованный вызовом dc. Rectangle(0,0,8,4)
2.3 Перья GDI и класс CPen
Для рисования отрезков, кривых и контуров фигур GDI использует объект-перо, выбранное в контексте устройства. По умолчанию перо рисует сплошную черную линию толщиной 1 пиксел. Изменить вид линий можно, если создать соответствующий объект-перо и выбрать его в контексте устройства функцией CDC::SelectObject.
В MFC перья GDI представляются в виде объектов класса CPen. Проще всего указать характеристика пера в конструкторе CPen, например:
CPen pen( PS_SOLID, 1, RGB(255, 0, 0) ); |
Второй способ: создать неинициализированный объект CPen, а затем создать перо GDI вызовом CPen::CreatePen:
CPen pen; pen. CreatePen( PS_SOLID, 1, RGB(255, 0, 0) ); |
Третий способ: создать неинициализированный объект CPen, заполнить структуру LOGPEN характеристиками пера, а затем вызвать CPen::CreatePenIndirect для создания пера GDI:
CPen pen; LOGPEN lp; lp. lopnStyle = PS_SOLID; lp. lopnWidth. x = 1; lp. lopnColor = RGB(255, 0, 0); pen. CreatePenIndirect(&lp); |
В структуре LOGPEN поле lopnWidth имеет тип POINT, но координата y не используется, а x задает толщину пера.
Функции CreatePen и CreatePenIndirect возвращают TRUE, если перо было успешно создано (FALSE – если перо создать не удалось).
У пера есть три параметра: стиль, толщина и цвет. Возможные стили показаны на рис. 5.3.

Рис. 5.3. Стили пера.
Стиль PS_INSIDEFRAME предназначен для рисования линий, которые всегда располагаются внутри описывающего прямоугольника фигуры. Допустим, вы рисуете окружность диаметром 100 единиц пером PS_SOLID толщиной 20 единиц. Тогда реальный диаметр окружности по внешней границе будет 120 единиц (см. рис.5.4). Если ту же окружность нарисовать пером стиля PS_INSIDEFRAME, то диаметр окружности будет действительно 100 единиц. На рисование отрезков и других примитивов, не имеющих описывающего прямоугольника, стиль PS_INSIDEFRAME не влияет.

Рис. 5.4. Стиль пера PS_INSIDEFRAME.
Стиль PS_NULL бывает нужен для рисования фигур без контура (например, эллипсов), только с заполнением внутренней области.
Толщина пера задается в логических единицах. Перья стилей PS_DASH, PS_DOT, PS_DASHDOT и PS_DASHDOTDOT должны быть обязательно толщиной 1 единица. Если задать толщину 0 единиц, то будет создано перо шириной 1 пиксел независимо от режима преобразования координат.
Чтобы использовать новое перо, его надо выбрать в контексте устройства. Например, чтобы нарисовать эллипс красным пером толщиной 10 единиц, можно выполнить следующие действия:
CPen pen( PS_SOLID, 10, RGB(255, 0, 0) ); CPen* pOldPen = dc. SelectObject( &pen ); dc. Ellipse( 0, 0, 100, 100 ); |
2.4 Кисти GDI и класс CBrush
По умолчанию внутренняя область замкнутых фигур (Rectangle, Ellipse и т. п.) заполняется белыми пикселами. Цвет и стиль заливки определяется параметрами кисти, выбранной в контексте устройства.
В MFC кисть представляется классом CBrush. Бывают три типа кистей: сплошные, штриховые и шаблонные. Сплошные кисти рисуют одним цветом. Для штриховых кистей есть 6 предопределенных стилей, они чаще всего используются в инженерных и архитектурных чертежах (рис. 5.5). Шаблонные кисти рисуют путем повторения небольшой битовой карты. У класса CBrush есть конструкторы для создания кистей каждого типа.

Рис. 5.5. Стили штриховых кистей.
Для создания сплошной кисти в конструкторе CBrush достаточно указать значение цвета:
CBrush brush( RGB(255, 0, 0) ); |
или создать кисть в два этапа (сначала объект MFC, затем объект GDI):
CBrush brush; brush. CreateSolidBrush( RGB(255, 0, 0) ); |
При создании штриховых кистей в конструкторе CBrush указываются стиль и цвет кисти, например:
CBrush brush( HS_DIAGCROSS, RGB(255, 0, 0) ); |
или:
CBrush brush; brush. CreateHatchBrush( HS_DIAGCROSS, RGB(255, 0, 0) ); |
При рисовании штриховой кистью GDI заполняет "пустые" места цветом фона (по умолчанию белый, его можно изменить функцией CDC::SetBkColor или включить/выключить заполнение фона режимом OPAQUE или TRANSPARENT с помощью CDC::SetBkMode). Например, заштрихованный квадрат со стороной 100 единиц можно нарисовать так:
CBrush brush( HS_DIAGCROSS, RGB (255, 255, 255) ); dc. SelectObject( &brush ); dc. SetBkColor( RGB(192, 192, 192) ); dc. Rectangle( 0, 0, 100, 100 ); |
2.5 Отображение текста
В предыдущей лекции уже упоминался один из способов вывода текста в окно с помощью функции CDC::DrawText. Ей можно указать прямоугольник, внутри которого выводить текст, и флаги, указывающие, как именно располагать текст внутри прямоугольника. Например, для вывода текста в виде одной строки по центру прямоугольника rect использовался вызов:
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |


