- •КОНТЕКСТ УСТРОЙСТВА
- •Класс CDC и его производные
- •Объявление контекста
- •РАБОТА С ТЕКСТОМ
- •Вывод текста. Функция TextOut
- •Вывод текста в прямоугольнике отсечения. Функция ExtTextOut
- •Цвет фона. Функции GetBkColor, SetBkColor
- •Цвет символов текста. Функции GetTextColor, SetTextColor
- •Выравнивание текста. Функции GetTextAlign, SetTextAlign
- •Пример рисования текста
- •ЦВЕТОВАЯ СИСТЕМА RGB
- •ДИАЛОГОВОЕ ОКНО ВЫБОРА ЦВЕТА
- •Конструктор класса CColorDialog
- •Отображение диалогового окна. Функция DoModal
- •Получение выбранного цвета. Функция GetColor
- •Пример использования диалогового окно выбора цвета
- •МОДЕЛЬ ПЕРЬЕВОГО ПЛОТТЕРА
- •Перемещение карандаша. Функция MoveTo
- •Рисование отрезка. Функция LineTo
- •Рисование точки. Функция SetPixel
- •Получение цвета точки. Функция GetPixel
- •РИСОВАНИЕ ГРАФИЧЕСКИХ ПРИМИТИВОВ
- •Рисование прямоугольника. Функция Rectangle
- •Рисование округлённого прямоугольника. Функция RoundRect
- •Рисование эллипса. Функция Ellipse
- •Рисование эллиптической дуги. Функция Arc
- •Рисование эллиптической дуги и хорды. Функция Chord
- •Рисование ломаной линии. Функция Polyline
- •КАРАНДАШ. КЛАСС CPEN
- •Конструкторы класса СРеn
- •Создание карандаша. Функция CreatePen
- •Создание указателя на карандаш. Тип HPEN
- •Использование объекта. Функция SelectObject
- •Получение атрибутов объекта. Функция GetObject
- •НАСТРОЙКА РЕЖИМА ОТОБРАЖЕНИЯ
- •Выбор единиц измерения. Функция SetMapMode
- •Размер прямоугольника. Структура SIZE
- •Получение размеров клиентской области. Функция GetClientRect
- •Пример настройки режима отображения
- •КИСТЬ. КЛАСС CBRUSH
- •Конструкторы класса CBrush
- •Образец физической кисти. Структура LOGBRUSH
- •Создание кисти
- •Пример создания и использования кисти
- •Создание точечного рисунка. Функция CreateBitmap
- •Создание ресурса точечного рисунка
- •Загрузка ресурса точечного рисунка. Функция LoadBitmap
Лекция 14 |
Работа с графикой |
16 |
КИСТЬ. КЛАСС CBRUSH
Иерархия классов относительно класса СРеn представлена на рисунке. Класс СРеn инкапсулирует графический объект Windows – “кисть”. Кисть используется для закрашивания замкнутых фигур.
CObject
CGdiObject
CBrush
Конструкторы класса CBrush
В классе CBrush определено четыре конструктора, прототипы которых имеют вид:
CBrush ( ) ; |
// создает пустой объект |
CBrush ( COLORREF crColor ) ; |
// создает однотонную кисть |
CBrush ( int nIndex , COLORREF crColor ) ; |
// создает кисть со штриховкой |
CBrush ( CBitmap* pBitmap ) ; |
// создает кисть на основе битового массива размером 8x8 |
||
Параметры: |
|
|
|
crColor |
определяет цвет штрихов |
||
nIndex |
определяет стиль штриховки. Может принимать одно из следующих значений: |
||
HS_HORIZONTAL |
горизонтальная штриховка |
||
HS_VERTICAL |
вертикальная штриховка |
||
HS_BDIAGONAL |
45-градусная штриховка слева направо и сверху вниз |
||
HS_FDIAGONAL |
45-градусная штриховка слева направо и снизу вверх |
||
HS_CROSS |
|
горизонтальная и вертикальная штриховка крест-накрест |
|
HS_DIAGCROSS |
45-градусная штриховка крест-накрест |
||
pBitmap |
|
указатель на объект типа CBitmap, который определяет точечный рисунок, ис- |
|
|
|
пользуемый в качестве шаблона |
В том случае если создана кисть со штрихами, то в качестве цвета фона используется цвет фона текста, который задаётся с помощью функции SetBkColor.
Пример: рисуем прямоугольник в текущем диалоговом окне с помощью определённой нами кисти.
// контекст устройства - текущее диалоговое окно // объявляем жёлтый цвет для фона // объявляем синий цвет для штрихов
// объявляем кисть со штриховкой крест-накрест // устанавливаем жёлтый фон // выбираем кисть для использования
// объявляем и инициализируем прямоугольник // рисуем прямоугольник
Образец физической кисти. Структура LOGBRUSH
Структура LOGBRUSH определяет стиль, цвет, и образец физической кисти и объявлена в библиотеке MFC следующим образом:
typedef struct tag LOGBRUSH
{
UINT |
lbStyle ; |
// стиль кисти |
Выжол Ю.А.
Лекция 14 |
|
|
Работа с графикой |
17 |
COLORREF |
lbColor ; |
// цвет кисти |
|
|
LONG |
|
lbHatch ; |
// тип штриховки или указатель на точечный рисунок |
|
} LOGBRUSH ; |
|
|
|
|
Члены структуры: |
|
|
|
|
lbStyle |
определяет стиль кисти и должен принимать одно из следующих значений: |
|
||
BS_HOLLOW |
|
пустая кисть |
|
|
BS_NULL |
|
пустая кисть |
|
|
BS_HATCHED |
штрихуемая кисть |
|
||
BS_SOLID |
|
сплошная кисть |
|
|
BS_PATTERN |
в качестве кисти используется точечный рисунок |
|
||
lbColor |
определяет цвет кисти, если поле lbStyle равно BS_HATCHED или BS_SOLID; |
|
||
|
игнорируется, если поле lbStyle равно BS_HOLLOW или BS_PATTERN. |
|
||
lbHatch |
определяет тип штриховки, если поле lbStyle равно BS_HATCHED. В этом случае поле |
|||
|
может принимать те же значения, что и параметр nIndex в конструкторе класса CBrush. |
Структура LOGBRUSH используется функциями CreateBrushIndirect и ExtCreatePen.
Создание кисти
Если кисть создана с помощью первого конструктора и является пустым объектом, то перед использованием его необходимо проинициализировать с помощью одной из следующих функций:
BOOL CreateSolidBrush ( COLORREF crColor ) ;
Функция создает однотонную кисть с заданным цветом.
BOOL CreateHatchBrush ( int nIndex , COLORREF crColor ) ;
Функция создает кисть со штриховкой заданного цвета и направления.
BOOL CreatePatternBrush ( CBitmap* pBitmap ) ;
Функция создает кисть на основе битового массива размером 8x8.
BOOL CreateBrushIndirect ( const LOGBRUSH* lpLogBrush ) ;
Функция создаёт кисть, используя двухцветный (1 бит на пиксель) точечный рисунок. Пиксели, представленные нулём рисуются текущим цветом текста. Пиксели, представленные единицей рисуются текущим цветом фона. Кроме того, может создавать однотонную кисть и кисть со штриховкой.
BOOL CreateDIBPatternBrush ( HGLOBAL hPackedDIB , UINT nUsage ) ; BOOL CreateDIBPatternBrush ( const void* lpPackedDIB , UINT nUsage ) ;
Функция создает кисть на основе битового массива, который хранит изображение в независимом от устройства виде (Device-Independent Bitmap – DIB).
BOOL CreateSysColorBrush ( int nIndex ) ;
Функция создает кисть со штриховкой на основе системного цвета.
Пример создания и использования кисти
В приведённом ниже примере мы создаём образец физической кисти, по образцу создаём кисть и рисуем прямоугольник в текущем диалоговом окне с помощью созданной нами кисти.
CClientDC dc ( this ) ; |
// контекст устройства – текущее диалоговое окно |
LOGBRUSH logBr ; |
// объявляем образец физической кисти |
logBrush.lbStyle = BS_HATCHED ; |
// устанавливаем стиль штрихованной кисти |
logBrush.lbColor = RGB ( 0 , 192 , 192 ) ; |
// устанавливаем цвет штрихов |
logBrush.lbHatch = HS_DIAGCROSS ; |
// штриховка крест-накрест по диагонали |
CBrush brush ; |
// объявляем пустую кисть |
brush.CreateBrushIndirect ( &logBr ) ; |
// создаём кисть по образцу |
dc.SelectObject ( brush ) ; |
// выбираем кисть для использования |
dc.Rectangle ( 20 , 20 , 100 , 100 ) ; |
// рисуем прямоугольник |
Выжол Ю.А.
Лекция 14 |
Работа с графикой |
18 |
|
ТОЧЕЧНЫЙ РИСУНОК. КЛАСС CBITMAP |
|
Класс CBitmap инкапсулирует графический объект Windows – “точечный рисунок”. Точечный рисунок – это прямоугольная матрица целых чисел, каждое из которых кодирует цвет пикселя в прямоугольной области. Точечный рисунок используется при создании кисти, может отображаться в форме или элементе управления. Иерархия классов относительно класса CBitmap представлена на рисунке.
CObject
CGdiObject
CBitmap
Создание точечного рисунка. Функция CreateBitmap
Для работы с объектом класса необходимо объявить сам объект, а затем инициализировать его с помощью одной из следующих функций: CreateBitmap, CreateBitmapIndirect, CreateCompatibleBitmap, CreateDiscardableBitmap.
Синтаксис функции CreateBitmap имеет вид:
BOOL CreateBitmap ( int nWidth, int nHeight, UINT nPlanes, UINT nBitCount, const void* lpBits ) ;
Параметры: |
|
nWidth, nHeight |
определяет ширину и высоту точечного рисунка в пикселях. |
nPlanes |
определяет число цветов в точечном рисунке. |
nBitCount |
определяет число битов за пиксель. |
lpBits |
указатель на массив коротких целых чисел, который содержит разрядные значе- |
|
ния точечного рисунка. Если параметр недействителен, то новый точечный рису- |
|
нок оставлен без инициализации. |
В том случае если пиксель кодируется одним битом (nBitCount = 1), то пиксель которому соответствует значение бита равное 1 закрашивается цветом фона, 0 – цветом текста. Цвет фона и текста можно установить с помощью функций SetBkColor и SetTextColor соответственно.
Пример: В приведённом ниже примере объявлен и проинициализирован массив bit , состоящий из 8 целых чисел типа WORD. Каждое число кодирует 8 пикселей одной из 8 строк. На базе массива bit с помощью функции CreateBitmap создаётся точечный рисунок bm размером 8 x 8. В точечный рисунке крайний правый и самый нижний ряды пикселей имеют цвет текста, остальные пиксели – цвет фона. Далее создаётся кисть brush, которая использует созданный точечный рисунок bm. Кисть brush используется при рисовании прямоугольника.
CClientDC dc ( this ) ; |
// контекст устройства - текущее диалоговое окно |
WORD p = 0xFE ; |
// двоичный код = 11111110 |
WORD bit [ 8 ] = {p,p,p,p,p,p,p,0} ; |
// массив из 8 битовых строк |
dc.SetBkColor ( dc.GetPixel ( 0 , 0 )) ; |
// устанавливаем цвет фона равным цвету фона окна |
CBitmap bm ; |
// объявляем точечный рисунок |
bm.CreateBitmap ( 8 , 8 , 1 , 1 , bit ) ; |
// инициализируем точечный рисунок размером 8 x 8 |
CBrush brush ; |
// объявляем пустую кисть |
brush.CreatePatternBrush ( &bm ) ; |
// создаём на основе точечного рисунка |
dc.SelectObject ( brush ) ; |
// выбираем кисть для использования |
dc.Rectangle ( 23 , 23 , 89 , 89 ) ; |
// рисуем закрашенный прямоугольник |
Создание ресурса точечного рисунка
Интегрированная среда разработки Visual Studio 6 позволяет создавать точечные рисунки с помощью встроенного графического редактора. Для этого нужно
вменю Insert выбрать команду Resource
вдиалоговом окне Insert Resource в поле Resource type выбрать Bitmap и нажать кнопку New
Выжол Ю.А.
Лекция 14 |
Работа с графикой |
19 |
Встроенный графический редактор позволяет создавать 256-цветные рисунки произвольного размера. При создании рисунка пользователю доступны команды рисования простейших примитивов с помощью мыши: точки, прямой, эллипса, прямоугольника и др.
Библиотека MFC позволяет использовать в программе готовые точечные рисунки, содержащие и более чем 256 цветов. Для включения готового точечного рисунка в проект нужно
вдиалоговом окне Insert Resource нажать кнопку Import
вдиалоговом окне открытия файла выбрать файл и нажать кнопку Import
Ресурс типа Bitmap, как и любой другой ресурс, в откомпилированной программе хранится в исполняемом файле, но загружается в оперативную память только после выполнения соответствующей команды загрузки ресурса. Ресурс выгружается из оперативной памяти, если он не требуется для выполнения программы.
Загрузка ресурса точечного рисунка. Функция LoadBitmap
Загрузить ресурс точечного рисунка можно с помощью функции LoadBitmap.
BOOL LoadBitmap ( UINT nIDResource ) ;
BOOL LoadBitmap ( LPCTSTR lpszResourceName ) ;
Параметром функции может быть идентификатор ресурса nIDResource или строка. содержащая имя идентификатора ресурса lpszResourceName.
Загруженный точечный рисунок присоединен к объекту типа CBitmap.
Пример: В приведённом ниже примере точечный рисунок загружается из ресурса с идентификатором
IDB_BIT.
CBitmap bm ; |
// объявляем точечный рисунок |
bm.LoadBitmap ( IDB_BIT ) ; |
// загружаем точечный рисунок из ресурса с IDB_BIT |
Выжол Ю.А.