![]() |
Mousetracking oder woher zweite Ebene nehmen?
Hallo
ich habe gerade eine kleine Denkpause und komme einfach nicht darauf wie man ein Auswahlrechteck, ähnlich wie im Windowsexplorer programmiert. Es liegt nicht daran zuerkennen ob die linke Maustaste gedrückt ist wenn die Maus bewegt wird, ich komme nicht darauf mit welcher Technik das Rechteck entsprechend gezeichnet werden kann. Hat jemand eine Idee/Tipp oder ein Beispiel? So geht es jedenfalls nicht:
Delphi-Quellcode:
Legt man beispielhaft auf dem Formular einige Bilder ab und ruft PaintRectangle erst im FormMouseUp auf
...
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private { Private-Deklarationen } MR : TRect; MS : Boolean; procedure PaintRectangle(aRect : TRect); public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin MS := Button = mbLeft; MR.Left := X; MR.Top := Y; end; procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if MS then begin MR.Right := X; MR.Bottom:= Y; PaintRectangle(MR); end; end; procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if MS then MS := false; end; procedure TForm1.PaintRectangle(aRect : TRect); begin with Canvas do begin Pen.Color := clBlue; Brush.Style := bsDiagCross; Rectangle(aRect); end; end; ... kommt es dem schon Nahe wie es aussehen könnte. Jedoch soll die Größenänderungen des Rechtecks auch gezeigt werden und dafür ist dieses Verfahren untauglich. Da die ganze Geschichte in einer Scrollbox laufen soll, bräuchte ich so etwas wie eine weitere transparente Ebene, die nur das aktuelle Rechteck zeichnet und alle bisher gezeichneten vergisst. Viele Grüße |
Re: Mousetracking oder woher zweite Ebene nehmen?
Ich verstehe leider nicht auf was Du zeichnen willst.
Aber falls es ein Bild oder sowas ist: Den Hintergrund in einem Bitmap speichern. Dieses dann auf ein Weiteres kopieren und dort den Rahmen aufmalen und dieses Bitmap dann anzeigen. Bei großen Bildern kann das aber ein wenig zu lange brauchen, da sollte das wohl etwas überarbeitet werden. Hoffentlich hab ich das richtig verstanden... Edit: Du kannst aber auch den Rahmen mit Canvas.Pen.Mode := pmNotXor zeichnen. Dann musst Du nur noch den alten Rahmen noch einmal zeichnen und er verschwindet wieder. |
Re: Mousetracking oder woher zweite Ebene nehmen?
|
Re: Mousetracking oder woher zweite Ebene nehmen?
Hi,
danke für die Antworten. @turboPASCAL: Komme mit dem Tipp nicht ganz Klar. @dmdjt: In einer ScrollBox könnten auch mehrere Objekte abgelegt werden, sagen wir mal 150 Bilder im Format 128 x 128. Der Benutzer soll nun die Möglichkeit haben mit der Maus alle die Bilder auszuwählen die er 'löschen', 'kopieren' usw. möchte. Und zwar nur durch gedrückt halten der linken Maustaste und 'aufziehen' eines zum Teil transparenten Auswahlrechteckes. Da die Bilder durch eigene Objekte dargestelt werden, such ich so etwas wie ein 'Milchglasscheibe' die über alles liegt und auf der ich das Auswahlrechteck zeichnen kann. Optimal wäre eine Kopie des Canvas der ScrollBox. Zur besseren Veranschaulichung öffne den Windows-Explorer in der Detailansicht, wähle ein Verzeichnis aus das mehrere Unterverzeichnise beinhaltet und markiere diese in genanter Arbeitsweise und du wirst sehen was ich meine. Viele Grüße |
Re: Mousetracking oder woher zweite Ebene nehmen?
Ui, das is wirklich was ganz anderes! Danke für die extra Erklärung.
Vielleicht nicht schön: Ich könnte mir vorstellen, dass das mit einer eigenen Komponente funktionieren könnte, ähnlich einer TShape. Die stellt dann den Markierungsrahmen dar. Da das immer die neueste Komponente wäre, wäre sie ja immer im Vordergrund. Damit ließe sich auch dieser Transparenzeffekt erzeugen und das ganze würde für alle beliebigen Objekte verwenden. |
Re: Mousetracking oder woher zweite Ebene nehmen?
Hi,
TShape sieht schon mal ganz gut aus. Werde noch ein paar Experimente machen :wink: Danke Alter Mann |
Re: Mousetracking oder woher zweite Ebene nehmen?
Notfalls könnte man auch ein transparentes TImage über alles legen und darin den Rahmen zeichnen, aber TShape sollte Resourcenschonender sein.
PS: Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz