2008-12-18 6 views
0

J'ai un contrôle composite avec une déclaration comme celle-ci:Ne pas obtenir toutes les fenêtres des messages dans MFC ActiveX Control Composite

  class ATL_NO_VTABLE CFooCtrl : 

       public CComObjectRootEx<CComSingleThreadModel>, 
       public IDispatchImpl<CFooCtrl, &IID_IFooCtrl, &LIBID_FooLib>, 
       public CComCompositeControl<CFooCtrl>, 
       public IPersistStreamInitImpl<CFooCtrl>, 
       public IOleControlImpl<CFooCtrl>, 
       public IOleObjectImpl<CFooCtrl>, 
       public IOleInPlaceActiveObjectImpl<CFooCtrl>, 
       public IViewObjectExImpl<CFooCtrl>, 
       public IOleInPlaceObjectWindowlessImpl<CFooCtrl>, 
       public IConnectionPointContainerImpl<CFooCtrl>, 
       public IPersistStorageImpl<CFooCtrl>, 
       public ISpecifyPropertyPagesImpl<CFooCtrl>, 
       public IQuickActivateImpl<CFooCtrl>, 
       public IDataObjectImpl<CFooCtrl>, 
       public IProvideClassInfo2Impl<&CLSID_FooCtrl, &DIID__IFooCtrlEvents, &LIBID_FooCtrlLib>, 
       public IPropertyNotifySinkCP<CFooCtrl>, 
       public CComCoClass<CFooCtrl, &CLSID_FooCtrl>, 
       public CProxy_IFooCtrlEvents<CFooCtrl>, 
      { 

     ... 

     BEGIN_MSG_MAP(CFooCtrl) 
      CHAIN_MSG_MAP(CComCompositeControl<CFooCtrl>) 
      DEFAULT_REFLECTION_HANDLER() 
      MESSAGE_HANDLER(WM_TIMER, OnTimer) 
      MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd) 
      MESSAGE_HANDLER(WM_KEYDOWN, OnKeyDown) 
      MESSAGE_HANDLER(WM_KEYUP, OnKeyUp) 
      MESSAGE_HANDLER(WM_LBUTTONDBLCLK, OnLButtonDblClk) 
      MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown) 
      MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUP) 
      MESSAGE_HANDLER(WM_PAINT, OnPaint) 
      MESSAGE_HANDLER(WM_RBUTTONDBLCLK, OnRButtonDblClk) 
      MESSAGE_HANDLER(WM_RBUTTONDOWN, OnRButtonDown) 
      MESSAGE_HANDLER(WM_RBUTTONUP, OnRButtonUp) 
      MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove) 
      MESSAGE_HANDLER(WM_MOUSEWHEEL, OnMouseWheel) 
      MESSAGE_HANDLER(WM_SIZE, OnSize) 
      MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) 
      MESSAGE_HANDLER(WM_DESTROY, OnDestroy) 
     END_MSG_MAP() 

    LRESULT OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); 
    LRESULT OnEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); 
    LRESULT OnKeyDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); 
    LRESULT OnKeyUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); 
    LRESULT OnLButtonDblClk(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); 
    LRESULT OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); 
    LRESULT OnLButtonUP(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); 
    LRESULT OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); 
    LRESULT OnRButtonDblClk(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); 
    LRESULT OnRButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); 
    LRESULT OnRButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); 
    LRESULT OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); 
    LRESULT OnMouseWheel(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); 
    LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); 
    LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); 
    LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); 

Je reçois des événements comme OnMouseMove, OnLButtonDown/Up/DBLCLK, mais je ne suis pas d'événements comme KeyUp, KeyDown ou MouseWheel.

Tout semble être défini correctement. J'ai déménagé

 CHAIN_MSG_MAP(CComCompositeControl<CFooCtrl>) 
     DEFAULT_REFLECTION_HANDLER() 

À la fin de la carte de message et aucune différence. Je trouve que lorsque je supprime le Reflection_handler() je ne reçois pas de plantages sur KeyDown, mais je soupçonne que ceux-ci proviennent de mon programme Python qui pilote le contrôle. La seule chose que je peux supposer est que la carte msg enchaînée mange ces événements, mais il n'y a aucun contrôle parent qui devrait être intéressé par eux.

Quelqu'un at-il des idées pour lesquelles je reçois des messages mais pas d'autres? Des idées pour retrouver ces messages?

Répondre

1

Je crois que votre code utilise ATL et pas MFC.

La gestion du clavier sur les contrôles composites s'effectue via IOleInPlaceActiveObject. L'implémentation de base dans ATL appellera votre PreTranslateMessage sur votre classe (si elle est implémentée) où vous pouvez obtenir une fissure sur le message avant qu'il ne passe dans TranslateMessage.

Le contrôle composite ATL est un conteneur de contrôle (il s'agit d'une boîte de dialogue enfant pouvant héberger d'autres contrôles ActiveX). Pour plus d'informations, reportez-vous à la section "Keyboard Handling" dans http://www.microsoft.com/msj/1299/containment/containment.aspx

Questions connexes