Bewegungen zwischenspeichern

Aus RAD Studio
Wechseln zu: Navigation, Suche

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.

Siehe auch