Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte » 

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/)
-   -   WM_MOUSEMOVE in mehr als einem TControl verarbeiten. (https://www.delphipraxis.net/192888-wm_mousemove-mehr-als-einem-tcontrol-verarbeiten.html)

alleinherrscher 30. Mai 2017 16:45

WM_MOUSEMOVE in mehr als einem TControl verarbeiten.
 
Hi@all.

Habe vermutlich eine ziemlich einfache Frage, auf die ich aber keine schöne Lösung gefunden habe: Wie kann ich WM_MOUSEMOVE messages in mehr als einem TControl verarbeiten?

Hintergrund: Ich habe ein tImage, was bei einem OnMouseMove Event kleine Pfeile auf den dazugehörigen Linealen außerhalb des TImages bewegen soll. Das funktioniert auch. Jetzt habe ich zusätzlich ein eigenes TGraphicControl abgeleitet, mit welchem ich eine Art Selektierbox erstellen möchte, um bestimmte Bildbereiche auf dem TImage auszuwählen. Mein TGraphicControl ist somit ein Child des TImages. Sobald ich mit der Maus über das TGraphicControl fahre, werden die WM_MOUSEMOVE Messages natürlich von TImage zum TGraphicControl weitergeleitet. Damit bleiben die Pfeilchen an einen Linealen stehen, was ich aber nicht möchte.

Ich habe es schon mit WndProc(var Message: TMessage) versucht, um die WM_MOUSEMOVE messages wieder an das TImage zu leiten, aber das gibt natürlich eine Endlosschleife...

Beste Grüße und vielen Dank,
Michael

EWeiss 30. Mai 2017 17:05

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.
 
Subclass dein Control und gut ist ;)

Oder die WM_MOUSEMOVE Message vom TImage nicht behandeln. (bzw.. dein TGraphicControl wenn es die Messagen weiterleitet und du das nicht willst)

Delphi-Quellcode:
WM_MOUSEMOVE:
  begin
    Result := 1;
    Exit;
  end;
gruss

alleinherrscher 30. Mai 2017 17:29

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.
 
Hey EWeiss,

vielen Dank für die schnelle Hilfe! Auf die Gefahr hin, wie ein totaler Neuling zu wirken: Was meinst du mit "Subclass dein Control" - ist es das nicht schon, wenn ich eine Klasse von TGraphicControl ableite? Und wo genau müsste ich deinen Codeschnipsel unterbringen?

Besten Gruß,
Michael

EWeiss 30. Mai 2017 17:33

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.
 
Jedes Control hat doch seine eigene message quewe..

Du hattest doch schon den Anfang gemacht so wie ich gelesen habe.
Zitat:

Ich habe es schon mit WndProc(var msg: TMessage) versucht, um die WM_MOUSEMOVE messages wieder an das TImage zu leiten
genau so und dort.. ;)
Delphi-Quellcode:
if msg.Message = WM_MOUSEMOVE then
 bla.. bla..
Du musst nur dafür sorgen das die Message dann an das TImage nicht weitergeleitet wird.
Wenn ich dich richtig verstanden habe.

gruss

alleinherrscher 30. Mai 2017 17:44

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.
 
Also: Momentan habe ich es so:

Delphi-Quellcode:
procedure TSelection.WndProc(var Message: TMessage);
begin
  inherited;
  if (Parent <> nil) and (Parent.HandleAllocated) then
    if Message.Msg=WM_MOUSEMOVE then
       Message.Result:=1; //oder 0 oder LongInt(False), keine Änderung
end;
In TSelection (abgeleitet von TGraphicControl) funktioniert MouseMove -> :thumb: soll auch so sein
Im Parent funktioniert MouseMove nicht, wenn die Maus auf dem TSelection Control ist. -> schlecht! :cry:

//Edit: Ah, habe ich falschherum gedacht, und muss mich um WndProc des Parents kümmern?

