![]() |
AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.
Zitat:
Versprechen kann ich aber nichts ;) gruss |
AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.
Delphi-Quellcode:
hat weder ein eigenes Handle, noch ein eigenes Canvas und verwendet stattdessen die entsprechenden Resourcen des Parent Controls.
TImage
Entweder nimmst du eine
Delphi-Quellcode:
und zeichnest komplett alles darauf, oder du leitest weiterhin von
TPaintBox
Delphi-Quellcode:
ab und zeichnest zusätzlich manuell den Inhalt, der vorher vom Image dargestellt wurde.
TGraphicControl
|
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 |
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:
Somit hättest Du hier ein Formular-Hook. Eventuelle OnMouseMove auf Controls bleiben bestehen und funktionieren weiter.
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; |
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 |
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. |
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. |
AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.
Zitat:
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:
Wenn es nicht benutzt oder verwendet wird kann ich auch nichts machen.
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; oops.. sehe gerade war doch schon raus aus dem Thread. Zitat:
Siehe ![]() gruss |
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) |
AW: WM_MOUSEMOVE in mehr als einem TControl verarbeiten.
Zitat:
Delphi-Quellcode:
eine
TImage
Delphi-Quellcode:
Eigenschaft. Diese ist allerdings nicht wie bei
Canvas
Delphi-Quellcode:
an ein eigenständiges Handle gebunden, sondern intern lediglich eine
TWinControl
Delphi-Quellcode:
Instanz. Diese beinhaltet die Grafik, welche dann letztlich aber auf das Canvas vom Parent Control gezeichnet wird.
TBitmap
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:33 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-2025 by Thomas Breitkreuz