lection 8 cpp

Page 1

Лекция 8. Графический инструментарий среды Turbo C++ Explorer. Классы TCanvas, TFont, TPen, TBrush. Операции над растровыми графическими объектами, их реализация в среде Builder. Класс TBitmap. Графический инструментарий среды

Богатство

изобразительных

возможностей

Windows

связано

с

так

называемым

дескриптором контекста графического устройства HDC (Handle Device Context) и тремя входящими в него инструментами – шрифтом, пером и кистью. В среде Builder созданы специальные

классы,

существенно

упрощающие

использование

графических

инструментов Windows. Для контекста это класс TCanvas, для шрифта – TFont, для пера – TPen и для кисти – TBrush. Связанные с этими классами объекты автоматически создаются для всех видимых элементов и становятся доступны программе через свойства Canvas, Font, Pen и Brush.

Свойство Canvas любого компонента - это канва, на которой можно рисовать чертѐжными инструментами – пером, кистью и шрифтом. Свойство Canvas содержит в себе свойства Font, Pen, Brush, а также многочисленные методы, использующие эти свойства.

При работе с графическим инструментарием среды Turbo C++ Explorer часто используются также встроенные типы данных TPoint (точка) и TRect (четырѐхугольник), определяемые следующим образом:

struct TPoint { int x; int y; };

struct TRect {

© В.М. Гриняк, доц. каф. ИСПИ ВГУЭС


int Left; int Top; int Right; int Bottom; };

Для установки цвета того или иного участка канвы используется специальный тип TColor. Цвет в среде Turbo C++ Explorer определяется с помощью стандартной для Windows модели RGB, когда задаются интенсивности (от 0 до 255) красного, зелѐного и синего цветов. Существует глобальная функция RGB, возвращающая тип TColor, и определяемая как: TColor RGB(char r, char g, char b); где r, g и b – значения интенсивностей красного, зелѐного и синего цветов.

Для упрощения установки цвета среде Turbo C++ Explorer существует также достаточно широкий набор констант, явно задающих тот или иной цвет (например, clRed – красный, clBlue – синий и т.д.).

Процесс рисования на каком либо видимом компоненте, имеющем свойство Canvas заключается в установке свойств инструментов рисования (Font, Pen и Brush) и вызове методов, рисующих ту или иную фигуру.

Свойства и методы графических классов

Свойства класса TCanvas 

TBrush Brush – кисть;

TFont Font – шрифт;

TPen Pen – перо;

TRect ClipRect - определяет текущие размеры области, нуждающейся в прорисовке; © В.М. Гриняк, доц. каф. ИСПИ ВГУЭС


CopyMode – устанавливает способ взаимодействия отрисовываемого изображения с цветом фона;

TPoint PenPos – определяет текущее положение пера в пикселях относительно левого верхнего угла канвы;

TColor Pixels[int x][int y] – массив пикселей канвы; с помощью этого свойства все пиксели канвы представляются в виде двумерного массива точек. Изменяя их цвет можно прорисовывать изображение по отдельным точкам, например:

Canvas->Pixels[10][20]=clRed; - точка с координатами 10, 20 станет красного цвета.

Свойства класса TPen 

TColor Color – цвет вычерчиваемых пером линий;

Mode – определяет способ взаимодействия линий с фоном;

int Width – толщина линий в пикселях экрана.

Style

- Определяет стиль линий. Учитывается только для линий толщины 1.

Толстые линии всегда сплошные. Свойство Mode может принимать множество различных значений. Наиболее часто применяются следующие: 

pmBlack – линии всегда чѐрные. Свойства стиля и цвета игнорируются.

pmWhite – линии всегда белые. Свойства стиля и цвета игнорируются.

pmCopy (по умолчанию) – цвет линий определяется свойством Color пера.

Свойство Style может принимать следующие значения: 

psSolid (умолч.)

psDash

psDot

psDashDot

psDashDotDot

psClear

нет линий

© В.М. Гриняк, доц. каф. ИСПИ ВГУЭС


Свойства класса TBrush 

TColor Color – цвет кисти;

Style – стиль кисти;

Bitmap – содержит растровое изображение, которое будет использоваться кистью для заполнения. Если это свойство определено, свойства Color и Style игнорируются.

Свойство Style может принимать следующие значения: 

bsSolid (умолч.)

bsClear

bsBDiagonal

bsFDiagonal

bsCross

bsDiagCross

bsHorizontal

bsVertical

нет заливки

Свойства класса TFont 

TColor Color – цвет шрифта;

Name – имя шрифта;

int Size – размер шрифта;

Style – стиль шрифта;

Основные методы класса TCanvas

Методами класса TCanvas, собственно, и осуществляется процесс рисования. LineTo(int x, int y) – чертит линию от текущего положения пера до точки x, y. MoveTo(int x, int y) – перемещает перо в положение x, y без вычерчивания линии.

© В.М. Гриняк, доц. каф. ИСПИ ВГУЭС


Таким образом, последовательность команд

Form1->Canvas->Pen->Color=clGreen; Form1->Canvas->Pen->Style= psDash; Form1->Canvas->MoveTo(20,30); Form1->Canvas->LineTo(50,50);

Приведѐт к прорисовке на форме зелѐной пунктирной линии из точки (20,30) в точку (50,50). Единожды установленные свойства пера и кисти сохраняются до тех пор, пока не будут явно изменены.

Rectangle(int x1, int y1, int x2, int y2) – вычерчивает и заполняет прямоугольник с координатами (x1, y1) – (x2, y2).

Polyline(TPoints *pp, int n) – вычерчивает пером ломаную линию по точкам, заданным в массиве pp, при этом прорисовывает n отрезков.

