Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 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 |


