Лекция9

advertisement
Лекция 9. Графический инструментарий среды Builder. Классы
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, а также многочисленные методы, использующие эти
свойства.
При работе с графическим инструментарием среды Builder часто используются
также встроенные типы данных TPoint (точка) и TRect (четырёхугольник), определяемые следующим образом:
struct TPoint {
int x;
int y;
};
struct TRect
{
int Left;
int Top;
int Right;
int Bottom;
};
Для установки цвета того или иного участка канвы используется специальный
тип TColor. Цвет в среде Builder определяется с помощью стандартной для Windows
модели RGB, когда задаются интенсивности (от 0 до 255) красного, зелёного и синего
цветов. Существует глобальная функция RGB, возвращающая тип TColor, и определяемая как:
TColor RGB(char r, char g, char b);
где r, g и b – значения интенсивностей красного, зелёного и синего цветов.
Для упрощения установки цвета среде Builder существует также достаточно широкий набор констант, явно задающих тот или иной цвет (например, 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.
При разработке приложений рисование может осуществляться непосредственно
на форме. Кроме того, в среде Builder имеются специальные компоненты, упрощающие
работу с изображениями, например 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
то есть получится пиксель жёлтого цвета.
В среде Builder данные операции реализуются с помощью специального метода
класса 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;
ЗАДАНИЕ К ЛЕКЦИИ 12
1.
Нарисовать графики функции y=x2+bx вблизи начала координат при
нескольких различных значениях b, выделив их различными цветами
или стилями линий.
2.
Нарисовать фигуру типа «светофор». Обеспечить «зажигание» и «потухание» для его трёх «лампочек» по нажатию на соответствующие
клавиши или с течением времени.
Download