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也不會崩潰。