2010-11-13 4 views
4

j'ai écrit le code suivant: procedure MouseWheel(var Msg:TWMMouseWheel);message WM_MOUSEHWHEEL; Je l'ai utilisé pour un composant à base de TPanel (TMyP = class (TPanel)) (Notez que je ne veux pas utiliser TCustomPanel en raison de mon propre raisons)WMMouseWheel ne fonctionne pas dans Delphi

Mais de toute façon l'événement n'est pas appelé lorsque j'utilise la molette de la souris sur le panneau. S'il vous plaît Aidez-moi!

+0

http://stackoverflow.com/questions/5297234/tlistview-and-mouse-wheel-scrolling – Shannon

+0

Voir [Comment ajouter le support de la molette de la souris à un composant issu de TGraphicControl?] (Http://stackoverflow.com/ a/34463279/757830), et [Comment diriger l'entrée de la molette de la souris pour contrôler sous le curseur au lieu d'être focalisé?] (http://stackoverflow.com/a/34386680/757830) – NGLN

Répondre

12

Les messages de la roulette de la souris sont envoyés au contrôle avec le focus. Et les panneaux ne sont généralement pas focalisables.

J'utilise ce gestionnaire TApplicationEvents.OnMessage dans mes applications pour envoyer le message de la molette de la souris à la fenêtre sous le curseur de la souris au lieu du contrôle ciblé.

procedure TMainDataModule.ApplicationEventsMessage(var Msg: tagMSG; var Handled: Boolean); 
var 
    Wnd: HWND; 
begin 
    if Msg.message = WM_MOUSEWHEEL then 
    begin 
    Wnd := WindowFromPoint(Msg.pt); 
    // It must be a VCL control otherwise we could get access violations 
    if IsVCLControl(Wnd) then 
     Msg.hwnd := Wnd; // change the message receiver to the control under the cursor 
    end; 
end; 
+0

Je me demande si cela n'est pas cohérent expérience utilisateur, où l'utilisateur est habitué à faire passer les messages de la molette de la souris au contrôle ciblé et apparemment dans votre application, ils vont ailleurs. –

+0

En fait, c'était une demande d'utilisateur qui m'a été présentée par notre gestion de produit. –

+0

J'ai essayé ceci dans C++ Builder mais cela ne fonctionne pas. J'ai aussi essayé quelques variantes similaires mais aucune n'a fonctionné. Je suppose que cela fonctionne dans Delphi mais pas dans C++ Builder. J'ai également vérifié pour WM_VSCROLL et WM_HSCROLL mais aucun effet. Des idées pourquoi? – Coder12345

4

En plus de la réponse de Andreas Hausladen vous devez savoir, que certains pilotes de souris ne pas envoyer WM_MOUSEWHEEL et envoyer plusieurs messages au lieu de WM_VSCROLL. Vous devez également vérifier cela.

Mise à jour: Notez qu'il existe également des messages WM_HSCROLL qui peuvent également être envoyés par certaines souris qui ont deux roues ou une roue inclinable. C'est pourquoi j'ai initialement écrit WM_SCROLL.

+0

Thnx pour la réponse mais je ne peux pas trouver WM_SCROLL – Javid

+1

C'est en fait WM_VSCROLL (défilement vertical). –