2010-04-24 59 views
1

我正在嘗試爲我的應用程序處理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; 
} 

但是這個代碼不work.KeyHandler沒有收到WM_MOUSEWHEEL消息。 我正在Vista上測試這個應用程序。 如果我的方法是錯誤的如何正確處理wm_mousewheel? vista是否對處理wm_mousewheel消息失敗負責?

回答

0

嗯,首先,你不必以某種方式檢查消息處理程序中的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) 
    { ... } 
}; 
2

doc: 當鼠標滾輪旋轉時,WM_MOUSEWHEEL消息被髮送到焦點窗口。 DefWindowProc函數將消息傳播到窗口的父級。應該沒有消息的內部轉發,因爲DefWindowProc在父鏈中傳播它直到找到一個處理它的窗口。

  1. 測試更改爲IF(uMsg == WM_MOUSEWHEEL)。
  2. 檢查您的窗口或其中一個孩子是否有焦點。
  3. 如果這與您以前的wtl-child-window-event-handling問題有關,我編輯我的answer不轉發WM_MOUSEWHEEL