Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

dc. SetBkMode( TRANSPARENT );

Атрибуты CDC чаще всего изменяются с помощью функции SelectObject. Она предназначена для "выбора" в контексте устройства объектов GDI 6-ти типов:

·  перья (pens)

·  кисти (brushes)

·  шрифты (fonts)

·  битовые карты (bitmaps)

·  палитры (palettes)

·  области (regions).

В MFC перья, кисти и шрифты представлены классами CPen, CBrush и CFont. Свойства пера "по умолчанию": сплошная черная линия толщиной 1 пиксел; кисть "по умолчанию": сплошная белая; шрифт "по умолчанию": пропорциональный высотой примерно 12 пт. Вы можете создавать объекты-перья, кисти и шрифты с нужными вам свойствами и выбирать их в любом контексте устройства.

Допустим, динамически были созданы объекты pPen и pBrush – черное перо толщиной 10 пикселов и сплошная красная кисть. Для рисования эллипса с черным контуром и красным заполнением можно вызвать следующие функции-члены:

dc. SelectObject( pPen );

dc. SelectObject( pBrush );

dc. Ellipse( 0, 0, 100, 100 );

Функция-член SelectObject перегружена для работы с указателями на различные объекты GDI. Она возвращает указатель на предыдущий выбранный в контексте устройства объект того же типа, что и объект, переданный функции в качестве параметра.

1.2 Режимы преобразования координат

Один из самых сложных для освоения аспектов GDI – применение режимов преобразования координат. Режим преобразования координат – это атрибут контекста устройства, задающий способ пересчета логических координат в физические координаты устройства. Логические координаты передаются функциям рисования CDC. Физические координаты – это координаты пикселов в экранном окне или на листе принтера (т. е. на поверхности изображения).

НЕ нашли? Не то? Что вы ищете?

Допустим, вызывается функция Rectangle:

dc. Rectangle( 0, 0, 200, 100 );

Нельзя сказать, что эта функция нарисует прямоугольник шириной 200 пикселов и высотой 100 пикселов. Она нарисует прямоугольник шириной 200 логических единиц и высотой 100 единиц. В режиме преобразования координат по умолчанию, MM_TEXT, 1 логическая единица равна 1-му пикселу. В других режимах масштаб может быть иным (см. табл. 5.3). Например, в режиме MM_LOMETRIC 1 логическая единица равна 1/10 мм. Следовательно, в показанном вызове Rectangle будет нарисован прямоугольника шириной 20 мм и высотой 10 мм. Режимы, отличные от MM_TEXT, удобно применять для рисования в одинаковом масштабе на различных устройствах вывода.

Таблица 5.3. Режимы преобразования координат, поддерживаемые модулем GDI

Константа для обозначения режима

Расстояние, соответствующее логической единице

Ориентация координатных осей

MM_TEXT

1 пиксел

x вправо, у вниз

MM_LOMETRIC

0.1 мм

x вправо, у вверх

MM_HIMETRIC

0.01 мм

x вправо, у вверх

MM_LOENGLISH

0.01 дюйма

x вправо, у вверх

MM_HIENGLISH

0.001 дюйма

x вправо, у вверх

MM_TWIPS

1/1440 дюйма (0.0007 дюйма)

x вправо, у вверх

MM_ISOTROPIC

Определяется пользователем (масштаб по осям x и y одинаков)

Определяется пользователем

MM_ANISOTROPIC

Определяется пользователем (масштаб по осям x и y задается независимо)

Определяется пользователем

Система координат в режиме MM_TEXT показана на рис. 5.1. Начало координат располагается в левом верхнем углу поверхности изображения (в зависимости от контекста устройства, это может быть левый верхний угол экрана, окна, клиентской области окна). Ось х направлена вправо, ось y вниз, 1 логическая единица равна 1-му пикселу. В остальных, "метрических", системах ось y направлена вверх, так что система координат оказывается правой, но начало координат по умолчанию всегда помещается в левый верхний угол поверхности изображения.

Рис. 5.1. Система координат в режиме MM_TEXT.

1.3 Функции преобразования координат

Для преобразования логических координат в координаты устройства (физические координаты) предназначена функция CDC::LPtoDP. Для обратного преобразования есть функция CDC::DPtoLP.

Допустим, надо вычислить координаты центра клиентской области окна в физических координатах. Для этого не требуется никаких преобразований, т. к. размеры клиентской области в пикселах возвращает функция CWnd::GetClientRect:

CRect rect;

