- •Практическая работа Delphi_01
- •План разработки программы
- •Практическая работа Delphi_02
- •План разработки программы
- •План разработки программы
- •План разработки программы
- •Практическая работа Delphi_03
- •План разработки программы.
- •Практическая работа Delphi_04
- •План разработки программы
- •Практическая работа Delphi_05
- •План разработки программы
- •Практическая работа Delphi_06
- •План разработки программы
- •Практическая работа Delphi_07
- •План разработки программы
- •Практическая работа Delphi_08
- •План разработки программы
- •Практическая работа Delphi_09
- •План разработки программы
- •Практическая работа Delphi_10
- •План разработки программы
- •Практическая работа Delphi_11
- •План разработки программы
- •Практическая работа Delphi_12
- •План разработки программы
- •Практическая работа Delphi_13
- •План разработки программы
- •Практическая работа Delphi_14
- •План разработки программы
- •Разработчик - Иванов и.И. Пример создания заставки
- •Практическая работа Delphi_15
- •План разработки программы
- •Практическая работа Delphi_16
- •План разработки программы
- •Практическая работа Delphi_17
- •План разработки программы
- •Практическая работа Delphi_18
- •План разработки программы
- •Практическая работа Delphi_19
- •План разработки программы
Практическая работа 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. Измените цвета фона и текста в вашей заставке, созданной в первом задании. Установите на заставке дополнительное изображение, соответствующее вашим интересам.