Dessin de formes (Code)
Remonter à Utilisation des outils de dessin
Dessiner des formes est aussi simple que dessiner des lignes. Une seule instruction suffit. Vous n'avez besoin que des coordonnées.
Voici réécrit le gestionnaire de l'événement OnMouseUp qui dessine des formes pour les quatre outils :
procedure TForm1.FormMouseUp(Sender: TObject; Button TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
case DrawingTool of
dtLine:
begin
Canvas.MoveTo(Origin.X, Origin.Y);
Canvas.LineTo(X, Y)
end;
dtRectangle:
Canvas.Rectangle(Origin.X, Origin.Y, X, Y);
dtEllipse:
Canvas.Ellipse(Origin.X, Origin.Y, X, Y);
dtRoundRect:
Canvas.RoundRect(Origin.X, Origin.Y, X, Y, (Origin.X - X) div 2,
(Origin.Y - Y) div 2);
end;
Drawing := False;
end;
void __fastcall TForm1::FormMouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y) {
switch (DrawingTool) {
case dtLine:
Canvas->MoveTo(Origin.x, Origin.y);
Canvas->LineTo(X, Y);
break;
case dtRectangle:
Canvas->Rectangle(Origin.x, Origin.y, X, Y);
break;
case dtEllipse:
Canvas->Ellipse(Origin.x, Origin.y, X, Y);
break;
case dtRoundRect:
Canvas->Rectangle(Origin.x, Origin.y, X, Y, (Origin.x - X) / 2,
(Origin.y - Y) / 2);
break;
}
Drawing = false;
}
Il est également nécessaire de modifier le gestionnaire de OnMouseMove pour dessiner des formes :
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
if Drawing then
begin
Canvas.Pen.Mode := pmNotXor;
case DrawingTool of
dtLine:
begin
Canvas.MoveTo(Origin.X, Origin.Y);
Canvas.LineTo(MovePt.X, MovePt.Y);
Canvas.MoveTo(Origin.X, Origin.Y);
Canvas.LineTo(X, Y);
end;
dtRectangle:
begin
Canvas.Rectangle(Origin.X, Origin.Y, MovePt.X, MovePt.Y);
Canvas.Rectangle(Origin.X, Origin.Y, X, Y);
end;
dtEllipse:
begin
Canvas.Ellipse(Origin.X, Origin.Y, X, Y);
Canvas.Ellipse(Origin.X, Origin.Y, X, Y);
end;
dtRoundRect:
begin
Canvas.RoundRect(Origin.X, Origin.Y, X, Y, (Origin.X - X) div 2,
(Origin.Y - Y) div 2);
Canvas.RoundRect(Origin.X, Origin.Y, X, Y, (Origin.X - X) div 2,
(Origin.Y - Y) div 2);
end;
end;
MovePt := Point(X, Y);
end;
Canvas.Pen.Mode := pmCopy;
end;
vvoid __fastcall TForm1::FormMouseMove(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y) {
if (Drawing) {
Canvas->Pen->Mode = pmNotXor; // use XOR mode to draw/erase
switch (DrawingTool) {
case dtLine:
Canvas->MoveTo(Origin.x, Origin.y);
Canvas->LineTo(MovePt.x, MovePt.y);
Canvas->MoveTo(Origin.x, Origin.y);
Canvas->LineTo(X, Y);
break;
case dtRectangle:
Canvas->Rectangle(Origin.x, Origin.y, MovePt.x, MovePt.y);
Canvas->Rectangle(Origin.x, Origin.y, X, Y);
break;
case dtEllipse:
Canvas->Ellipse(Origin.x, Origin.y, MovePt.x, MovePt.y);
Canvas->Ellipse(Origin.x, Origin.y, X, Y);
break;
case dtRoundRect:
Canvas->Rectangle(Origin.x, Origin.y, MovePt.x, MovePt.y,
(Origin.x - MovePt.x) / 2, (Origin.y - MovePt.y) / 2);
Canvas->Rectangle(Origin.x, Origin.y, X, Y, (Origin.x - X) / 2,
(Origin.y - Y) / 2);
break;
}
MovePt = Point(X, Y);
}
Canvas->Pen->Mode = pmCopy;
}
En principe, tout le code répétitif de l'exemple précédent devrait être dans une routine séparée. La rubrique suivante présente le code relatif au dessin des formes dans une seule routine pouvant être appelée par tous les gestionnaires d'événements de souris.