Обработка сообщения wm_mousewheel в WTL - PullRequest
1 голос
/ 24 апреля 2010

Я пытаюсь обработать wm_mousewheel для моего приложения.

Код:

BEGIN_MSG_MAP(DxWindow)     
  MESSAGE_HANDLER(WM_MOUSEWHEEL, KeyHandler)
END_MSG_MAP()
.
.
.

LRESULT DxWindow::KeyHandler( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled )
 {
     if(uMsg==wm_mousewheel)
     {
       //Perform task.
     }
     return 0;
 }

Но этот код не работает. KeyHandler не получает сообщение wm_mousewheel. Я тестирую это приложение на Vista. Если мой подход неверен, как правильно обрабатывать wm_mousewheel? Несет ли Vista ответственность за ошибку при обработке сообщения wm_mousewheel?

Ответы [ 2 ]

2 голосов
/ 26 апреля 2010

Из документа : Сообщение WM_MOUSEWHEEL отправляется в окно фокуса при вращении колесика мыши. Функция DefWindowProc передает сообщение родителю окна. Не должно быть внутренней пересылки сообщения, поскольку DefWindowProc распространяет его по родительской цепочке, пока не найдет окно, которое его обрабатывает.

  1. Измените свой тест на if (uMsg == WM_MOUSEWHEEL ).
  2. Убедитесь, что у вашего окна или у одного из его детей есть фокус.
  3. Если это связано с вашим предыдущим вопросом wtl-child-window-event , я отредактировал свой ответ на не пересылать WM_MOUSEWHEEL .
0 голосов
/ 24 апреля 2010

Ну, во-первых, вам не нужно каким-то образом проверять uMsg в обработчике сообщений, потому что в этой ситуации каждый обработчик сообщений привязан к одному конкретному сообщению.

Во-вторых, эти макросы atl обычно означают написать что-то вроде CHAIN_MSG_MAP(CMyBaseClass) в конце вашей карты.

В любом случае, то, что вы разместили здесь, выглядит нормально, кроме этой части:

if(uMsg==wm_mousewheel)
{
  //Perform task.
}

Попробуйте стереть его, добавить точку останова в обработчик и отладить. Также вы можете попробовать добавить другой нейтральный обработчик сообщений (например, WM_CLICK) и отследить его поведение.

Это пример из MSDN, и блок кода, который вы опубликовали, фактически следует за ним.

class CMyWindow : ...
{
public:
   ...

   BEGIN_MSG_MAP(CMyWindow)
      MESSAGE_HANDLER(WM_PAINT, OnPaint)
      MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
      CHAIN_MSG_MAP(CMyBaseWindow)
   END_MSG_MAP()

   LRESULT OnPaint(UINT uMsg, WPARAM wParam, 
                   LPARAM lParam, BOOL& bHandled)
   { ... }

   LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, 
                      LPARAM lParam, BOOL& bHandled)
   { ... }
};
...