Rahmen in TImage
-
Hallo zusammen,
ich möchte in einem TImage einen Auswahlrahmen zeichnen. Dazu merke ich mir bei MouseDown die Koordinaten und zeichne bei MouseMove ein FrameRect, falls die linke Taste noch gedrückt ist. Meine Frage ist nun, ob es eine Möglichkeit gibt, den alten Rahmen wieder zu löschen, wenn die Mouse bewegt wird, da sich sonst durch die Bewegung eine weißes Rechteck ergibt. Ich möchte also das alte Rechteck löschen, wenn ein neues gezeichnet wird. Im "Hintergrund" des Image befindet sich ein mit LoadFromFile geladenes Bitmap.
Gruss Lodo2609
-
Dafür gibt es die Canvas-Methode DrawFocusRect (diese arbeitet intern mit einer XOR-Verknüpfung, so daß bei 2 maligem Aufruf wieder das Original dargestellt wird).
-
so richtig funktioniert das nicht mit DrawFocusRect. Hier mal mein Code
void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { RectofInterest.x = X; RectofInterest.y = Y; } //--------------------------------------------------------------------------- void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { if (Shift.Contains(ssLeft)) { TRect Rect; Rect.Left = RectofInterest.x; Rect.Top = RectofInterest.y; Rect.Right = X; Rect.Bottom = Y; Image1->Canvas->DrawFocusRect(Rect); //Image1->Repaint(); //Image1->Canvas->FrameRect(Rect); } }Wenn ich das Auswahlfenster größer mache(die Mouse bewege), bleibt immer noch ein Teil des alten Rechteck zu sehen. Was mache ich falsch?
Gruss Lodo2609
-
Du mußt vor dem Neu-Zeichen nochmal DrawFocusRect für das alte Rechteck aufrufen (d.h. dieses mußt du speichern).
if (Shift.Contains(ssLeft)) { Image1->Canvas->DrawFocusRect(RectofInterest); // alte löschen RectOfInterest.Right = X; RectOfInterest.Bottom = Y; Image1->Canvas->DrawFocusRect(RectOfInterest); // neu zeichnen }Evtl. mußt du noch eine Abfrage einfügen, falls es noch kein RectOfInterest gibt.