Bewegungen zwischenspeichern
Nach oben zu Verbesserte Liniendarstellung
Das Problem bei der jetzigen Version der Behandlungsroutine für das Ereignis OnMouseMove ist, dass sie die Linie zur aktuellen Mausposition ausgehend von der letzten Mausposition zeichnet, nicht ausgehend von der Anfangsposition. Dieser Fehler lässt sich aber einfach beseitigen, indem die Zeichenposition auf den Ausgangspunkt gesetzt und anschließend eine Linie zur aktuellen Mausposition gezeichnet wird:
procedure TForm1.FormMouseMove(Sender: TObject;Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Drawing then begin Canvas.MoveTo(Origin.X, Origin.Y); { Stiftposition auf Ausgangspunkt setzen } Canvas.LineTo(X, Y); end; end;
void __fastcall TForm1::FormMouseMove(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if (Drawing) { Canvas->MoveTo(Origin.x, Origin.y); // Stiftposition auf Ausgangspunkt setzen Canvas->LineTo(X, Y); } }
Auf diese Weise erhalten Sie Hilfslinien zur aktuellen Mausposition, die allerdings nicht mehr verschwinden und sich gegenseitig überdecken. Deshalb muss jede Linie gelöscht werden, bevor die nächste gezeichnet wird. Zu diesem Zweck ist es erforderlich, die Position der vorherigen Linien zwischenzuspeichern. Dazu dient das Feld MovePt.
MovePt muss auf den Endpunkt jeder Hilfslinie gesetzt werden, so dass Sie MovePt und Origin verwenden können, um diese Linie zu löschen, bevor die nächste gezeichnet wird:
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Drawing := True; Canvas.MoveTo(X, Y); Origin := Point(X, Y); MovePt := Point(X, Y); { Ausgangspunkt der Bewegung speichern } end; procedure TForm1.FormMouseMove(Sender: TObject;Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Drawing then begin Canvas.Pen.Mode := pmNotXor; { XOR-Modus zum Zeichnen/Löschen verwenden } Canvas.MoveTo(Origin.X, Origin.Y); { Stift auf Ausgangspunkt zurücksetzen } Canvas.LineTo(MovePt.X, MovePt.Y); { Alte Linie löschen } Canvas.MoveTo(Origin.X, Origin.Y); { Stift wieder auf Ausgangspunkt setzen } Canvas.LineTo(X, Y); { Neue Linie zeichnen } end; MovePt := Point(X, Y); { Punkt für nächste Bewegung speichern } Canvas.Pen.Mode := pmCopy; end;
void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { Drawing = true; // Das Zeichnen-Flag setzen Canvas->MoveTo(X, Y); // Stiftposition festlegen Origin = Point(X, Y); // Ausgangspunkt der Linie speichern MovePt = Point(X, Y); // Letzte Endposition speichern } 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 Canvas->MoveTo(Origin.x, Origin.y); // Stiftposition auf Ausgangspunkt setzen Canvas->LineTo(MovePt.x, MovePt.y); // Alte Linie löschen Canvas->MoveTo(Origin.x, Origin.y); // Stiftposition wieder auf Ausgangspunkt setzen Canvas->LineTo(X, Y); // Neue Linie zeichnen } MovePt = Point(X, Y); // Neue Endposition speichern Canvas->Pen->Mode = pmCopy; }
Sobald Sie nun eine Linie zeichnen, wird der erwünschte "Gummiband-Effekt" sichtbar. Der Wechsel in den Stiftmodus pmNotXor kombiniert die Hilfslinie mit den Hintergrund-Pixeln. Wenn Sie die Linie löschen, werden die Pixel wieder in ihren ursprünglichen Zustand versetzt. Nach dem Zeichnen der Hilfslinie wechseln Sie zurück in den Stiftmodus pmCopy (den Standardwert), um sicherzustellen, dass der Stift die endgültige Linie zeichnen kann, sobald die Maustaste losgelassen wird.