Formen zeichnen (Quelltext)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Zeichenwerkzeuge verwenden

Das Zeichnen von Formen ist genauso einfach wie das Zeichnen von Linien. Für jede Form genügt eine einzige Anweisung. Es werden nur die Koordinaten benötigt.

Der folgende Quelltext ist eine neue Fassung der Ereignisbehandlungsroutine für OnMouseUp, die Formen für alle vier Zeichenwerkzeuge zeichnet:



 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;
 }



Nun muss noch die Behandlungsroutine für das Ereignis OnMouseMove zum Zeichnen von Formen aktualisiert werden:



 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;



 void __fastcall TForm1::FormMouseMove(TObject *Sender, TMouseButton Button,
   TShiftState Shift, int X, int Y)
 {
   if (Drawing)
   {
     Canvas->Pen->Mode = pmNotXor;        // XOR-Modus zum Zeichnen/Löschen verwenden
     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;
 }



Normalerweise würden alle sich wiederholenden Teile dieses Quelltextes in einer separaten Routine abgelegt. Im nächsten Thema wird der Quelltext für das Zeichnen von Formen in einer einzelnen Routine zusammengefasst, auf die alle Behandlungsroutinen für Mausereignisse zugreifen können.

Siehe auch