1

アプリケーションで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メッセージを受信しません。私はこのアプリケーションをビスタでテストしています。私のアプローチが間違っている場合、wm_mousewheelを適切に処理する方法は?ビスタはwm_mousewheelメッセージの処理の失敗に責任がありますか?

4

2 に答える 2

3

ドキュメントから:マウスホイールを回転させると、WM_MOUSEWHEELメッセージがフォーカスウィンドウに送信されます。DefWindowProc関数は、メッセージをウィンドウの親に伝播します。DefWindowProcは、メッセージを処理するウィンドウが見つかるまでメッセージを親チェーンに伝播するため、メッセージの内部転送はありません。

  1. テストをif(uMsg == WM_MOUSEWHEEL)に変更します。
  2. ウィンドウまたはその子の1つにフォーカスがあることを確認してください。
  3. これが以前のwtl-child-window-event-handlingの質問に関連している場合は、 WM_MOUSEWHEELを転送しないよう回答を編集しました。
于 2010-04-26T06:02:48.217 に答える
0

まず、メッセージハンドラでuMsgをチェックする必要はありません。この状況では、すべてのメッセージハンドラが1つの具体的なメッセージにバインドされているためです。

第二に、これらの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)
   { ... }
};
于 2010-04-24T14:32:45.423 に答える