Лекция 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, расположенный на портале
© В.М. Гриняк, доц. каф. ИСПИ ВГУЭС