AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Mousetracking oder woher zweite Ebene nehmen?

Ein Thema von Alter Mann · begonnen am 28. Dez 2009 · letzter Beitrag vom 30. Dez 2009
Antwort Antwort
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
934 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Mousetracking oder woher zweite Ebene nehmen?

  Alt 28. Dez 2009, 13:37
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
  Mit Zitat antworten Zitat
dmdjt

Registriert seit: 18. Jul 2009
37 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: Mousetracking oder woher zweite Ebene nehmen?

  Alt 28. Dez 2009, 13:50
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.
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#3

Re: Mousetracking oder woher zweite Ebene nehmen?

  Alt 28. Dez 2009, 14:00
Ein Tipp:
http://www.delphipraxis.net/internal...=388468#388468

mal ansehen.
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
934 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

Re: Mousetracking oder woher zweite Ebene nehmen?

  Alt 29. Dez 2009, 15:51
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
  Mit Zitat antworten Zitat
dmdjt

Registriert seit: 18. Jul 2009
37 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: Mousetracking oder woher zweite Ebene nehmen?

  Alt 29. Dez 2009, 22:04
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.
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
934 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

Re: Mousetracking oder woher zweite Ebene nehmen?

  Alt 30. Dez 2009, 08:39
Hi,

TShape sieht schon mal ganz gut aus. Werde noch ein paar Experimente machen

Danke

Alter Mann
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.153 Beiträge
 
Delphi 12 Athens
 
#7

Re: Mousetracking oder woher zweite Ebene nehmen?

  Alt 30. Dez 2009, 08:45
Notfalls könnte man auch ein transparentes TImage über alles legen und darin den Rahmen zeichnen, aber TShape sollte Resourcenschonender sein.

PS:
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz