Урок 20 Рисование с помощью графических примитивов
Canvas – холст, который позволяет нам иметь доступ к любой точке экрана. Canvas не является компонентом, это свойство некоторых компонентов в том числе и формы. Canvas имеет обширный набор методов, это такие как Pen, Brush, Ellipse, Rectangle, Pixels, MoveTo, LineTo, TextOut, Font и другие. Свойство Canvas является основой графической подсистемы Delphi. У свойств Pen и Brush есть важное свойство Color задающее цвет. Его значения можно задавать из палитры цветов с префиксом cl. Например, clRed назначает красный цвет. Желательно использовать более богатую палитру RGB имеющая следующий формат RGB(красный, зеленый, синий). Эти три значения могут варьироваться от 0 до 255. Например, RGB(190, 0, 230) выдаст светло-фиолетовый цвет. В этой палитре всего 2 ^ 24 = 16.777.216 цветов и оттенков.
Пример 1 Для построения приложения на стартовой форме разместите восемь кнопок. Каждая кнопка будет выводить на экран соответствующую геометрическую фигуру. Одна из них очищает экран. Обратите внимание на комментарии в программе. Поэкспериментируйте с параметрами методов, изменяя их значения.
unit Unit13;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm13 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form13: TForm13;
implementation
{$R *.dfm}
procedure TForm13.Button1Click(Sender: TObject);
begin
Canvas.Brush.Color := clWhite; // цвет кисти
Canvas.FillRect(Canvas.ClipRect); // очистка канвы
end;
procedure TForm13.Button2Click(Sender: TObject);
begin
Canvas.Pen.Color := clGreen; // цвет пера
Canvas.Brush.Color := clSkyBlue; // цвет кисти
// прямоугольник
Canvas.Rectangle(50, 50, 200, 300);
end;
procedure TForm13.Button3Click(Sender: TObject);
begin
Canvas.Pen.Color := clRed;
Canvas.Brush.Color := RGB(255,0,150);
// прямоугольник
Canvas.Rectangle(100, 150, 400, 320);
end;
procedure TForm13.Button4Click(Sender: TObject);
begin
Canvas.Pen.Color := clBlack;
Canvas.Brush.Color := clYellow;
// эллипс
Canvas.Ellipse(50, 100, 380, 300);
end;
procedure TForm13.Button5Click(Sender: TObject);
begin
Canvas.Pen.Color := clBlack;
Canvas.Brush.Color := RGB(0,255,150);
// эллипс
Canvas.Ellipse(150, 20, 400, 150);
end;
procedure TForm13.Button6Click(Sender: TObject);
begin
Canvas.Pen.Color := clBlack;
Canvas.Brush.Color := clFuchsia;
// прямоугольник с закругленными углами
Canvas.RoundRect(100, 100, 180, 250, 10, 10);
end;
procedure TForm13.Button7Click(Sender: TObject);
begin
Canvas.Pen.Width := 2; // ширина пера
Canvas.Pen.Color := clBlue;
Canvas.MoveTo(450,200); // перемещение пера без рисования
// рисование прямой линии из текущей в указанную точку
Canvas.LineTo(450,20);
Canvas.LineTo(200,20);
Canvas.LineTo(450,200);
end;
procedure TForm13.Button8Click(Sender: TObject);
begin
// рисование точки красного цвета
Canvas.Pixels[20, 20] := clRed;
end;
procedure TForm13.Button9Click(Sender: TObject);
begin
Canvas.Font.Color:=clBlue;
Canvas.Font.Size := 16; // размер шрифта
Canvas.Font.Name := 'Arial'; // имя шрифта
Canvas.TextOut(250, 10, 'Графика в Delphi'); // вывод текста на канву
end;
end.
Пример 2 Компьютерный бред.
unit Unit13;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm13 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form13: TForm13;
i: Integer;
implementation
{$R *.dfm}
procedure TForm13.Button1Click(Sender: TObject);
begin
Canvas.Brush.Color := clWhite; // цвет кисти
Canvas.FillRect(Canvas.ClipRect); // очистка канвы
Canvas.Pen.Color := RGB(255,200,150);
Canvas.Brush.Color := RGB(255,200,150);
for i := 0 to 100 do
begin
Canvas.Brush.Color := RGB(255,200,100);
// эллипс
Canvas.Ellipse(50 + 2*i, 50 - i, 300, 300);
end;
end;
end.
Пример 3 Построение графиков математических функций.
unit Unit13;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm13 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form13: TForm13;
X,Y: real; // координаты функции
PX,PY: Integer; // координаты пикселей
implementation
{$R *.dfm}
procedure TForm13.Button1Click(Sender: TObject);
begin
for PX := 0 to ClientWidth do
begin
X := PX * 4 * Pi/ClientWidth;
Y := 0.8 * sin(X);
// trunc возвращает целую часть результата вычислений
// вычисления переносят ось X вниз до
// половины экрана и переворачивают ось Y
PY := trunc(ClientHeight - (Y + 1) * ClientHeight/2);
Canvas.Pixels [PX, PY] := clRed;
end;
end;
procedure TForm13.Button2Click(Sender: TObject);
begin
for PX := 0 to ClientWidth do
begin
X := PX * 8 * Pi/ClientWidth;
Y := 0.4 * sin(X);
PY := trunc(ClientHeight - (Y + 1) * ClientHeight/2);
Canvas.Pixels [PX, PY] := clBlue;
end;
end;
procedure TForm13.Button3Click(Sender: TObject);
begin
for PX := 0 to ClientWidth do
begin
X := PX * 16 * Pi/ClientWidth;
Y := 0.2 * sin(X);
PY := trunc(ClientHeight - (Y + 1) * ClientHeight/2);
Canvas.Pixels [PX, PY] := clBlue;
end;
end;
procedure TForm13.Button4Click(Sender: TObject);
begin
Canvas.Brush.Color := clWhite; // цвет кисти
Canvas.FillRect(Canvas.ClipRect); // очистка канвы
Canvas.Pen.Color := clMenu;
Canvas.MoveTo(0, 194);
Canvas.LineTo(1100, 194);
end;
end.
Пример 4 На скриншоте к предыдущему приложению заметно что линия графика прерывистая. Исправить этот недостаток можно если точки заменить на линии. Теперь можно смело раскрашивать замкнутые области, так как краска не будет разливаться.
unit Unit13;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm13 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form13: TForm13;
X,Y: real; // координаты функции
PX,PY: Integer; // координаты пикселей
implementation
{$R *.dfm}
procedure TForm13.Button1Click(Sender: TObject);
begin
for PX := 0 to ClientWidth do
begin
X := PX * 4 * Pi/ClientWidth;
Y := 0.8 * sin(X);
PY := trunc(ClientHeight - (Y + 1) * ClientHeight/2);
Canvas.Pen.Color := clRed;
Canvas.LineTo (PX, PY);
end;
end;
procedure TForm13.Button2Click(Sender: TObject);
begin
for PX := 0 to ClientWidth do
begin
X := PX * 8 * Pi/ClientWidth;
Y := 0.4 * sin(X);
PY := trunc(ClientHeight - (Y + 1) * ClientHeight/2);
Canvas.Pen.Color := clBlue;
Canvas.LineTo (PX, PY);
end;
end;
procedure TForm13.Button3Click(Sender: TObject);
begin
for PX := 0 to ClientWidth do
begin
X := PX * 16 * Pi/ClientWidth;
Y := 0.2 * sin(X);
PY := trunc(ClientHeight - (Y + 1) * ClientHeight/2);
Canvas.Pen.Color := clGreen;
Canvas.LineTo (PX, PY);
end;
end;
procedure TForm13.Button4Click(Sender: TObject);
begin
Canvas.Brush.Color := clWhite; // цвет кисти
Canvas.FillRect(Canvas.ClipRect); // очистка канвы
Canvas.Pen.Color := clMenu;
Canvas.MoveTo(0, 194);
Canvas.LineTo(1100, 194);
end;
end.
Пример 5 Построение параболы и гиперболы.
procedure TForm13.Button5Click(Sender: TObject);
begin
for PX := 1 to ClientWidth do
begin
X := PX * 4 * Pi/ClientWidth;
Y := 1 / X * 2; // гипербола
PY := trunc(ClientHeight - (Y + 1) * ClientHeight/8);
Canvas.Pen.Color := clBlue;
Canvas.LineTo (PX, PY);
end;
end;
Выбери лучшее! allbest |