Polygon(TPoints *pp, int n) – вычерчивает пером многоугольник по точкам, заданным в массиве pp. Конечная точка соединяется с начальной и многоугольник заполняется кистью.

Ellipse(int x1, int y1, int x2, int y2) – чертит эллипс в охватывающем прямоугольнике (x1, y1) – (x2, y2) и заполняет его текущей кистью.

TextOut(int x, int y, char* text) – выводит текстовую строку text так, чтобы левый верхний угол прямоугольника, охватывающего текст, располагался в точке x, y.

При разработке приложений рисование может осуществляться непосредственно на форме. Кроме того, в среде Turbo C++ Explorer имеются специальные компоненты, упрощающие работу с изображениями, например Image (страница Additional) и PaintBox (страница © В.М. Гриняк, доц. каф. ИСПИ ВГУЭС


System). Они служат для размещения на форме одного из трѐх поддерживаемых средой типов изображений: растровой картинки, пиктограммы или метафайла. В их свойстве Canvas содержится канва, с помощью которой программа может отредактировать растровое изображение.

Операции над графическими объектами

В графическом инструментарии Windows существует широкий спектр возможностей обрабатывать изображения с целью достижения различных эффектов (например, прозрачности). Все эти эффекты сводятся, в принципе, к 4 операциям – инвертированию, объединению изображений операцией AND, объединению изображений операцией OR и объединению изображений операцией XOR. Логическая интерпретация этих операций приведена в таблице:

A

B

not A A and B

A or B

A xor B

0

0

1

0

0

0

0

1

1

0

1

1

1

0

0

0

1

1

1

1

0

1

1

0

В случае, когда данные операции применяются к монохромным чѐрно-белым изображениям, каждый пиксель чѐрного цвета кодируется как 0, каждый пиксель белого цвета кодируется как 1. Если же данные операции применяются к полутоновым и цветным изображениям, то цвет каждого пикселя кодируется числом размером от 1 до 4 байт, и в этом случае операции понимаются побитно; например, если инвертируется синий цвет модели RGB, то это делается следующим образом: исходный цвет –

00000000 00000000 11111111

результат инвертирования -

11111111 11111111 00000000

то есть получится пиксель жѐлтого цвета.

© В.М. Гриняк, доц. каф. ИСПИ ВГУЭС


В среде Turbo C++ Explorer данные операции реализуются с помощью специального метода класса TCanvas:

CopyRect(TRect Dest, TCanvas Canvas, TRect Sourse); Данная функция копирует участок изображения Sourse канвы Canvas (источника) в участок Dest текущей канвы. При этом разнообразные специальные эффекты достигаются с помощью свойства канвы CopyMode. Оно может иметь одно из следующих значений (основные): 

cmSrcCopy – копирует изображение источника на канву;

cmSrcAnd – объединяет изображения источника и канвы операцией AND;

cmSrcErase – инвертирует изображение на канве и объединяет его с источником;

cmSrcInvert - объединяет изображения источника и канвы операцией XOR;

cmSrcPaint - объединяет изображения источника и канвы операцией OR;

cmNotSrcCopy – копирует на канву инверсное изображение источника;

cmNotSrcErase - объединяет изображения источника и канвы операцией OR и

инвертирует полученное;

Аналогичные эффекты можно также получать при рисовании линий, что достигается различными значениями свойства пера Mode: 

pmNot – инверсия цвета фона;

pmXor – объединение цветов пера и фона операцией XOR;

pmNotXor – инверсия объединения цветов пера и фона операцией XOR;

Класс TBitmap При разработке приложений часто возникает необходимость отрисовки растровых изображений не на мониторе, а в памяти машины; такие изображения не связываются непосредственно с видимыми компонентами. Для этой цели в среде Builder существует специальный класс TBitmap. Для того, чтобы создать переменную такого класса необходимо выполнить следующие действия:

© В.М. Гриняк, доц. каф. ИСПИ ВГУЭС


-

объявить указатель на эту переменную:

Graphics::TBitmap *b1; При этом с помощью операции разрешения области действия :: следует обязательно явно указать имя класса Graphics, потомком которого является класс TBitmap (как в примере).

-

выделить память под переменную типа TBitmap с помощью оператора new:

b1=new Graphics::TBitmap;

-

задать размер изображения – высоту и ширину:

b1->Height=15;b1->Width=15;

-

задать глубину цветовой палитры – свойство PixelFormat, которое может принимать

значения pf1bit, pf8bit, pf16bit, pf24bit, pf32bit. Цифра при этом обозначает размер переменной, кодирующей цвет каждого пикселя. b1->PixelFormat=pf16bit; После этого переменная b1 становиться доступной для рисования в ней изображений посредством методов еѐ свойства Canvas.

b1->Canvas->Rectangle(3,3,10,10); Класс TBitmap содержит также специальные методы LoadFromFile(“Filename”) и SaveToFile(“Filename”), позволяющие загружать изображение из файла и сохранять его в файл типа *.bmp (в новых версиях среды есть также возможность загружать файлы других форматов). Если изображение загружается из файла, то устанавливать его размеры и глубину цветов нет необходимости (они определяются автоматически форматом файла). Вывод сформированного в памяти изображения на визуальный компонент можно осуществить с помощью метода канвы Draw(int x, int y, Graphic), который прорисовывает графический объект Graphic так, чтобы его верхний левый угол расположился в точке x, y. Пример:

Form1->Canvas->Draw(20, 20, b1);

© В.М. Гриняк, доц. каф. ИСПИ ВГУЭС


Переменные класса TBitmap могут также использоваться для задания способа заливки, посредством установки свойства Bitmap кисти:

Form1->Canvas->Brush->Bitmap=b1; Смотри также пример к лекции 8, расположенный на портале

© В.М. Гриняк, доц. каф. ИСПИ ВГУЭС


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.