AGB  ·  Datenschutz  ·  Impressum  







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

WM_MOUSEMOVE in mehr als einem TControl verarbeiten.

Ein Thema von alleinherrscher · begonnen am 30. Mai 2017 · letzter Beitrag vom 2. Jun 2017
Antwort Antwort
Seite 3 von 4     123 4      
EWeiss
(Gast)

n/a Beiträge
 
#21

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.

  Alt 31. Mai 2017, 15:47
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
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#22

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.

  Alt 31. Mai 2017, 15:56
TImage hat weder ein eigenes Handle, noch ein eigenes Canvas und verwendet stattdessen die entsprechenden Resourcen des Parent Controls.

Entweder nimmst du eine TPaintBox und zeichnest komplett alles darauf, oder du leitest weiterhin von TGraphicControl ab und zeichnest zusätzlich manuell den Inhalt, der vorher vom Image dargestellt wurde.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#23

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.

  Alt 31. Mai 2017, 18:59
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

Geändert von EWeiss (31. Mai 2017 um 22:29 Uhr)
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
970 Beiträge
 
Delphi 6 Professional
 
#24

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.

  Alt 31. Mai 2017, 19:35
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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#25

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.

  Alt 31. Mai 2017, 19:46
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

Geändert von EWeiss (31. Mai 2017 um 19:50 Uhr)
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#26

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.

  Alt 1. Jun 2017, 08:17
@Zacherl

Öhm....da sagt die Doku von Emba aber was anderes. Lt. derer hat TImage einen Canvas auf das es zeichnet.
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#27

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.

  Alt 1. Jun 2017, 08:28
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.
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#28

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.

  Alt 1. Jun 2017, 11:15
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 ?
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

Geändert von EWeiss (11. Jul 2019 um 16:47 Uhr)
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#29

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.

  Alt 1. Jun 2017, 12:42
@EWeiss

Doch, die Basisklasse TGraphiControl hat bereits die eigenschaft Parent (sogar TControl). So stehts zumindest in der Doku. (siehe Anhang)
Miniaturansicht angehängter Grafiken
docu.jpg  
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#30

AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.

  Alt 1. Jun 2017, 13:54
Öhm....da sagt die Doku von Emba aber was anderes. Lt. derer hat TImage einen Canvas auf das es zeichnet.
Klar, hat das TImage eine Canvas Eigenschaft. Diese ist allerdings nicht wie bei TWinControl an ein eigenständiges Handle gebunden, sondern intern lediglich eine TBitmap Instanz. Diese beinhaltet die Grafik, welche dann letztlich aber auf das Canvas vom Parent Control gezeichnet wird.

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
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


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 05:42 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