2010-01-18 90 views
1

我正在構建MFC應用程序,其中有CDialog和來自CStatic的子控件。在MFC的CStatic中消耗事件並將它們傳遞給父項

我想接收CStatic控件的鼠標事件,所以我設置"Notify"爲true。現在我可以直接通過消息映射接收消息事件MyStatic

 

class CMyStatic : public CStatic 
{ 
afx_msg void OnLButtonDown(UINT nFlags, CPoint point); // Gets invoked 
DECLARE_MESSAGE_MAP() 
} 
 

的問題是,從現在父的CDialog不接收鼠標事件,當鼠標移動到MyStatic孩子。我可以從MyStatic手動發送它們,但有什麼辦法讓它們自動通過?並且仍然能夠使用消息映射在MyStatic上接收它們?

回答

4

不,你誤會了。 SS_NOTIFY不會導致您的CStatic接收消息,它會導致CStatic將消息中繼回到父級。所以「現在我能夠通過MyStatic中的消息映射直接接收消息事件」基於一個錯誤的前提。

這是爲了因控制只能接收消息本身,而不是它的孩子,除非郵件中繼那些孩子們一起玩「或做其他的技巧(全局鉤子,很重要的一點... );但是這些情況是例外,「正常」的方式是每個窗口都爲自己接收消息。

因此,您可以回答您的問題:不,無法讓父母(您的CDialog)和孩子(您的CStatic)在沒有手動操作的情況下接收鼠標事件,也無法參與單調乏味的消息路由黑客行爲。所以在你的情況下,你需要做的是GetParent() - > SendMessage(WM_LBUTTONDOWN,...)等,手動重新創建WPARAM和LPARAM值;或直接在CDialog上調用OnLButtonDown:GetParent() - > OnLButtonDown(...)。您必須考慮將鼠標座標傳遞迴CDialog,但可能需要將它們轉換爲CDialog的客戶端座標。

+0

Roel,謝謝你的解釋。但是,除非設置SS_NOTIFY,否則我無法使用消息映射接收消息。也許這是一些奇怪的MFC行爲? – 2010-01-21 00:50:23

+0

嘗試在您的CStatic中捕獲WM_MOUSEMOVE並在其中執行SetFocus()。 – Roel 2010-01-21 08:57:26

1

如果您調用基礎OnLButtonDown處理程序,則應將消息發送給父級。

CMyStatic::OnLButtonDown(UINT nFlags, CPoint point) 
{ 
    CStatic::OnLButtonDown(nFlags, point); 

    // custom handling 
} 
+0

這不適合我。我不得不在我的CMyStatic :: OnLButtonDown()方法中使用GetParent() - > SendMessage(WM_COMMAND,GetDlgCtrlID()| WM_LBUTTONDOWN << 16,(LONG)GetSafeHwnd());對於WM_LBUTTONUP和CMyStatic :: OnLButtonUp()也是如此。該技術由[本頁]建議(http://www.tenouk.com/visualcplusmfc/visualcplusmfc16b.html)。 – ulatekh 2013-11-20 17:14:13

相關問題