Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка_Delphi.doc
Скачиваний:
29
Добавлен:
28.04.2019
Размер:
407.55 Кб
Скачать

Практическая работа Delphi_13

Цель: Создать произвольные фигуры

План разработки программы

1. Создадим новое приложение.

Используем компонент PaintBox, который позволит нарисовать любую фигуру или комбинацию фигур любого цвета. Однако при этом вам придется полностью взять на себя рисование каждого элемента.

Размер и положение на экране компонента определяют только те, которые оказывают видимый эффект во время разработки: Left, Top, Width, Height и Align. Свойства Color и Font не имеют встроенного эффекта, хотя их можно использовать для передачи информации о цвете и шрифте в метод OnPaint. Этот важный метод вызывается каждый раз при перерисовке набора элементов. Код в методе OnPaint полностью определяет, как будет выглядеть конкретный набор.

Поместите на новую форму компонент PaintBox, придав ему очертания квадрата. Его свойству Color присвойте значение clWhite и создайте для него обработчик события OnPaint, используя следующий код:

With Sender AS TPaintBox, Canvas DO

Begin

Brush.Color := Color;

Pen.Color := Font.Color;

Polygon([Point(Width DIV 2, 0),

Point(Width DIV 5, Height),

Point(Widtn, 2*(Height DIV 5)),

Point(0, 2*(Height DIV 5)),

Point(4*(Wldth DIV 5), Height)]);

End;

При запуске программы на экране появится пятиконечная звезда. Цвет внутренней части звезды соответствует значению свойства Color художественного набора, а ограничительная линия — свойству Font.Color. Однако рисунок не совсем завершен: лучи звезды закрашены, а середина — нет.

Вернитесь к обработчику события OnPaint и перед строкой, начинающейся со слова Polygon, вставьте следующую строку:

SetPolyFillMode(Handle, WINDING);

Теперь внутренняя часть звезды будет также заполнена цветом. SetPolyFillMode является функцией самой Windows — это не часть Delphi. Но Delphi автоматически предоставляет доступ к каждой из тысячи, или около того, встроенных функций Windows. Данная конкретная функция определяет, какой метод используется Windows для заполнения цветом многоугольника, образованного пересечением линий.

В только что созданном нами обработчике события OnPaint непосредственно вызываются методы и устанавливаются значения полей свойства Canvas. Данное свойство само по себе является объектом, но это невидимый компонент, который может быть расположен на форме. Ознакомьтесь со списком свойств и методов этого объекта.

На ту же форму поместите еще один художественный набор, ширина которого вдвое больше высоты. Создайте для него новую заготовку обработчика события OnPaint и замените пару begin—end следующим кодом:

Var

R : TRect;

N : Word;

Const

Rainbow : ARRAY[0..4] OF TColor = (cIRed, clYellow, cILime, clBlue, clFuchsia);

begin

With.Sender AS TPaintBox, Canvas DO

Begin

R := ClientRect;

R.Bottom :=2*R.Bottom;

Pen.Width :=8;

Pen.Style := psInsideFrame;

FOR N := 0 TO 4 DO

Begin

Pen.Color := Rainbow[N];

WITH R DO

Ellipse(Left, Top, Right, Bottom);

InflateRect(R, -8, -8);

End;

End;

end;

Данный код рисует радугу. Собственно, он рисует пять эллипсов различного цвета один внутри другого, но, поскольку нижняя половина каждого эллипса находится за пределами художественного набора, рисунок напоминает радугу. В проект, с которым вы работаете, добавьте еще один художественный набор. Его свойства установите следующим образом:

Свойство Значение

Align alTop

Color clYellow

Font. Name Arial

Font.Style.fsBold True

Height 41

Для этого художественного набора создайте обработчик события OnPaint, заменив пару begin—end следующими строками:

Var a16th, N, Х : Word;

begin

with Sender AS TPaintBox, Canvas do

begin

Brush.Color := Color;

FillRect(ClientRect);

with ClientRect do

Rectangle(Left, Top, Right, Bottom);

a16th := PixelsPerInch DIV 16;

N := 0; X := 0;

while X < Width do

begin

MoveTo(X, 1);

LineTo(X, 6*(1+(Byte(N MOD 2=0) +

Byte(N MOD 4=0) + Byte(N MOD 8=0) + Byte(N MOD 16=0))));

Canvas.Font := Font;

if (N > 0) AND (N MOD 16=0) then

TextOut(PenPos.X+3, PenPos.Y-16, IntToStr(N DIV 16));

N := N + 1;

X := X + a16th;

End;

End;

end;

Программа рисует линейку вдоль верхнего края формы. Функция FillRect заполняет цветом весь художественный набор, а функция Rectangle рисует ограничительную линию. (Пока здесь нет ничего такого, чего не смог бы сделать компонент Shape.) Затем вычисляется примерное число пикселей на 1/16 дюйма. Переменным N и Х присваивается значение 0 и начинается цикл, рисующий вертикальные линии по всей ширине художественного набора через каждую 1/16 дюйма.

Внутри цикла функция MoveTo перемещает перо к верхнему краю художественного набора, к позиции пикселя, определяемой переменной X. Функция LineTo рисует вертикальную линию от этой позиции вниз; самые длинные линии рисуются на дюймовых отметках, более короткие — на полудюймовых и т.д. вплоть до самых коротких линий на отметках 1/16 дюйма. Для дюймовых отметок функция TextOut отображает соответствующие цифры справа от отметки. Каждый раз в течение всего цикла при рисовании очередной отметки переменная N увеличивается на 1, а переменная Х — на количество пикселей в 1/16 дюйма.

Самая первая линия имеет номер 0, поэтому давайте рассмотрим, как вычисляется длина линии номер 1, первой 1/16-дюймовой отметки. Данный номер не делится на 2, 4, 8 или 16, поэтому длина этой линии будет равна 6. А как с дюймовой отметкой (линия номер 16)? Этот номер делится на 2, 4, 8 и 16. Соответственно длина этой линии равна 5*6, или 30 пикселям. Этот метод позволяет определить длину каждой линии — от дюймовой отметки до 1/16-дюймовой.

Задание для самостоятельного выполнения

1. Измените цвета фона и текста в вашей заставке, созданной в первом задании. Установите на заставке дополнительное изображение, соответствующее вашим интересам.