OnMouseMove benötigt
-
Hilfe!
zu viele FAQ Einträge zu dem Thema.
ich hab eine Komponente die ich von TTrackBar abgeleitet habe und möchte nun OnMouseMove für diese Komponente nutzen. Wie komm ich an so ein Ereignis ran?
Vielleicht ist das Thema ja schon in der Hilfe, ich schau dort auch noch mal nach. Allerdings hätt ich das ganze am liebsten vorgestern fertigdaher danke für jede Hilfe
Gruß Sprotti
-
In der FAQ gibt's ein Beispiel für das Implementieren eines OnScroll-Events im StringGrid, das sollte dir eigentlich weiterhelfen. Du muss halt WM_MOUSEMOVE abfangeb.
-
hallo,
hab aus dem StringGrid ScrollBox Beispiel die von AndreasW angegebene Variante genutzt und folgendermassen umgesetzt.typedef void __fastcall (__closure *TMyOnMouseMoveEvent)(System::TObject* Sender,Classes::TShiftState Shift, int X, int Y); class PACKAGE TTrackBarTest : public TTrackBar { private: TMyOnMouseMoveEvent IVOnMouseMove; protected: void __fastcall DoMouseMove(TShiftState Shift,int X, int Y){if(IVOnMouseMove) IVOnMouseMove(this,Shift,X,Y);} public: void __fastcall WndProc(TMessage &Message) { Dispatch(&Message); if(Message.Msg==WM_MOUSEMOVE)DoMouseMove(Message /*PROBLEM*/ /*HWND)Message.LParam,HIWORD(Message.WParam),LOWORD (Message.WParam<-- ursprüngliche Werte */) ); __published: __property TMyOnMouseMoveEvent OnMouseMove={read=IVOnMouseMove,write=IVOnMouseMove}; };
Jetzt siehts mit meinem wissen um die message Eigenschaften ganz mies aus. welche Parameter muss ich jetzt an die DoMouseMove methode übergeben?
-
habe jetzt die Belegung
LParam bringt die Position (X mit HIWORD, Y mit LOWORD)
WParam bringt zu verschiedenen Shiftstates Tastenbelegungen die man abfragen kann und mit switch auswerten.
hab durch probieren herausgefunden
ssCtrl = 8
ssShift = 4
ssLeft = 1
ssRight = 2
ssMiddle = 16wenn es eine bessere Methode gibt die ShiftStates zu übergeben ...
-
hier nochmal die entsprechende WndProc
void __fastcall WndProc(TMessage &Message) { Dispatch(&Message); TShiftState Shift; switch (Message.WParam) { case 1: if(Message.Msg == WM_MOUSEMOVE) { Shift << ssLeft; DoMouseMove(Shift,HIWORD(Message.LParam),LOWORD(Message.LParam)); } break; case 2: if(Message.Msg == WM_MOUSEMOVE) { Shift << ssRight; DoMouseMove(Shift,HIWORD(Message.LParam),LOWORD(Message.LParam)); } break; } }
-
War das jetzt rein informativ gedacht oder verbirgt sich dahinter noch eine Frage?
Das switch/case-Konstrukt könnte man jedenfalls formal noch etwas optimieren.
if(Message.Msg == WM_MOUSEMOVE) { TShiftState Shift; switch (Message.WParam) { case 1: Shift << ssLeft; break; case 2: Shift << ssRight; break; ... } DoMouseMove(Shift,HIWORD(Message.LParam),LOWORD(Message.LParam)); }
-
war eigentlich rein informativ. recht haste mit der optimierung
, danke für den hinweis