Обработка сообщения wm_mousewheel в WTL

Я пытаюсь обработать 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? Ответственна ли перспектива за сбой при обработке сообщения wm_mousewheel?


person Rushikesh Talokar    schedule 24.04.2010    source источник


Ответы (2)


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

  1. Измените свой тест на if (uMsg == WM_MOUSEWHEEL).
  2. Убедитесь, что ваше окно или одно из его дочерних окон находится в фокусе.
  3. Если это связано с вашим предыдущим вопросом wtl-child-window-event-processing, Я отредактировал свой ответ на не пересылать WM_MOUSEWHEEL .
person Alain Rist    schedule 26.04.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)
   { ... }
};
person M. Williams    schedule 24.04.2010