Canvas->Brush->Color = clWhite

advertisement
МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное бюджетное образовательное учреждение высшего образования
СЕВАСТОПОЛЬСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ «СГУ»
Факультет автоматики и вычислительной техники
Кафедра технической кибернетики
В.В. Альчаков
ОСНОВЫ ПРОГРАММИРОВАНИЯ КОМПЬЮТЕРНОЙ
ГРАФИКИ В C++BUILDER
Методические указания
к лабораторным работам по дисциплине
«Компьютерная графика»
Севастополь
2014
УДК 519.7
Основы программирования компьютерной графики в C++Builder:
Методические указания к лабораторным работам / Сост.: В.В. Альчаков. ‒
Севастополь.: СГУ, 2014. ‒ 16с.
Рассмотрены основные методы программирования компьютерной графики
в среде C++ Builder. Рассматривается класс TCanvas, его методы и свойства для
построения простейших геометрических фигур.
Методические указания предназначены для студентов специальности
27.03.04 ‒ «Управление в технических системах».
Методические указания рассмотрены на заседании кафедры технической
кибернетики СГУ № ___ от « ___ » _____________________ 2014 г. Одобрено
методической комиссией факультета АВТ.
Рецензенты:
В.А. Крамарь, докт. техн. наук, проф. каф. ТК СГУ
В.А. Карапетьян, канд. техн. наук, доц. каф. ТК СГУ
Составитель:
В.В. Альчаков, канд. техн. наук, доц. каф. ТК СГУ
© СГУ, 2014
Методические указания составлены в соответствии с рабочей
программой дисциплины «Компьютерная графика» учебного плана
специальности 27.03.04 ‒ «Управление в технических системах».
1 ОБЩИЕ ПОЛОЖЕНИЯ
1.1 Базовый класс TCanvas и понятие канвы
Borland C++ Builder имеет определенный набор компонентов и
классов, позволяющий не только рисовать графические примитивы, но
и работать с изображениями, шрифтами и графическими файлами.
Принципы работы с графическими изображениями в Borland C++
Builder основаны на общих принципах создания графических объектов
в операционной системе Windows. Именно операционная система
Windows предоставляет программисту средства интерфейса
графических устройств. Применение графических функций совместно
с компонентами и классами Borland C++ Builder представляют собой
более перспективную методику создания графики в приложении.
В среде C++ Builder существует три класса, которые могут быть
использованы для программирования графики:
‒ TCanvas (Канва) ‒ предоставляет битовую карту поверхности
окна приложения, компоненты, принтера и т.п., которая может быть
использована для вывода графики. Канва не самостоятельный объект,
она всегда является свойством какого-то другого графического
объекта.
‒ TGraphic (Графика) ‒ базовый класс, имеющий производные
классы TBitmap (Точечный рисунок), TIcon (Иконка), TMetafile
(Метафайл). Объекты эти классов представляю собой растровые
изображения файлов соответствующих типов (битовый образ,
пиктограмма, метафайл).
‒ TPicture (Рисунок) ‒ представляет собой контейнер для графики,
который может содержать любые классы графических объектов. Таким
образом, контейнерный класс TPicture может содержать битовый образ,
пиктограмму, метафайл или некоторый другой графический тип,
определенный пользователем, а приложение может стандартно
обращаться ко всем объектам контейнера посредством объекта
TPicture.
В рамках лабораторной работы будут изучены свойства и методы
класса TCanvas.
В среде C++ Builder приложение может выводить графические
образы на поверхность любых объектов, обладающих свойством
Canvas класса TCanvas. Методы это класса обеспечивают вывод
графических
примитивов
(точек,
линий,
окружностей,
прямоугольников, эллипсов, ломанных и т.д.), а свойства позволяют
задавать характеристики выводимых графических примитивов (цвет,
толщину и стиль линий, цвет и стиль заливки, параметры шрифта при
выводе текстовой информации).
Перед тем как перейти к рассмотрению основных свойств и
методов класса TCanvas, рассмотрим какая система координат
используется при выводе графики на объекты формы.
При рисовании используется декартова система координат с
началом отсчета в левом верхнем углу компонента, на поверхности
которого происходит рисование, так как это показано на рисунке 1.1.
Form1->ClientWidth
X
Form1->ClientHeight
(0;0)
Y
Рисунок 1.1 ‒ Система координат
Следует ответить, что при рисовании непосредственно на форме,
начало координат находится в левом верхнем углу формы без учета
области заголовка окна.
Методы вывода графических примитивов рассматривают
свойство Canvas как некоторый абстрактный холст, состоящий из
отдельных точек ‒ пикселей. Положение пикселя на поверхности
холста характеризуется горизонтальной X и вертикальной Y
координатами. Координаты возрастают сверху вниз и слева направо
Левый верхний пиксель поверхности клиентской области имеет
координаты (0,0), правый нижний – (ClientWidth, ClientHeight). Доступ
к отдельному пикселю осуществляется через свойство Pixels,
представляющее собой двумерный массив, элементы которого
содержат информацию о цвете точек холста.
1.2 Инструменты рисования ‒ карандаш (TPen) и кисть
(TBrush)
Основными инструментами рисования в среде Borland C++ Builder
являются карандаш, свойства и методы которого описываются классом
TPen, и кисть, свойства и методы которой описываются в классе
TBrush.
Объект класса TPen отвечает за стиль отображения линий. С
помощью свойств класса можно задать толщину линии (свойство
Width), цвет линии (свойство Color) и стиль отображения (свойство
Style). Толщина линий задается в пикселах, значение по умолчанию для
свойства Width равно 1. Цвет линии задается с помощью
предопределенных констант, представленных в таблице 1.1.
Значение свойства Style также должно принимать одно из
предопределенных значений, представленных в таблице 1.2.
Объект класса TBrush отвечает за стиль заливки фигур, используя
свойства этого класса можно задавать цвети и стиль заливки. По
аналогии с классом TPen для задания цвета заливки необходимо
использовать свойство Color, значения констант полностью совпадают
с значениями, используемыми для задания свойств линии. Возможные
значения для свойства Style приведены в таблице 1.3.
Таблица 1.1 ‒ Константы для задания цвета в C++ Builder
Таблица 1.2 ‒ Константы для задания стиля объекта класса TPen
Таблица 1.3 ‒ Константы для задания стиля объекта класса
TBrush
Пример задания свойств для карандаша и для кисти:
// Стиль линии - точки
Form1->Canvas->Pen->Style = psDot;
// Толщина линии - 1 px
Form1->Canvas->Pen->Width = 1;
// Цвет линии - красный
Form1->Canvas->Pen->Color = clRed;
// Цвет кисти - синий
Form1->Canvas->Brush->Color = clBlue;
// Стиль кисти - гор-я штриховка
Form1->Canvas->Brush->Style = bsHorizontal;
Следует помнить, что свойства для инструментов рисования
должны быть заданы перед использованием инструмента.
1.3 Методы класса TCanvas для рисования базовых
геометрических фигур
Класс TCanvas обладает достаточным набором методов для
рисования базовых геометрических фигур. При этом каждая
геометрическая фигура, как правило, задается координатами начальной
и конечной точки или координатами левого верхнего и правого
нижнего угла прямоугольника, в который вписана фигура. Перечень
основных методов рисования фигур приведен в таблице 1.3.
Таблица 1.3 ‒ Методы рисования фигур
Фигура
Формат вызова методы
Рисунок
Линия
Canvas->MoveTo(x1,y1);
Canvas->LineTo(x2,y2);
Вычерчивание прямой линии выполняет метод LineTo. Метод рисует линию
из той точки, в которой в данный момент находится карандаш (эта точка
называется текущей позицией карандаша или просто "текущей"), в точку,
координаты которой указаны в инструкции вызова метода.
Начальную точку линии можно задать, переместив карандаш в нужную точку
графической поверхности. Сделать это можно при помощи метода MoveTo,
указав в качестве параметров координаты точки начала линии.
Эллипс
Canvas->Ellipse(x1,y1, x2,y2);
Параметры xl, y1, x2, y2 определяют координаты прямоугольника, внутри
которого вычерчивается эллипс или, если прямоугольник является квадратом, —
окружность. Вместо четырех параметров — координат диагональных углов
прямоугольника — методу Ellipse можно передать один — объект типа TRect.
Следующий фрагмент кода демонстрирует использование объекта TRect в
качестве параметра метода Ellipse.
TRect rec = Rect(10,10,50,50);
Canvas->Ellipse(rec);
Прямоуголь Canvas->Rectangle(x1,y1,
x2,y2);
ник
Метод Rectangle вычерчивает прямоугольник. В инструкции вызова метода
надо указать координаты двух точек — углов прямоугольника. Цвет, вид и ширину
линии контура прямоугольника определяют значения свойства Реn, а цвет и
стиль заливки области внутри прямоугольника — значения свойства Brush той
поверхности, на которой метод рисует прямоугольник.
Cледующие операторы рисуют флаг Российской Федерации
Canvas->Brush->Color = clWhite; // цвет кисти — белый
Canvas->Rectangle(10,10,90,30);
Canvas->Brush->Color = clBlue; // цвет кисти — синий
Canvas->Rectangle(10,30,90,50);
Canvas->Brush->Color = clRed; // цвет кисти — красный
Canvas->Rectangle(10,50,90,70);
Вместо четырех параметров — координат двух диагональных углов
прямоугольника — методу Rectangle можно передать один параметр —
структуру типа TRect, поля которой определяют положение диагональных углов
прямоугольной
области.
Следующий
фрагмент кода
демонстрирует
использование структуры TRect в качестве параметра метода Rectangle.
TRect rct; // прямоугольная область
rct.Top = 10;
rct.Left = 10;
rct.Bottom = 50;
rct.Right = 50;
Canvas->Rectangle(rct); // нарисовать прямоугольник
Есть еще два метода, которые вычерчивают прямоугольник. Метод FiliRect
вычерчивает закрашенный прямоугольник, используя в качестве инструмента
только кисть (Brush), а метод FrameRect — только контур и использует только
карандаш (Реп). У этих методов только один параметр — структура типа TRect.
Поля структуры TRect содержат координаты прямоугольной области. Значения
полей структуры TRect можно задать при помощи функции Rect.
TRect rct; // область, которую надо закрасить
rct = Rect(10,10,30,50); // координаты области
Canvas->Brush->Color = clRed; // цвет закраски
Canvas->FillRect(rct);
Прямоуголь
ник со
Canvas->RoundRect(x1,y1,
скругленны x2,y2,x3,y3);
ми углами
Параметры xl, y1, x2, y2 определяют положение углов прямоугольника, а
параметры хЗ и уЗ — размер эллипса, одна четверть которого используется для
вычерчивания скругленного угла
Сектор
Canvas->Pie(x1,y1,
x2,y2,x3,y3,x4,y4);
Параметры x1, y1, x2, у2 определяют эллипс (круг), частью которого
является сектор; хЗ, уз, х4 и у4 — прямые — границы сектора. Начальная точка
границ совпадает с центром эллипса. Сектор вырезается против часовой
стрелки от прямой, заданной точкой с координатами (хЗ, у3), к прямой, заданной
точкой с координатами (х4, у4).
Canvas->Arc(x1,y1,
x2,y2,x3,y3,x4,y4);
Дуга
Параметры x1, yl, х2, y2 определяют эллипс (окружность), частью которого
является дуга. Параметры хЗ и y3 задают начальную, а х4 и у4 — конечную точку
дуги. Начальная (конечная) точка дуги — это точка пересечения границы эллипса
и прямой, проведенной из центра эллипса в точку с координатами хЗ и y3 (х4, у4).
Метод Arc вычерчивает дугу против часовой стрелки от начальной точки к
конечной. Цвет, толщина и стиль линии, которой вычерчивается дуга,
определяются значениями свойства Реп поверхности (Сanvas), на которую
выполняется вывод.
Ломаная
Canvas->Polyline(Point(x1,y1),
Point(x2,y2), Point(x3,y3),
Point(x4,y4)...PointCount);
В качестве параметров методу передается массив типа TPoint, содержащий
координаты узловых точек линии, и количество звеньев линии. Метод Polyline
вычерчивает ломаную линию, последовательно соединяя точки, координаты
которых находятся в массиве: первую со второй, вторую с третьей, третью с
четвертой и т. д.
Пример рисования ломанной, состоящей из трех звеньев
TPoint p[4]; // Координаты начала, конца и точек перегиба
// Задать координаты
р[0].х = 100; р[0].у
р[1].х = 100; р[1].у
р[2].х = 150; р[2].у
р[3].х = 150; р[3].у
точек ломаной
= 100; // начало
= 150; // точка перегиба
= 150; // точка перегиба
= 100; // конец
Canvas->Polyline(р, 3); // Ломаная из трех звеньев
Многоуго
льник
Canvas->Polygon(Point(x1,y1),
Point(x2,y2), Point(x3,y3),
Point(x4,y4)...PointCount);
Метод Polygon чертит многоугольник, соединяя прямыми линиями точки,
координаты которых находятся в массиве: первую со второй, вторую с третьей,
третью с четвертой и т. д. Вид границы многоугольника определяют значения
свойства Реп, а вид заливки области, ограниченной линией границы, — значения
свойства Brush той поверхности, на которой метод рисует.
Ниже приведен фрагмент кода, который, используя метод Polygon, рисует
ромб.
TPoint p[4]; // четыре вершины
// координаты вершин
р[0].х = 50; р[0].у = 100;
р[1].х = 150; р[1].у = 75;
р[2].х = 250; р[2].у = 100;
р[3].х = 150; р[3].у = 125;
Canvas->Brush->Color = clRed;
Canvas->Polygon(p,3);
Canvas->Pixels[X][Y] = clColor
Точка
Поверхности, на которую программа может осуществлять вывод графики,
соответствует объект Canvas. Свойство Pixels, представляющее собой
двумерный массив типа TColor, содержит информацию о цвете каждой точки
графической поверхности. Используя свойство Pixels, можно задать цвет любой
точки графической поверхности, т.е. "нарисовать" точку.
Например, инструкция
Canvas->Pixels[10][10] = clRed
окрашивает точку с координатами (10,10) в красный цвет.
1.4 Вывод текста
Вывод текста (строк типа AnsiString) на поверхность графического
объекта обеспечивает метод TextOutA. Инструкция вызова метода
TextOutA в общем виде выглядит следующим образом:
Canvas->TextOutA(X,Y,”Текст”);
Первые два параметра определяют координаты верхнего левого
угла прямоугольника, в который вписан выводимый текст. Последний
параметр ‒ выводимая строка.
Шрифт, который используется для вывода текста, определяется
значением свойства Font соответствующего объекта Canvas. Свойство
Font представляет собой объект типа TFont. В таблице 1.4 перечислены
свойства объекта TFont, определяющие характеристики шрифта,
используемого методом TextOutA для вывода текста.
Таблица 1.4 ‒ Свойства объекта TFont
Свойство
Описание
Name
Используемый шрифт. В качестве значения
следует
использовать
название
шрифта
(например, Arial)
Size
Размер шрифта в пунктах (points). Пункт ‒ это
единица
измерения
размера
шрифта,
Style
используемая в полиграфии. Один пункт равен
1/72 дюйма.
Стиль начертания символов. Может быть:
нормальным,
полужирным,
курсивным,
подчеркнутым, перечеркнутым. Стиль задается
при помощи следующих констант: fsBold
(полужирный), fsItalic (курсив), fsUnderline
(подчеркнутый), fsStrikeOut (перечеркнутый)
Свойство Style является множеством, что
позволяет комбинировать необходимые стили.
Например, инструкция, которая устанавливает
стиль "полужирный курсив", выглядит так:
Canvas->Font->Style = TFontStyles ()
<<fsBold<<fsUnderline
Цвет символов. В качестве значения можно
использовать константу типа TColor
При выводе текста весьма полезны методы TextWidth и TextHeight,
значениями которых являются соответственно ширина и высота
области вывода текста, которые, очевидно, зависят от характеристик
используемого шрифта. Обоим этим методам в качестве параметра
передается строка, которую предполагается вывести на поверхность
методом TextOutA.
Следующий фрагмент кода демонстрирует использование методов,
обеспечивающих вывод текста на поверхность формы. Приведенная
функция обработки события OnPaint закрашивает верхнюю половину
окна белым, нижнюю ‒ голубым цветом, затем в центре окна, по
границе закрашенных областей, выводит текст
Color
void__fastcall TForml::FormPaint(TObject *Sender)
{
AnsiString ms = "Borland C++Builder";
TRect aRect;
int x,y; // точка, от которой будет выведен текст
// верхнюю половину окна красим белым
aRect = Rect(0,0,ClientWidth,ClientHeight/2);
Canvas->Brush->Color = clWhite;
Canvas->FillRect(aRect);
// нижнюю половину окна красим голубым
aRect = Rect(0,ClientHeight/2,ClientWidth,ClientHeight);
Canvas->Brush->Color = clSkyBlue;
Canvas->FillRect(aRect);
Canvas->Font->Name = "Times New Roman";
Canvas->Font->Size = 24;
// текст разместим в центре окна
х = (ClientWidth - Canvas->TextWidth(ms)) /2;
у = ClientHeight/2 - Canvas-XTextHeight(ms) /2;
Canvas->Brush->Style = bsClear; // область вывода текста
// не закрашивать
Canvas->Font->Color = clBlack; Canvas->TextOutA(x,y,ms);
}
Иногда требуется вывести какой-либо текст после сообщения,
длина которого во время разработки программы неизвестна. В этом
случае необходимо знать координаты правой границы области
выведенного текста. Координаты правой границы текста, выведенного
методом TextOutA, можно получить, обратившись к свойству PenPos.
Следующий фрагмент кода демонстрирует возможность вывода
строки текста при помощи дух инструкций TextOutA:
Canvas->TextOutA(10,10,"Borland ");
Canvas->TextOutA(Canvas->PenPos.x, Canvas->PenPos.у,
"C++Builder");
2 ЗАДАНИЕ НА РАБОТУ
1. Создать WinForm приложение с помощью среды С++Builder.
2. На главную форму приложения поместить компонент PaintBox
из палитры инструментов System. С помощью инспектора
объектов выставить свойство компонента Align равным
allClient.
3. Для компонента PaintBox создать обработчик метода OnPaint.
4. В обработчике OnPaint написать код, отвечающий за
прорисовку флага страны, заданной по варианту задания. Флаг
должен отображаться по центру формы.
5. Над флагом страны вывести текст ‒ название страны, которой
соответствует флаг. Параметры текста задать произвольно, но
отличными от значений параметров по умолчанию.
6. Для выполнения задания на отличную оценку предусмотреть
возможность масштабирования флага при раскрытии формы на
весь экран.
ВАРИАНТЫ ЗАДАНИЙ
№
Страна
Флаг
1
Багамские Острова
2
Бразилия*
3
Бурундия*
4
Республика Конго
5
Джибути*
6
Иордания*
7
Исландия
8
Коморские острова*
9
Кувейт
10
Сейшелы
11
Тунис*
12
Эфиопия*
при прорисовке флагов, страны которых помечены звездочкой,
можно опустить прорисовку мелких элементов
*)
3 КОНТРОЛЬНЫЕ ВОПРОСЫ
4 СПИСОК ЛИТЕРАТУРЫ
Download