Процедуры для работы с графическим окном
Учебное пособие по GraphABC
Часть I.
Модуль GraphABC
Для работы в графическом режиме в PascalABC.NET имеется стандартный модуль GraphABC,который представляет собой графическую библиотеку и предназначен для создания графических и анимационных программ.
Модуль GraphABCподключается к программе в разделе Uses:
Uses GraphABC;
Этотраздел располагается в самом начале программы.
Графическое окно
Если к программе подключен модуль GraphABC,то программа выполняется в специальном графическом окне, которое располагается «перед» окном PascalABC.Net. Графическое окно по умолчанию имеет заголовок GraphABC.Net,размер 640 на 480 пикселов и располагается в центре экрана. Мышью можно изменять размер графического окна и перемещать его за заголовок, как обычное окно Windows.
Для реализации действий с графическим окном используется объектWindow(окно). Объект Windowимеет ряд свойств. Среди них:
- Left - отступ графического окна от левого края экрана в пикселах
- Top - отступ графического окна от верхнего края экрана в пикселах
- Width – ширина графического окна в пикселах(по умолчанию – 640 пикселов);
- Height– высота графического окна в пикселах(по умолчанию – 480 пикселов);
- Caption– заголовок графического окна(по умолчанию – GraphABC.Net);
Свойства используются для того, чтобы управлять внешним видом окна.
Для задания значения свойств используется оператор присваивания следующего вида:
<имя объекта>.<имя свойства>:=<значение свойства>;
Пример 1.Вывести на экран графическое окно. Выдержать паузу 5 секунд. Затем:
- Установить отступы графического окна: от левого края экрана – 450 пикселов, и от верхнего края экрана – 10 пикселов.
- Установить размер графического окна – 800 на 600 пикселов.
- Задать заголовок графического окна – «Паскаль. Графика».
UsesGraphABC; // подключение модуля
begin// начало программы
Sleep(5000); // пауза 5000 миллисекунд
Window.Left:=450; // отступ слева - 450 пикселов
Window.Top:=10; // отступ сверху - 10 пикселов
Window.Width:=800; // ширина окна - 800 пикселов
Window.Height:=600; // высота окна - 600 пикселов
ClearWindow(clSilver); // очистка окна серебряным цветом
Window.Caption:=('Паскаль. Графика'); // текст в заголовке окна
End.//конец программы
Пояснение. Т.к. к программе подключен модуль GraphABC, открывается графическое окно. Оно по умолчанию имеет заголовок GraphABC.Net,размер 640 на 480 пикселов и располагается в центре экрана.
В таком виде это окно находится 5 секунд, благодаря оператору Sleep(5000), задающему паузу в 5000 миллисекунд (5 секунд).
Затем работают операторы присваивания, которые задают новые значения свойствам Left, Top, Width, Height и Caption объекта Window.
Процедура ClearWindow(clSilver); закрашивает окно серебряным цветом.
В результате - размер, расположение графического окна и его заголовок - изменились.
Чтобы закрыть окно, нажмите значок «Завершить» на панели инструментов, или нажмите кнопку Закрыть(« крестик»).
Такого же результата можно было бы достичь, используя следующие процедуры:
SetWindowLeft(450);
SetWindowTop(10);
SetWindowWidth(800);
SetWindowHeight(600);
SetWindowCaption('Паскаль. Графика');
Кроме этого, есть процедура, которая одновременно устанавливаетотступы, размеры и цвет графического окна:
InitWindow(450,10,800,600,clSilver);
Тогда программа Примера 1 будет выглядеть короче:
UsesGraphABC; // подключение модуля
begin// начало программы
Sleep(5000); // пауза 5 сек.
InitWindow(450,10,800,600,clSilver); // отступы, размеры и цвет окна
SetWindowCaption('Паскаль. Графика'); // текст в заголовке окна
End.// конец программы
Цвет
Изображение на экране состоит из светящихся точек – пикселов.
Цвет каждого пиксела является результатом смешения трёх базовых цветов:
- Red(красного)
- Green(зелёного)
- Blue(синего).
Интенсивность каждого базового цвета лежит в диапазоне от 0 (отсутствие цвета) до 255 (максимально интенсивный). Такая модель цвета называется RGB.
Кроме цвета пиксел характеризуется прозрачностью, которая также измеряется от 0 (абсолютная прозрачность) до 255 (нет прозрачности).
Таким образом, для задания каждого пиксела в компьютере требуется 4 байта: 1 под прозрачность и 3 под базовые цвета.
Для работы с цветом в модуле GraphABCиспользуется тип Color.
Цветовые константы
(здесь приведено только несколько цветовых констант, на самом деле в модуле их около 140)
Цветовая константа | Цвет |
clBlack | Чёрный |
clMaroon | Красно-коричневый |
clGreen | Зелёный |
clOlive | Желтовато-зелёный |
clNavy | Тёмно-синий |
clPurple | Пурпурный |
clSkyBlue | Голубой |
clGray | Серый |
clSilver | Серебряный |
clRed | Красный |
clLime | Салатовый |
clYellow | Жёлтый |
clBlue | Синий |
clFuchsia | Ярко-розовый |
clAquamarine | Бирюзовый |
clLightGray | Светло-серый |
clDarkGray | Тёмно-серый |
clWhite | Белый |
Пример6.Получениеи вывод базовых составляющих цвета clAquamarine.
UsesGraphABC; //подключение модуля
VarC: Color; //переменная С типа Color
begin//начало программы
Window.Caption:='Цвет Aquamarine'; // заголовок окна
C := clAquamarine; //С получила значение clAquamarine
WriteLn('Red=',GetRed(C),
'Green=',GetGreen(C),
'Blue=',GetBlue(C)); // вывод базовых составляющих цвета
End.//конец программы
Пример 7.Получение и вывод базовых составляющих случайного цвета.
UsesGraphABC; //подключение модуля
VarC: Color; //переменная С типа Color
begin//начало программы
Window.Caption:='Случайный цвет'; // заголовок окна
C := clrandom; //С получила случайное значение
Print(GetAlpha(C), //вывод прозрачности
GetRed(C), // и базовых составляющих цвета С
GetGreen(C),
GetBlue(C));
end.//конец программы
Перо
Для рисования линий, контуров фигур и текста используется объект Pen(перо). Объект Pen имеет ряд свойств. Среди них:
- Color – цвет пера (по умолчанию clBlack- чёрный);
- Width – толщина перав пикселах (по умолчанию – 1 пиксел);
- Style – стиль пера(по умолчанию – psSolid);
- X – x-координата текущей позиции пера;
- Y– y-координата текущей позиции пера;
Стили пера
Значения свойства Styleобъекта Pen | Стиль линии | Образец линии |
psSolid(по умолчанию) | Сплошное перо | |
psClear | Прозрачное перо | |
psDash | Штриховое перо | |
psDot | Пунктирное перо | |
psDashDot | Штрихпунктирное перо | |
psDashDotDot | Перо, чередующее штрих и два пунктира |
Перо по умолчанию пишет чёрной сплошной линией толщиной 1 пиксел. Задать другие значения легко, присваивая свойствам пера нужные значения:
Pen.Color := clRed; {перо будет писать красным цветом}
Pen.Width:= 3; {толщина пера – 3 пиксела }
Pen.Style := psDot; {линии будут пунктирные}(
Такого же результата можно достичь, используя следующие процедуры:
SetPenColor(clRed); {перо будет писать красным цветом}
SetPenWidth(3); {толщина пера – 3 пиксела }
SetPenStyle(psDot); {линии будут пунктирные}
Процедуры движения пера, рисования отрезков | |
MoveTo(X,Y); | Перо устанавливается в точку X,Y |
LineTo(X,Y); | Рисуется отрезок от текущей позиции пера до точки (X,Y). Текущая позиция переносится в точку (X,Y). |
Line(X1,Y1, X2,Y2); | Рисуется отрезок от точки (X1,Y1) до точки (X2,Y2). Положение пера не изменяется. |
Процедура закраски замкнутой области | |
FloodFill(X,Y,C); | Закрашивает замкнутую область одного цвета цветом C, начиная с точки (X,Y), находящейся внутри замкнутой области. |
Пример 8. Нарисовать диагонали графического окна с помощью поцедуры Line
UsesGraphABC;
Begin
Window.Title := 'Диагонали окна';
Pen.Color := clRandom; {случайный цвет пера}
Pen.Width := 5; {толщина пера – 5 пикселов }
Pen.Style := psDash; {штриховое перо}
Line(0,0, WindowWidth,WindowHeight);
Line(0,WindowHeight, WindowWidth,0);
end.
Пример9. Нарисовать и закрасить пятиконечную звезду
Вершины пятиконечной звезды имеют координаты: A (200,100) B (295,169) C (259,281) D (141,281) E (105,169) Красным пером толщиной 4 пиксела нарисовать звезду, используя процедуры рисования MoveTo и LineTo. Дополнительно: закрасить звезду красным цветом, используя процедуру FloodFill. |
UsesGraphABC;
Begin
Window.Caption :='Пятиконечная звезда'; // Заголовок окна
Pen.Color := clRed; // Красный цвет пера
Pen.Width := 4; // Толщина пера 4 пиксела
{Другой вариант программы, где предыдущие три оператора заменяются процедурами:
SetWindowCaption('Пятиконечная звезда');
SetPenColor(clRed);
SetPenWidth(3);
}
MoveTo(200, 100); // Установить перо в точку А
LineTo(259, 281); // Отрезок АС
LineTo(105, 169); // Отрезок СЕ
LineTo(295, 169); // Отрезок ЕВ
LineTo(141, 281); // Отрезок ВD
LineTo(200, 100); // Отрезок DА
FloodFill(200, 200, clred); // Закраска центрального пятиугольника
FloodFill(200, 104, clRed); // Закраска вершины A
FloodFill(280, 170, clRed); // Закраска вершины B
FloodFill(120, 170, clRed); // Закраска вершины E
FloodFill(240, 240, clRed); // Закраска вершины C
FloodFill(160, 240, clRed); // Закраска вершины D
end.
Как нарисовать круг в графическом окне?
Центр круга спроектируем на оси координат. На оси X получаем точку X0, а на оси Y получаем точку Y0. Это и есть координаты центра круга – (X0,Y0). Радиус круга обозначен буквой R. Чтобы задать круг, надо вызвать нужную процедуру и в ней перечислить 3 параметра – координаты центра и радиус: X0,Y0,R. |
Процедуры рисования круга
DrawCircle(X0,Y0,R); | Контур круга (окружность) рисуется текущим пером. Внутренность круга не закрашивается |
FillCircle(X0,Y0,R); | Внутренность круга закрашивается текущей кистью. Контур круга (окружность)не рисуется |
Circle(X0,Y0,R); | Контур круга (окружность) рисуется текущим пером. Внутренность круга закрашивается текущей кистью. |
Пример 10.Нарисуем пять концентрических окружностей разными стилями пера.
Центр окружностей – точка (320,240).
UsesGraphABC; //подключение модуля GraphABC
begin //начало программы
Window.Caption := ' «Стильные» окружности'; // заголовок окна
Pen.Color := clRandom; // задали случайный цвет пера
Pen.Width := 3; // толщина пера - 3 пиксела
Pen.Style := psSolid; // стиль пера "Сплошное перо"
DrawCircle(320,240, 220); // нарисовали сплошную окружность R=220
Pen.Style := psDash; // стиль пера "Штриховое перо"
DrawCircle(320,240, 180); // нарисовали штриховую окружность R=180
Pen.Style := psDot; // стиль пера "Пунктирное перо"
DrawCircle(320,240, 140); // нарисовали пунктирную окружность R=140
Pen.Style := psDashDot; // стиль пера "Штрихпунктирное перо"
DrawCircle(320,240, 100); // штрихпунктирная окружность R=100
Pen.Style := psDashDotDot; // стиль пера "Штрих и два пунктира"
DrawCircle(320,240, 60); // нарисовали окружность таким стилем R=60
end.
Другой вариант программы, где для изменения свойств объекта Penиспользуются процедуры:
UsesGraphABC; //подключение модуля GraphABC
begin //начало программы
SetWindowCaption('«Стильные» окружности'); // заголовок окна
SetPenColor(clRandom); // задали случайный цвет пера
SetPenWidth(3); // толщина пера - 3 пиксела
SetPenStyle(psSolid); // стиль пера "Сплошное перо"
DrawCircle(320,240, 220); // нарисовали сплошную окружность R=220
SetPenStyle(psDash); // стиль пера "Штриховое перо"
DrawCircle(320,240, 180); // нарисовали штриховую окружность R=180
SetPenStyle(psDot); // стиль пера "Пунктирное перо"
DrawCircle(320,240, 140); // нарисовали пунктирную окружность R=140
end.
Кисть
Для закрашивания внутренностей замкнутых областей используется объект Brush(кисть). Объект Brushимеет ряд свойств:
- Style – стиль кисти(по умолчанию - bsSolid);
- Color – цвет кисти(по умолчанию clWhite- белый);
- Hatch – штриховка(по умолчанию - bhCross);
- HatchBackgroundColor – фон штриховки(по умолчанию clWhite- белый).
Среди свойств кисти определяющим является свойство Style – стиль кисти.
Стили кисти
Значения свойства Style объекта Brush | |
bsSolid (по умолчанию) | Сплошная кисть. Закрашивает замкнутую область. Цвет сплошной кисти задаётся свойством - Color – цвет кисти(по умолчанию clWhite- белый). |
bsClear | Прозрачная кисть.Закраска не происходит. |
bsHatch | Штриховая кисть. Штрихует замкнутую область. Для штриховой кисти свойство Color не срабатывает, зато можно устанавливать свойства: - Hatch – штриховка(по умолчанию bhCross- клетка); - HatchBackgroundColor – фон штриховки (по умолчанию - белый) |
Стили штриховки(здесь приведено несколько штриховок, на самом деле в модуле их около 60)
Значения свойства Hatch объекта Brush | Штриховка | Образец штриховки |
bhCross | Прямоугольная клетка | |
bhDiagonalCross | Косоугольная клетка | |
bhBackwardDiagonal | Косой штрих / / / / / | |
bhForwardDiagonal | Косой штрих \ \ \ \ \ | |
bhHorizontal | Штриховка горизонтальными линиями | |
bhVertical | Штриховка вертикальными линиями |
Задание свойств кисти:
Brush.Color:= clGreen;{цвет сплошной кисти - зелёный}
Brush.Style:= bsHatch;{стиль кисти– штриховая кисть}
Brush.Hatch:= bhDiagonalCross;{стиль штриховки – косоугольная клетка}
Brush.HatchBackgroundColor:=clBlue; {задний плана штриховки - синего цвета}
Такого же результата можно достичь, используя следующие процедуры:
SetBrushColor(clGreen);{цвет сплошной кисти - зелёный}
SetBrushStyle(bsHatch);{стиль кисти – штриховая кисть}
SetBrushHatch(bhDiagonalCross);{стиль штриховки – косоугольная клетка}
SetHatchBrushBackgroundColor(clBlue);{задний плана штриховки - синего цвета}
Пример 11.Работа с кистью.
Нарисуем три круга с помощью процедуры Circle.
Эта процедура нарисует круги текущим пером чёрного цвета (по умолчанию), и каждый круг закрасит кистью в зависимости от установленного стиля кисти.
UsesGraphABC; // Подключили модуль GraphABC
begin// Начало программы
Window.Caption:='«Стильные» круги';// Заголовок графического окна
Brush.Color := clYellow;// Задали цвет кисти - clYellow (жёлтый)
Brush.Hatch := bhVertical;//Задали стиль штриховки-bhVertical(вертикаль)
Brush.HatchBackgroundColor:=clLime;//Задали фон штриховки-clLime(салатовый)
Brush.Style := bsClear;// Задали стиль кисти - Прозрачная кисть (bsClear)
Circle(100,240,100); // Нарисовали первый круг
// Видим, что закраска и штриховка отсутствуют
Brush.Style := bsSolid;// Задали стиль кисти - Сплошная кисть (bsSolid)
Circle(300,240,100); // Нарисовали второй круг
// Закраска цветом кисти clYellow, штриховки нет
Brush.Style := bsHatch;// Задали стиль кисти - Штриховая кисть (bsHatch)
Circle(500,240,100); // Нарисовали третий круг
// Штриховка - bhVertical, фон штриховки - clLime
end. // Конец программы
Как нарисовать прямоугольник в графическом окне?
Рассмотрим левый верхний угол прямоугольника. Спроектируем его на оси координат. На оси X получаем точку X1, а на оси Y получаем точку Y1. Это и есть координаты левого верхнего угла прямоугольника – (X1,Y1). Аналогично подробно объяснить про правый нижний угол – (X2,Y2). |
Чтобы нарисовать прямоугольник – надо вызвать нужную процедуру и в ней перечислить 4 параметра: X1,Y1,X2,Y2.
Пояснение.
В разделе Uses программы подключен модуль GraphABC.
Процедура InitWindow(450,10,500,500,clRed);задаёт отступы окна 450 и 10 пикселов, задаёт размер окна - 500×500 пикселови окрашиваетокно в красный цвет.
Процедура SetWindowCaption ('Чёрный квадрат в красном окне'); задаёт заголовок графического окна.
Процедура SetBrushColor(clBlack);делает цвет кисти чёрным для закраски квадрата.
В центре экрана рисуется чёрный квадрат: FillRectangle(100,100,400,400);.
Пример 13.Прямоугольники разных цветов и прозрачности.
UsesGraphABC;
Begin
Window.Caption := 'Прозрачные прямоугольники';
Brush.Color := clRed; //красный
FillRectangle(50,50,100,Window.Height - 50);
Brush.Color := clGreen; //зелёный
FillRectangle(150,50,200,Window.Height - 50);
Brush.Color := clBlue; //синий
FillRectangle(250,50,300,Window.Height - 50);
Brush.Color := ARGB(127,255,0,0); //красный, прозрачность 127
FillRectangle(20,100,420,150);
Brush.Color := ARGB(63,0,255,0); //зелёный, прозрачность 63
FillRectangle(20,200,420,250);
Brush.Color := ARGB(31,0,0,255); //синий, прозрачность 31
FillRectangle(20,300,420,350);
End.
Шрифт
Вывод текста осуществляется текущим шрифтом. Для работы с текущим шрифтом используется объект Font(шрифт). Fontимеет ряд свойств. Среди них:
- Color – цвет шрифта (по умолчанию - clBlack);
- Style – стиль шрифта (по умолчанию – fsNormal);
- Size – размер шрифта в пунктах (по умолчанию – 10 пунктов);
Подложка текста имеет цвет Brush.Color(цвет кисти).
Стили шрифта
fsNormal – обычный;
fsBold – жирный;
fsItalic – наклонный;
fsBoldItalic – жирный наклонный;
fsUnderline – подчеркнутый;
fsBoldUnderline – жирный подчеркнутый;
fsItalicUnderline – наклонный подчеркнутый;
fsBoldItalicUnderline – жирный наклонный подчеркнутый.
Задание свойств шрифта.
Font.Color := clRandom;{цвет шрифта - случайный}
Font.Style := fsItalic;{стиль шрифта - наклонный}
Font.Size := 12{размер шрифта – 12 пунктов}
Такого же результата можно достичь, используя следующие процедуры:
SetFontColor(clRandom);{цвет шрифта - случайный}
SetFontStyle(fsItalic);{стиль шрифта - наклонный}
SetFontSize(12);{размер шрифта – 12 пунктов}
Пример 14.Ввести с клавиатуры вещественное число Х и вычислить значение Y=2X. Значения X и Y вывести в графическом окне.
UsesGraphABC;//подключение модуля
VarX, Y: Real;
Begin//начало программы
InitWindow(450,10,800,600,clSilver);// отступы, размеры и серебряный цвет окна
SetBrushColor(clWhite); //цвет кисти - белый
FillRectangle(50,50,750,550); //прямоугольник, закрашенный белой кистью
SetFontColor(clNavy); //цвет шрифта - тёмно-синий
SetFontSize(18); //размер шрифта - 18
SetFontStyle(fsBoldItalic); //стиль шрифта – жирный наклонный
TextOut(100,100,'Введите значение Х'); //вывод приглашения
ReadLn(X); //ввод значения Х
TextOut(100,130,'Вы ввели Х='); //вывод текста
TextOut(250,130,X); //вывод Х в ту же строку, правее
Y := 2*X; //вычисление Y
TextOut(100,180,'Ответ: Y = 2X ='); //вывод текста
TextOut(310,180,Y); //вывод Y в ту же строку, правее
end.
Пример 15.Нарисовать на экране Российский флаг. Внизу под флагом написать слово «РОССИЯ».
UsesGraphABC; //подключение модуля
begin//начало программы
InitWindow(450,10,800,600,clLightGray); // отступы, размеры и цвет окна
SetWindowCaption('Российский флаг'); //заголовок окна
SetBrushColor(clWhite); //цвет кисти - белый
FillRectangle(150,150,650,250); //закрашенный кистью прямоугольник
SetBrushColor(clBlue); //цвет кисти - синий
FillRectangle(150,250,650,350); //закрашенный кистью прямоугольник
SetBrushColor(clRed); //цвет кисти - красный
FillRectangle(150,350,650,450); //закрашенный кистью прямоугольник
SetBrushColor(clLightGray); //цвет кисти – серый (подложка под текст)
SetFontSize(66); //размер шрифта - 66
SetFontStyle(fsBoldItalic); //стиль шрифта – жирный наклонный
TextOut(200,480,'РОССИЯ'); //вывод слова РОССИЯ из точки (200,480)
end. //конец программы
Пояснение.
Создается графическое окно с заголовком 'Российский флаг'размером 800х600.
Окно окрашивается в светло-серый цвет.
Последовательно рисуются 3 прямоугольника: белого цвета, синего цвета, красного цвета друг под другом.
Под флагом выводится надпись'РОССИЯ'шрифтом размера 66 пунктов.
Часть II.
Следующие примеры рассчитаны на знание оператора цикла
Пример 1.Работа с цветом и пером.
Хотим пересмотреть все возможные оттенки цвета Red.Нарисуем слева направо
256 вертикальных отрезков с нарастающей интенсивностью красного.
UsesGraphABC; // подключение модуля GraphABC
VarRed, // Red - интенсивность красного
h:Integer; // h – отступ вертикали от левого края окна
begin// начало программы
Window.Caption:='Красный цвет от 0 до 255';// заголовок окна
ForRed:=0 To255 Do// Red - составляющая красного от 0 до 255
begin// начало тела цикла
Pen.Color:=RGB(Red,0,0); // цвет пера задаём равным Red
Line(h,0, h,480); // рисуем вертикальный отрезок от h,0)до(h,480)
h:= h+1; // сдвигаемся на 1 пиксел вправо
end; // конец цикла
end. // конец программы
Пример 2.Сначала хаотично падают в окно 99 прямоугольников, нарисованных пером, но не закрашенных (DrawRectangle). Затем хаотично падают в окно 99 прямоугольников, закрашенных кистью, но не обведённых пером (FillRectangle). Цвет пера, кисти, а также размер и положение прямоугольников – случайны.
UsesGraphABC;
Varx, y, i: integer;
Begin
Window.Caption := 'DrawRectangle и FillRectangle';
Fori := 1 to99 do
Begin
Pen.Color := clRandom;
x := Random(Window.Width-100);
y := Random(Window.Height-100);
DrawRectangle(x,y,x+Random(100),y+Random(100));
Sleep(30);
end;
fori := 1 to99 do
Begin
Brush.Color :=clRandom;
x := Random(Window.Width-100);
y := Random(Window.Height-100);
FillRectangle(x,y,x+Random(100),y+Random(100));
Sleep(30);
end;
end.
Пример 3. Программа «Крупа». Сто тысяч и тридцать три пиксела случайного цвета рассыпаются по окну. Затем случайным цветом в окне выводится текст «PascalABC.NET”.
UsesGraphABC; //подключение модуля
Vari:integer; //объявление параметра цикла
begin//начало программы
Window.Caption :='Крупа'; //заголовок окна
Fori:=1 to100033 do//сто тысяч тридцать три пиксела
SetPixel(Random(Window.Width),Random(Window.Height),clRandom);
Font.Style := fsBoldItalic; //стильшрифта - жирныйнаклонный
Font.Size := 24; //задали размер шрифта - 24
Font.Color := clRandom; //задали случайный цвет текста
brush.Color:=ARGB(0,0,0,0); //задали прозрачную подложку текста
TextOut(200,220,'PascalABC.NET'); //вывод текста из точки (200,220)
end.
Пример 4. Программа «Долой прозрачность». Круги случайного цвета и размера с прозрачностью от 0 до 255 рассыпаются в окне.
UsesGraphABC;
VarTransparency: integer;
Begin
randomize;
forTransparency:=0 to255 do //прозрачность – параметр цикла
Begin
Brush.Color:=ARGB(Transparency,Random(256),Random(256),Random(256));
FillCircle(Random(Window.Width),Random(Window.Height),Random(20,60));
sleep(10);
end;
end.
Пример 5. Демонстрация работы со шрифтами.
UsesGraphABC; //подключение модуля
Vari: integer; //объявление переменных
begin//начало программы
Window.Caption := 'Шрифты'; //заголовок окна
Font.Style := fsBoldItalic; //стиль шрифта - жирный наклонный
Fori:=10 to17 do//параметр цикла - размер шрифта от 10 до 17
begin//начало тела цикла
Font.Size := i; //задали размер шрифта
Font.Color := clRandom; //задали случайный цвет
WriteLn('PascalABC.NET'); //вывели текст
end; //конец цикла
readln; //останов программы до нажатия Enter
Font.Style := fsBoldUnderline;
Fori:=10 to17 do
Begin
Font.Size := i;
Font.Color := clRandom;
WriteLn('PascalABC.NET');
end;
end. //конец программы
Пример 6. Имитация кругов на воде от капель дождя.
UsesGraphABC;
ProcedureKaplia(x0,y0: integer); //заголовок процедуры
Vari : integer; //локальная переменная
Begin
fori:=1 to63 do //вцикле – 63 итерации
Begin
Pen.Color := RGB(i*4,i*4,i*4); //перо – серое от тёмного к светлому
Circle(x0,y0,i); //стопка из 63-х кругов с растущим радиусом
Sleep(10);
end;
end;
BEGIN
Window.Caption := 'Капли дождя'; //заголовок окна
SetWindowSize(800,600); //размер окна
Randomize; //инициализация ГСЧ
WhileTrue do //бесконечный цикл
Kaplia(Random(800),random(600)); //вызов процедуры
END.
Пояснение.
Эффект капли реализован в процедуре Kapliaв цикле с параметром i, возрастающем от 1 до 63.
- Оператор Pen.Color := RGB(i*4,i*4,i*4);задаёт текущий цвет пера. Это серый цвет, его интенсивность в цикле меняется от тёмного к светлому.
- Оператор Circle(x0,y0,i); создает «стопку» из 63-х концентрических кругов. Радиус кругов в цикле растёт от 1 до 63, поэтому каждый следующий круг закрывает собой все предыдущие.
- Каждый круг имеет контур серого цвета– и каждый следующий круг имеет контур светлее, чем предыдущие. Чем больше диаметр круга, тем светлей его контур. Последний 63-й круг почти не виден на белом фоне окна.
- Все круги закрашиваются белой кистью (по умолчанию).
Таким образом, каждый вызов процедуры имитирует расходящийся круг на воде от упавшей капли.
В основной программе «дождь» реализован бесконечным циклом, т.к. условие продолжения цикла – всегда True:
WhileTrue do
Kaplia(Random(800),random(600));
В процедуру передаются два параметра, задающие центр капли. Координаты центра капли вычисляются как случайные числа так, чтобы центр не вышел за пределы окна.
Пример 7.Мульфильм “Паровоз”.
ProgramParovoz;
UsesGraphABC;
Const
dx = 10; //перемещение за одну итерацию
N = WindowWidth divdx; //количество итераций
t = 3000 divN; //пауза в одной итерации
//чтобы цикл длился 3 секунды
Var
i, //параметр цикла для паровоза
j: Integer; //параметр цикла для дыма
Begin
InitWindow(450,10,800,600,clLightGray); // отступы, размеры и цвет окна
SetWindowCaption('Паровоз'); // текст в заголовке окна
SetBrushStyle(bsHatch); //кисть штриховая
SetBrushHatch(bhBackwardDiagonal); //со стилем штриховки – косой штрих
SetHatchBrushBackgroundColor(clGreen); //с зелёным цветом заднего плана
FillRectangle(0, 550, 800, 600); //рисуем траву
SetBrushStyle(bsSolid); //кисть сплошная
SetBrushColor(clSkyBlue); //кисть голубого цвета
FillRectangle(0, 0, 800, 100); //рисуем небо
SetBrushColor(clYellow); //кисть жёлтого цвета
FillCircle(600, 50, 30); //рисуем солнце
Fori := 0 toN do//движение паровоза
Begin
SetBrushColor(clMaroon); //кисть красно-коричневого цвета
FillRectangle(i*dx, 390, 180+i*dx, 490); //корпус паровоза
FillRectangle(i*dx, 350, 40+i*dx, 390); //труба паровоза
SetBrushColor(clBlack); //кисть чёрного цвета
FillCircle(30+i*dx, 520, 30); //заднее колесо
FillCircle(150+i*dx, 520, 30); //переднее колесо
SetPenColor(clWhite); //кисть белого цвета
Forj := 1 to4 do//рисуем 4 кольца дыма
DrawEllipse(i*dx, 330-j*15, 40+i*dx, 350-j*15);
sleep(t); //пауза
SetBrushColor(clLightGray); //кисть цвета фона окна
FillRectangle(i*dx, 260, 180+i*dx, 550); //закрыли паровоз
end;
end.
Пример 8а.Анимация. Мерцание.
UsesGraphABC;
Varx: integer;
Begin
Window.Caption := 'Эффект мерцания';
Brush.Color := clGreen; //взяли зелёную кисть
Forx := 70 to500 do //поехали
Begin
ClearWindow(clWhite); //очистили экран белым цветом
Circle(x,200,50); //нарисовали круг с центром (x,200)
Sleep(10); //пауза
end;
end.
Пояснение.
В цикле окружность перемещается вправо, т.к. координата X центра круга увеличивается, являясь параметром восходящего цикла.
При движении сильно проявляется эффект мерцания.
Чтобы избежать мерцания, можно воспользоваться процедурами LockDrawing и Redraw.
Основная идея состоит в следующем:
- вызвав LockDrawing, отключим рисование на экране,– тогда рисование будет осуществляться только во внеэкранном буфере
- далее будем формировать новый кадр изображения и, когда он сформирован, выводить его на экран целиком, вызывая процедуру Redraw, которая перерисовывает всё графическое окно
Данный метод используется для ускорения анимации и создания анимации без мерцания.
Пример 8б. Анимация без мерцания.
UsesGraphABC;
Varx: integer;
Begin
Window.Caption := 'Анимация без мерцания';
Brush.Color := clGreen;
LockDrawing; //отключаем рисование в окне
Forx := 70 to500 do
Begin
ClearWindow(clWhite);
Circle(x,200,50);
Redraw; //перерисовываем окно из внеэранного буфера
Sleep(10);
end;
end.
ПРИЛОЖЕНИЕ
Основные подпрограммы модуля GraphABC
InitWindow(l,t,w,h,Color); | Устанавливает отступы, размеры и цвет графического окна |
ClearWindow; | Очищает графическое окно и закрашивает белым цветом |
ClearWindow(Сolor); | Очищает графическое окно и закрашивает цветом Сolor |
Sleep(T); | Пауза длительностью T миллисекунд |
PutPixel(x,y, Color); | Пиксел с координатами (x, y) закрашивается цветом Color |
SetBrushColor(Сolor); | Устанавливает цвет кисти Сolor |
SetPenColor(Color); | Устанавливает цвет пера Сolor |
SetPenWidth(Width); | Устанавливает толщину пера в пикселах |
MoveTo(x,y); | Перо устанавливается в точку (x,y) |
LineTo(x,y); | Рисуется отрезок от текущей позиции пера до точки (x,y). Текущая позиция переносится в точку (x,y). |
Line(x1,y1,x2,y2); | Рисуется отрезок от точки (x1,y1) до точки (x2,y2). Положение пера не изменяется. |
DrawCircle(x,y,r); | Контур круга с центром (x,y) и радиусом r рисуется текущим пером. Внутренность круга не закрашивается |
FillCircle(x,y,r); | Внутренность круга с центром (x,y) и радиусом r закрашивается текущей кистью. Контур круга не рисуется. |
Circle(x,y,r); | Контур круга с центром (x,y) и радиусом r рисуется текущим пером. Внутренность круга закрашивается текущей кистью. |
DrawEllipse(x1,y1,x2,y2); | Эллипс, вписанный в прямоугольник с координатами противоположных вершин (x1,y1)и (x2,y2) рисуется текущим пером. Внутренность эллипса не закрашивается. (Прямоугольник не рисуется.) |
DrawRectangle(x1,y1,x2,y2); | Контур прямоугольника с координатами противоположных вершин (x1,y1)и (x2,y2) рисуется текущим пером. Внутренность прямоугольника не закрашивается |
FillRectangle(x1,y1,x2,y2); | Внутренность прямоугольника с координатами противоположных вершин (x1,y1) и (x2,y2)закрашивается текущей кистью. Контур прямоугольника не рисуется. |
Rectangle(x1,y1,x2,y2); | Контур прямоугольника с координатами противоположных вершин (x1,y1)и (x2,y2) рисуется текущим пером. Внутренность прямоугольника закрашивается текущей кистью. |
FloodFill(x,y, Color); | Закрашивает замкнутую область одного цвета цветом Color, начиная с точки (x,y), находящейся внутри замкнутой области. |
SetFontColor(Color); | Устанавливает цвет шрифта |
SetFontSize(Size); | Устанавливает размер шрифта в пунктах |
TextOut(x,y,Текст); | Выводит Текст начиная с точки с координатами (x,y). В качестве Текста можно передавать значение любого типа. |
Учебное пособие по GraphABC
Часть I.
Модуль GraphABC
Для работы в графическом режиме в PascalABC.NET имеется стандартный модуль GraphABC,который представляет собой графическую библиотеку и предназначен для создания графических и анимационных программ.
Модуль GraphABCподключается к программе в разделе Uses:
Uses GraphABC;
Этотраздел располагается в самом начале программы.
Графическое окно
Если к программе подключен модуль GraphABC,то программа выполняется в специальном графическом окне, которое располагается «перед» окном PascalABC.Net. Графическое окно по умолчанию имеет заголовок GraphABC.Net,размер 640 на 480 пикселов и располагается в центре экрана. Мышью можно изменять размер графического окна и перемещать его за заголовок, как обычное окно Windows.
Для реализации действий с графическим окном используется объектWindow(окно). Объект Windowимеет ряд свойств. Среди них:
- Left - отступ графического окна от левого края экрана в пикселах
- Top - отступ графического окна от верхнего края экрана в пикселах
- Width – ширина графического окна в пикселах(по умолчанию – 640 пикселов);
- Height– высота графического окна в пикселах(по умолчанию – 480 пикселов);
- Caption– заголовок графического окна(по умолчанию – GraphABC.Net);
Свойства используются для того, чтобы управлять внешним видом окна.
Для задания значения свойств используется оператор присваивания следующего вида:
<имя объекта>.<имя свойства>:=<значение свойства>;
Пример 1.Вывести на экран графическое окно. Выдержать паузу 5 секунд. Затем:
- Установить отступы графического окна: от левого края экрана – 450 пикселов, и от верхнего края экрана – 10 пикселов.
- Установить размер графического окна – 800 на 600 пикселов.
- Задать заголовок графического окна – «Паскаль. Графика».
UsesGraphABC; // подключение модуля
begin// начало программы
Sleep(5000); // пауза 5000 миллисекунд
Window.Left:=450; // отступ слева - 450 пикселов
Window.Top:=10; // отступ сверху - 10 пикселов
Window.Width:=800; // ширина окна - 800 пикселов
Window.Height:=600; // высота окна - 600 пикселов
ClearWindow(clSilver); // очистка окна серебряным цветом
Window.Caption:=('Паскаль. Графика'); // текст в заголовке окна
End.//конец программы
Пояснение. Т.к. к программе подключен модуль GraphABC, открывается графическое окно. Оно по умолчанию имеет заголовок GraphABC.Net,размер 640 на 480 пикселов и располагается в центре экрана.
В таком виде это окно находится 5 секунд, благодаря оператору Sleep(5000), задающему паузу в 5000 миллисекунд (5 секунд).
Затем работают операторы присваивания, которые задают новые значения свойствам Left, Top, Width, Height и Caption объекта Window.
Процедура ClearWindow(clSilver); закрашивает окно серебряным цветом.
В результате - размер, расположение графического окна и его заголовок - изменились.
Чтобы закрыть окно, нажмите значок «Завершить» на панели инструментов, или нажмите кнопку Закрыть(« крестик»).
Такого же результата можно было бы достичь, используя следующие процедуры:
SetWindowLeft(450);
SetWindowTop(10);
SetWindowWidth(800);
SetWindowHeight(600);
<