Delphi-PRAXiS
Seite 3 von 4     123 4   

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)

EWeiss 31. Mai 2017 15:47

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

Zitat von alleinherrscher (Beitrag 1373124)
Schade, aber wie teilt denn das Panel (oder die Form) dem Image mit, dass sich gerade die Maus darauf bewegt und kann man da nicht irgendwie eingreifen? Oder beim Bearbeiten des WM_MouseMove im TButton irgendwie zurückmelden, dass die Nachricht nicht verarbeitet worden ist, oder so? -> Message.Result... ?

//edit gut, dann werde ich wohl vermutlich auf die Variante umsteigen, alles in eine Paintbox bzw ein Image zu zeichnen... :-(

Ich versuche mal eine Alternative mit Subclassing eines STATIC Image Window.. was dann auch ein Handle hat.
Versprechen kann ich aber nichts ;)

gruss

Zacherl 31. Mai 2017 15:56

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.
 
Delphi-Quellcode:
TImage
hat weder ein eigenes Handle, noch ein eigenes Canvas und verwendet stattdessen die entsprechenden Resourcen des Parent Controls.

Entweder nimmst du eine
Delphi-Quellcode:
TPaintBox
und zeichnest komplett alles darauf, oder du leitest weiterhin von
Delphi-Quellcode:
TGraphicControl
ab und zeichnest zusätzlich manuell den Inhalt, der vorher vom Image dargestellt wurde.

EWeiss 31. Mai 2017 18:59

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.
 
Dein Testprojekt zurück das soll dir zeigen warum es mit einem normalen Image nicht funktioniert.
Scheint niemand zu brauchen, hab's gelöscht.
Du benötigst also eine Alternative ein Panel mit BorderStyle None wäre eine lösung das hat ein Handle..
Darauf kannst du genauso zeichnen wie auf einem Image.

gruss

HolgerX 31. Mai 2017 19:35

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

Es geht Dir, wenn ich es richtig verstanden habe, um ein formularweites MouseMove, egal über welchem Control sich dein Mousezeiger befindet, und ohne, dass Du das in jedem Control implementieren musst.

Also, da bietet sich (Quick and Dirty) folgendes an:

Delphi-Quellcode:
procedure TForm1.MyApplicationOnMessage(var Msg: tagMSG;
  var Handled: Boolean);
var
  P : TPoint;
  C : TControl;
begin
  if Msg.message = WM_MOUSEMOVE then begin

    P := ScreenToClient(Msg.pt);

    c := ControlAtPos(P,false,true);
    if Assigned(c) then Edit1.Text := c.Name else Edit1.Text := '';

    Label1.Caption := IntToStr( P.X);
    Label2.Caption := IntToStr( P.Y);
  end;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  Application.OnMessage := MyApplicationOnMessage;
end;
Somit hättest Du hier ein Formular-Hook. Eventuelle OnMouseMove auf Controls bleiben bestehen und funktionieren weiter.

EWeiss 31. Mai 2017 19:46

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.
 
TImage = TGraphicControl <> TControl ?
Auch wenn es eine Ableitung von TControl ist.

Das soll gehen ?
Dann kann man ja direkt ein Handle abgeleitet von TControl für das Image erstellen wenn das so einfach ist und gut ist.

Nun gut. (Ich bin jetzt raus ;) )

gruss

Ghostwalker 1. Jun 2017 08:17

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.
 
@Zacherl

Öhm....da sagt die Doku von Emba aber was anderes. Lt. derer hat TImage einen Canvas auf das es zeichnet.

Ghostwalker 1. Jun 2017 08:28

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.
 
Hmm...also wenn ich den code in Post #9 angugg, dann ist der Parent sowohl vom Image als auch vom Selection jeweils das PANEL.

Da würd ich WM_MOUSEMOVE im Panel abfangen, und dann sowohl ans Image schicken als auch ans Selection-Control, so das beide tun, was immer sie da machen sollen (SendMessage oder PostMessage).

Das sollte eigentlich funktionieren.

EWeiss 1. Jun 2017 11:15

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

Zitat von Ghostwalker (Beitrag 1373179)
Das sollte eigentlich funktionieren.

Nein funktioniert nicht..

