Другие языки программирования и технологии

Помогите с графическими примитивами в дельфи.

Создать программу рисования в форме графического примитива с заливкой. Примитив рисуется при нажатии кнопки
мыши (событие onDown) на форме. Цвет линий, стиль и цвет заливки зависит от того, какая кнопка мыши нажимается
(левая или правая). Проект – приложение.
Вариант задания:
Примитив Цвет линий Заливка
Левая кнопка Правая кнопка Стиль Цвет
Polygon (3) clBlue clGreen bsBDiagonal clRed

Часть-листинга:
{Процедура рисования полигона}
// нажатие кнопки мыши
procedure TForm1.FormMouseDown(Sender: TObject; Button:TMouseButton; Shift:
TShiftState; x,y:integer);
begin
with Form1 do
begin
if Button = mbLeft // нажата левая кнопка?
then
begin
Canvas.Pen.Color := clBlack;
{Процедура рисования полигона}
Canvas.Brush.Style:=bsDiagCross;
Canvas.Brush.Color:=clRed;
Canvas.FloodFill(x,y,Canvas.Pen.Color,fsBorder);
end
else
begin
Canvas.Pen.Color := clRed;
{Процедура рисования полигона}
Canvas.Brush.Style:=bsCross;
Canvas.Brush.Color:=clBlue;
Canvas.FloodFill(x,y,Canvas.Pen.Color,fsBorder);
end;
end;
end;
end.
Вот код проекта в целом. кликалка грызуна - авторская.

unit poligon;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
procedure FormMouseDown(Sender: TObject; Button:TMouseButton;
Shift: TShiftState; x,y:integer);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
pol: array[1..3] of TPoint;
implementation
{$R *.dfm}
procedure poligon(x0,y0: integer; Canvas: TCanvas);
var

pol: array[1..3] of TPoint; // координаты точек треугольника
x,y:integer;
begin

pol[1].x:= x+0;
pol[1].y:= y+0;
pol[2].x:= x-40;
pol[2].y:= y+50;
pol[3].x:= x+40;
pol[3].y:= y+50;

Form1.Canvas.Polygon(pol);

end;
// нажатие кнопки мыши
procedure TForm1.FormMouseDown(Sender: TObject; Button:TMouseButton; Shift:
TShiftState; x,y:integer);
begin
with Form1 do
begin
if Button = mbLeft // нажата левая кнопка?
then
begin
Canvas.Pen.Color := clBlue;
poligon(x,y,Canvas);
Canvas.Brush.Style:=bsBDiagonal;
Canvas.Brush.Color:=clRed;
Canvas.FloodFill(x,y+1,Canvas.Pen.Color,fsBorder);
end
else
begin
Canvas.Pen.Color := clGreen;
poligon(x,y,Canvas);
Canvas.Brush.Style:=bsBDiagonal;
Canvas.Brush.Color:=clRed;
Canvas.FloodFill(x,y+1,Canvas.Pen.Color,fsBorder);
end;
end;
end;
end.
Геннадий Ворнаков
Геннадий Ворнаков
116
Лучший ответ
и в чом беда?
Мамед Никизад
Мамед Никизад
6 305
Мне не нравится сама идея рисования полигона на OnMouseDown - ведь еще не определена область, которую полигон будет занимать. Логичнее предположить, что рисование должно быть по "отжатию" кнопки - на событие OnMouseUp.
Вот код с некоторыми комментариями (несколько модифицированный код, данный автором вопроса) :
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
procedure Polygon6; // процедура рисования полигона (шестиугольник)
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

var
X1, Y1, X2, Y2: integer; // глобальные переменные-координаты
state: TMouseButton; // состояние кнопки в момент нажатия

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
X1 := X; // запоминаем начальную координату x
Y1 := Y; // запоминаем начальную координату y
state := Button; // и кнопку, которую нажали
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
X2 := X; // запомнили конечную координату x
Y2 := Y; // и y
if (state = mbLeft) then // вспоминаем, что нажали
begin
Canvas.Pen.Color := clBlack; // настраиваем цвет границы полигона
Polygon6(); // рисуем полигон
Canvas.Brush.Style := bsDiagCross; // настраиваем параметры заливки полигона
Canvas.Brush.Color := clRed;
Canvas.FloodFill(X1 + (X2 - X1) div 2, Y1 + (Y2 - Y1) div 2, Canvas.Pen.Color, fsBorder); // заливаем полигон от центра занимаемой им области
end
else begin
Canvas.Pen.Color := clRed;
Polygon6();
Canvas.Brush.Style := bsCross;
Canvas.Brush.Color := clBlue;
Canvas.FloodFill(X1 + (X2 - X1) div 2, Y1 + (Y2 - Y1) div 2, Canvas.Pen.Color, fsBorder);
end;
end;

procedure TForm1.Polygon6;
begin
Canvas.Polyline([ // рисуем шестиугольник незамкнутой линией, поэтому 7 точек (начальная = конечная)
Point(X1, Y1 + (Y2 - Y1) div 2),
Point(X1 + (X2 - X1) div 3, Y2),
Point(X1 + 2*((X2 - X1) div 3), Y2),
Point(X2, Y1 + (Y2 - Y1) div 2),
Point(X1 + 2*((X2 - X1) div 3), Y1),
Point(X1 + (X2 - X1) div 3, Y1),
Point(X1, Y1 + (Y2 - Y1) div 2)
]);
end;

end.