Контекст устройства. Работа с текстом. Диалоговое окно выбора цвета. Настройка режима отображения. Точечный рисунок. Класс CBitmap, страница 8

Значение последних четырёх флагов действительно, если ширина пера nWidth больше 1. В этом случае используется флаг PS_SOLID.

nWidth                 определяет ширину пера. Если это значение составляет 0, то ширина пера равна 1.

crColor                определяет цвет пера.

Пример: создаём синий карандаш толщиной 3 единицы, который рисует сплошную линию.

         CPen penBlue ( PS_SOLID , 3 , RGB ( 0 , 0 , 255 )) ;

Третья версия конструктора предназначена для создания объектов класса с одновременным созданием карандашей Windows.

CPen ( int nPenStyle, int nWidth , const LOGBRUSH* pLogBrush , int nStyleCount = 0 , const DWORD* lpStyle = NULL );

Создание карандаша. Функция CreatePen

Если при создании объекта “карандаш” использован первый конструктор, то определить его параметры можно с помощью функции CreatePen. Функция CreatePenсоздает логический карандаш, которая имеет указанный стиль, ширину и цвет. Прототип этой функции имеет следующий вид:

HPEN CreatePen ( int nPenStyle , int nWidth , COLORREF crColor ) ;

Возвращаемое значение: указатель на карандаш, если функция успешно выполнена, и недействительное значение NULL в противном случае.

Параметры: те же, что и у второго конструктора класса CPen.

Пример: создаём красный карандаш толщиной 1 единица, который рисует линию из длинных штрихов.

         CPen  penRed ;

         penRed.CreatePen ( PS_DASH , 0 , RGB ( 255 , 0 , 0 )) ;

Для каждой переменой типа CPen функция CreatePen может быть вызвана только один раз, т.е. параметры экземпляра класса карандаша нельзя изменить в ходе программы, но можно создать несколько карандашей и пользоваться ими по очереди.

Создание указателя на карандаш. Тип HPEN

В библиотеке MFC определён тип указателя на карандаш HPEN. Функция CreatePen может быть также использована для инициализации указателя на карандаш, который удобно использовать при работе с графикой.

Пример: создаём указатель на синий карандаш толщиной 3 единицы, который рисует сплошную линию.

         HPEN hPenBlue = CreatePen ( PS_SOLID , 3 , RGB ( 0 , 0 , 255 )) ;

Использование объекта. Функция SelectObject

Контекст устройства содержит несколько объектов (карандаш, кисть, шрифт, растровую картинку и область отсечения) с параметрами, заданными по умолчанию. Карандаш, например, по умолчанию чёрный сплошной единичной толщины. Чтобы использовать созданный нами карандаш необходимо передать его параметры контексту устройства.

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

CPen* SelectObject ( CPen* pPen ) ;                            // передаёт адрес карандаша

CBrush* SelectObject ( CBrush* pBrush ) ;                 // передаёт адрес кисти

virtual CFont* SelectObject ( CFont* pFont ) ;            // передаёт адрес фонта

CBitmap* SelectObject ( CBitmap* pBitmap ) ;           // передаёт адрес растровой картинки

int SelectObject ( CRgn* pRgn ) ;                                 // передаёт параметры области отсечения

Параметры:

pPen                     указатель на объект типа CPen (карандаш), который выбран для использования.

pBrush                 указатель на объект типа CBrush (кисть), который выбран для использования.

pFont                   указатель на объект типа CFont (фонт), который выбран для использования.

pBitmap               указатель на объект типа CBitmap (растровая картинка), который выбран для использования.

pRgn                    указатель на объект типа CRgn (область отсечения), который выбран для использования.

Пример: рисуем прямоугольник в текущем диалоговом окне с помощью определённого нами карандаша.

         CClientDC dc ( this ) ;                               // контекст устройства – текущее диалоговое окно

         CPen penRed ( PS_SOLID , 2 , 255 ) ;       // создаём сплошной красный карандаш

         dc.SelectObject ( &penRed ) ;                    // выбираем карандаш для использования

         RECT rt = { 20 , 20 , 40 , 40 } ;                  // объявляем и инициализируем прямоугольник