Da beide Controls TImage und seine eigene Ableitung von TGraphicControl wie auch immer sie benannt wurden
über kein eigenes Fenster bzw.. Handle verfügen gibt es auch keine Parent für diese Controls.
Hier einfach das Panel als Parent zu definieren wäre also sinnlos denn beide Controls wissen doch gar nichts vom Panel.

Ohne das sie wissen was ihr Parent ist können sie auch nichts übergeben bzw. Messagen schicken.
Außerdem haben beide Controls KEIN Handle was willst du also vom Panel aus wohin schicken mit (SendMessage oder PostMessage)?

Wie soll das gehen ?
Delphi-Quellcode:
HandleZumSenden := GetParent(HabeKeinEigenesHandleUmDasParentAbzufragen);

Ich hatte ihm ein SubClassed Beispiel gepostet das nicht verwendet wurde basierend auf einem STATIC Window mit realen Handle.
Delphi-Quellcode:
    dwStyle := SS_BITMAP or SS_CENTERIMAGE or SS_NOTIFY or WS_CHILD or WS_VISIBLE;
    dwExStyle := WS_EX_STATICEDGE;
    Result := CreateWindowEx(dwExStyle, 'STATIC', '', dwStyle, 5 , 5, rc.Right - 10, rc.Bottom - 10,
      Panel1.Handle, 0, hInstance, nil);
Delphi-Quellcode:
procedure TMyButton.MouseMove(Shift: TShiftState; X, Y: Integer);
var
  p: TPoint;
begin

  self.Caption:='Button:' +inttostr(x)+','+inttostr(y);
  GetCursorPos(p);
  Windows.ScreenToClient(GetParent(Handle), p);
  // Dein vorheriges Image was kein Handle hat
  // ersetzt mit einem STATIC Window
  SendMessage(hImage, WM_MOUSEMOVE, 0, Makelong(p.x, p.y));
end;
Delphi-Quellcode:
    WM_MOUSEMOVE:
      begin
        DC := GetDC(WinHandle);
        txt := PWideChar('Image: '+inttostr(LoWord(lp))+','+inttostr(HiWord(lp)));
        SetTextColor(DC, RGB(255, 0, 0));
        TextOut(DC, 1,1,txt, Length(txt));
        ReleaseDC(WinHandle, DC);
      end;
Wenn es nicht benutzt oder verwendet wird kann ich auch nichts machen.
oops.. sehe gerade war doch schon raus aus dem Thread.

Zitat:

egal über welchem Control sich dein Mousezeiger befindet
@Holger Die Lösung ist nicht schlecht funktioniert aber nur wenn das Control unter dem Mauszeiger auch über ein Handle (eigenes Fenster)verfügt.
Siehe http://www.delphipraxis.net/attachme...iten-31.05.jpg

gruss

Ghostwalker 1. Jun 2017 12:42

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.
 
Liste der Anhänge anzeigen (Anzahl: 1)
@EWeiss

Doch, die Basisklasse TGraphiControl hat bereits die eigenschaft Parent (sogar TControl). So stehts zumindest in der Doku. :) (siehe Anhang)

Zacherl 1. Jun 2017 13:54

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

Zitat von Ghostwalker (Beitrag 1373178)
Öhm....da sagt die Doku von Emba aber was anderes. Lt. derer hat TImage einen Canvas auf das es zeichnet.

Klar, hat das
Delphi-Quellcode:
TImage
eine
Delphi-Quellcode:
Canvas
Eigenschaft. Diese ist allerdings nicht wie bei
Delphi-Quellcode:
TWinControl
an ein eigenständiges Handle gebunden, sondern intern lediglich eine
Delphi-Quellcode:
TBitmap
Instanz. Diese beinhaltet die Grafik, welche dann letztlich aber auf das Canvas vom Parent Control gezeichnet wird.

Zitat:

Zitat von Ghostwalker (Beitrag 1373179)
Da würd ich WM_MOUSEMOVE im Panel abfangen, und dann sowohl ans Image schicken als auch ans Selection-Control, so das beide tun, was immer sie da machen sollen (SendMessage oder PostMessage).

Dürfte schwierig werden eine Message an ein Control ohne WindowHandle zu schicken :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:40 Uhr.
Seite 3 von 4     123 4   

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