Не получить все сообщения Windows в MFC ActiveX Composite Control - PullRequest
0 голосов
/ 18 декабря 2008

У меня есть составной элемент управления с объявлением, подобным этому:

         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);

Я получаю такие события, как OnMouseMove, OnLButtonDown / Up / DblClk, но я не получаю такие события, как KeyUp, KeyDown или MouseWheel.

Кажется, все правильно определено. Я переехал

      CHAIN_MSG_MAP(CComCompositeControl< CFooCtrl >)
      DEFAULT_REFLECTION_HANDLER()

До конца карты сообщений и без разницы. Я обнаружил, что когда я удаляю Reflection_handler (), я не получаю сбои на KeyDown, но подозреваю, что это из моей программы Python, управляющей элементом управления.

Единственное, что я могу предположить, - это то, что цепочечная карта MSG пожирает эти события, но нет родительского контроля, который бы их интересовал.

У кого-нибудь есть идеи, почему я получаю одни сообщения, а другие нет? Любые идеи для восстановления этих сообщений?

1 Ответ

1 голос
/ 21 февраля 2009

Я считаю, что ваш код использует ATL, а не MFC.

Обработка клавиатуры на составных элементах управления происходит через IOleInPlaceActiveObject. Базовая реализация в ATL будет вызывать ваше PreTranslateMessage в вашем классе (если оно реализовано), где вы можете получить сообщение об ошибке, прежде чем оно перейдет в TranslateMessage.

Составной элемент управления ATL является контейнером элементов управления (это дочерний диалог, в котором могут размещаться другие элементы управления activex). Для получения дополнительной информации см. Раздел «Обработка клавиатуры» в http://www.microsoft.com/msj/1299/containment/containment.aspx

...