EWeiss 30. Mai 2017 17:49

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.
 
Zitat:

Edit: Ah, habe ich falschherum gedacht, und muss mich um WndProc des Parents kümmern?
Versuchs einfach mal ist ja kein Aufwand ;)

Das weiterleiten der WM_MOUSEMOVE Message an das Parent Fenster mache ich auf diese weise.
Delphi-Quellcode:
    WM_MOUSEMOVE:
      SendMessageW(GetParent(WinHandle), WM_MOUSEMOVE, MakeLong(GetDlgCtrlID(WinHandle), 0), 0);
gruss

alleinherrscher 31. Mai 2017 10:43

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.
 
Wessen Handle wäre denn dann WinHandle?

EWeiss 31. Mai 2017 11:15

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.
 
Zitat:

Zitat von alleinherrscher (Beitrag 1373059)
Wessen Handle wäre denn dann WinHandle?

Das eigene bzw. das Window welches die Message versendet.
Zitat:

Mein TGraphicControl ist somit ein Child des TImages
Überlege gerade..

Eigentlich ist doch TImage 'STATIC' oder ? Wie kann dann TGraphicControl ein Child von TImage sein.
Ich glaube du behandelst das falsche Parent.
Verwende mal irgendein Spy Tool und prüfe welches Parent welches Control denn nun wirklich hat.

gruss

alleinherrscher 31. Mai 2017 11:42

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.
 
Moment ich glaube wir brauchen mal was mehr Code:

Delphi-Quellcode:
TSelection = class(TGraphicControl)
private
   //[...]
public
  constructor Create(AOwner: TComponent; X,Y:integer);
published
  property OnMouseMove;
protected
  procedure Paint; override;
  procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
  procedure WndProc(var Message: TMessage); override;
end;


Tf2DData = class(TForm)
 imgData: TImage;
 //[...]
 procedure imgDataMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
 private
    { Private-Deklarationen }
     //[...]
     procedure SelectionBoxTest;
 public
    { Public-Deklarationen }

end;

procedure Tf2DData.SelectionBoxTest;
var test:TSelection;
begin
  test:=TSelection.Create(self,100,100);
  test.Parent:=PanImage;
end;
So, imgDataMouseMove wird logischerweise nicht mehr aufgerufen, wenn der Mauscursor oberhalb von TSelection ist. Die obigen Codes können das bisher nicht verhindern und wenn ich an ImgData eine WM_MOUSEMOVE Nachricht schicke, bekomme ich einen STACK Overflow, vermutlich weil ImgData die Nachricht dann wieder an TSelection weiterschickt ...

//edit: ich sehe gerade, dass du Recht hast: Ich habe das Panel, auf welchem ImgData liegt, als Parent angegeben und nicht das Image ImgData selbst. Mein Fehler... sorry!! Aber wie löse ich das generelle Problem? Eine Nachricht direkt an ImgData? Aber wie finde ich allgemein heraus, welches Objekt unterhalb meiner TSelectionBox liegt, an die ich die Nachricht schicken muss?

EWeiss 31. Mai 2017 11:47

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.
 
Lade mal die Exe hoch wenn es geht muss die mal analysieren.
So bringt mir das nichts.

Zitat:

Aber wie finde ich allgemein heraus, welches Objekt unterhalb meiner TSelectionBox liegt, an die ich die Nachricht schicken muss?
Ein Spy Tool?

Zitat:

als Parent angegeben und nicht das Image ImgData selbst
TImage kann kein Parent sein. Es ist "STATIC"
Parent ist das Window auf dem das TImage als Child abgelegt wurde.

Versuche doch mal folgendes.
Erstelle eine Simple Form pack ein Image drauf und versuche dann einen Button in das Image zu setzen.

gruss


Alle Zeitangaben in WEZ +2. Es ist jetzt 17:45 Uhr.
Seite 1 von 4  1 23     Letzte » 

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf