Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Mousetracking oder woher zweite Ebene nehmen? (https://www.delphipraxis.net/145280-mousetracking-oder-woher-zweite-ebene-nehmen.html)

Alter Mann 28. Dez 2009 14:37


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:
...
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;
...
Legt man beispielhaft auf dem Formular einige Bilder ab und ruft PaintRectangle erst im FormMouseUp auf
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

dmdjt 28. Dez 2009 14:50

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.

turboPASCAL 28. Dez 2009 15:00

Re: Mousetracking oder woher zweite Ebene nehmen?
 
Ein Tipp:
http://www.delphipraxis.net/internal...=388468#388468

mal ansehen. ;)

Alter Mann 29. Dez 2009 16:51

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

dmdjt 29. Dez 2009 23:04

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.

Alter Mann 30. Dez 2009 09:39

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

himitsu 30. Dez 2009 09:45

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:

Zitat von dmdjt
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.

so machen es viele Programme ... z.B. Word, Excel, der Explorer (auch auf'm Desktop) usw.


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