WM_MOUSEWHEEL、WM_LBUTTONDOWN等父子窗口消息傳遞陷阱


mfc中,碰到以下問題:父對話框A、子窗口B。B是CWnd對象。需要在B中處理WM_MOUSEWHEEL、WM_LBUTTONDOWN等消息。

所以在B中增加對應的消息處理,發現B中的消息循環中,收不到WM_MOUSEWHEEL、WM_LBUTTONDOWN這些消息。

但是在A中卻可以收到這些消息,應該是這些消息被A截獲了,因為我在A中響應了PreTranslateMessage函數

BOOL A::PreTranslateMessage(MSG* pMsg){

  return __super::PreTranslateMessage(pMsg);

}

。那么怎么讓B響應這些消息呢。

一般的做法是:1.在A中響應這些消息,然后調用B對象的方法。如果A或B所處的文件結構不是很復雜的話,這樣應該是最簡單的。

       2.PreTranslateMessage函數最后,改為return FALSE。讓消息往子窗口B傳遞。

但是我的情況是B是在一個單獨的dll里的,所以不打算增加額外接口,直接通過:

SendMessage(B.hWnd,WM_MOUSEWHEEL,zDelta, MAKELPARAM(pt.x, pt.y));這樣的方式傳遞消息。

但是我在B中接收這個WM_MOUSEWHEEL消息的時候,

BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt){

  return CWnd::OnMouseWheel(nFlags,zDelta,pt);

}

導致了程序的崩潰。

其實,通過調試可以發現,B中的該處理函數是處於死循環狀態。所以修改為

BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt){

  return TRUE;//因為此時B已經是最頂層的窗口了,無子窗口,所以直接截獲(別的消息卻不會崩潰)

}

該問題解決。注:如果是WM_LBUTTONDOWN等消息,調用CWnd::OnLButtonDown卻不會崩潰,即使是CDialog::OnMouseWheel也不會崩潰。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM