Лекция 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. Нарисовать фигуру типа «светофор». Обеспечить «зажигание» и «потухание» для его трёх «лампочек» по нажатию на соответствующие клавиши или с течением времени.