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.