GetClientRect( &rect );

CPoint point( rect. Width()/2, rect. Height()/2 );

Для вычисления координат этой точки в режиме MM_LOMETRIC потребуется функция DPtoLP:

CRect rect;

GetClientRect( &rect );

CPoint point( rect. Width()/2, rect. Height()/2 );

CClientDC dc( this );

dc. SetMapMode( MM_LOMETRIC );

dc. DPtoLP( &point );

Функции LPtoDP и DPtoLP часто применяются при обработке сообщений мыши. Windows помещает в структуру сообщения координаты указателя в физической системе координат. Поэтому, если вы ходите "нарисовать мышью" прямоугольник в режиме MM_LOMETRIC, то перед рисованием необходимо преобразовать координаты указателя из физических координат устройства в логические координаты контекста.

Иногда Windows-программисты употребляют термины "клиентские координаты" и "экранные координаты". Клиентские координаты – это физические координаты, заданные относительно левого верхнего угла клиентской области окна. Экранные координаты – это физические координаты, заданные относительно левого верхнего угла экрана. Преобразование между двумя этими системами выполняется с помощью функций CWnd::ClientToScreen и CWnd::ScreenToClient.

1.4 Изменение положения начала координат

По умолчанию во всех режимах преобразования координат начало логической системы координат располагается в левом верхнем углу поверхности изображения. При работе с правыми системами координат м. б. удобнее поместить начало системы в другую точку, например, в центр или левый нижний угол окна. Для этого можно использовать одну из двух функций: CDC::SetWindowOrg (смещение левого верхнего угла поверхности изображения) или CDC::SetViewportOrg (смещение начала логической системы координат).

Предположим, требуется поместить начало логической системы координат в центр окна. Это можно сделать так (считая, что dc – объект подкласса CDC):

CRect rect;

GetClientRect( &rect );

dc. SetViewportOrg( rect. Width()/2, rect. Height()/2 );

1.5 Получение характеристик устройства

Иногда бывает полезно узнать характеристики устройства, с которым связан контекст. Для этого предназначена функция CDC::GetDeviceCaps. Например, получить ширину и высоту экрана (например, 1024х768) можно так:

CClientDC dc( this );

int cx = dc. GetDeviceCaps( HORZRES );

int cy = dc. GetDeviceCaps( VERTRES );

Некоторые возможные параметры функции GetDeviceCaps приведены в табл. 5.4.

Таблица 5.4. Часто используемые параметры функции GetDeviceCaps

Параметр

Значение, возвращаемое функцией GetDeviceCaps

HORZRES

Ширина поверхности изображения, в пикселах

VERTRES

Высота поверхности изображения, в пикселах

HORZSIZE

Ширина поверхности изображения, в миллиметрах

VERTSIZE

Высота поверхности изображения, в миллиметрах

LOGPIXELSX

Количество пикселов на логический дюйм по горизонтали

LOGPIXELSY

Количество пикселов на логический дюйм по вертикали

NUMCOLORS

Для дисплея – количество статических цветов, для принтера или плоттера – количество поддерживаемых цветов

TECHNOLOGY

Получение битовых флагов, идентифицирующих тип устройства – дисплей, принтер, плоттер и др.

2. Рисование графических примитивов с помощью функций GDI

2.1 Рисование отрезков и кривых

Основные (хотя и не все) функции-члены CDC, предназначенные для рисования отрезков и кривых, приведены в таблице 5.5.

Таблица 5.5. Функции-члены CDC для рисования отрезков и кривых

Функция

Назначение

MoveTo

Задает текущую позицию

LineTo

Рисует отрезок из текущей позиции в заданную точку и смещает в нее текущую позицию

Polyline

Последовательно соединяет набор точек отрезками

PolylineTo

Соединяет набор точек отрезками прямых, начиная с текущей позиции. Текущая позиция смещается в последнюю точку набора.

Arc

Рисует дугу

ArcTo

Рисует дугу и смещает текущую позицию в конец дуги

PolyBezier

Рисует один или несколько сплайнов Безье

PolyBezierTo

Рисует один или несколько сплайнов Безье и помещает текущую позицию в конец последнего сплайна

PolyDraw

Рисует набор отрезков и сплайнов Безье через набор точек и смещает текущую позицию в конец последнего отрезка или сплайна

Для рисования отрезка надо поместить текущую позицию в один из концов отрезка и вызвать LineTo с координатами второго конца:

Из за большого объема этот материал размещен на нескольких страницах:
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