Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VC Лекции PDF / VC 15 Лек Графика.pdf
Скачиваний:
37
Добавлен:
15.02.2015
Размер:
651.21 Кб
Скачать
CClientDC dc ( this ) ; COLORREF crYell = 0xFFFF ; COLORREF crBlue = 0xFF0000 ;
CBrush brush ( HS_CROSS , crBlue ) ; dc.SetBkColor ( crYell ) ; dc.SelectObject ( brush ) ;
RECT rt = { 20 , 20 , 140 , 140 } ; dc.Rectangle ( &rt ) ;

Лекция 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

Выжол Ю.А.