[英]how to route a message to the control's standard WNDPROC
當創建標准窗口控件(例如"EDIT"
控件)時,其WNDPROC
被定義為窗口類的一部分(即"EDIT"
具有特定的WNDPROC
,旨在使窗口顯示並表現為編輯控件)。
MFC允許您通過其包裝類與這些控件進行交互,例如CEdit
包裝用於"EDIT"
窗口控件的專用消息。
MFC進一步允許您將"EDIT"
窗口的實例綁定到CEdit的C ++子類,比如CMyEdit
,您可以在其中覆蓋CEdit
和CWnd
繼承虛函數,並且您可以定義消息表以獲取訪問/覆蓋消息發送到窗口實例本身。
有CWnd :: Default() ,它使用當前的消息參數調用this-> DefWndProc。 這似乎是在WNDPROC
查找與之關聯的HWND。 這是正確的答案:調用DefWndProc()(或同樣,默認()),它將把它交給Windows控件的WNDPROC
?
顯然,這與其他消息表處理程序不同,后者可以返回FALSE以指示它們不處理消息,並且MFC將自動將消息從類繼承層次結構路由到此消息的下一個消息處理程序,或者,我假設,默認()由本地WNDPROC
處理?
如果我定義一個任意的消息處理程序,比如WM_SETTEXT,那么將此消息傳遞給"EDIT"
WNDPROC
的正確方法是什么?
我也想知道是否有辦法將消息傳遞給超類(C ++類層次結構)進行處理? 許多OnXXX樣式處理程序確實有這樣做,但是有一種適用於ON_MESSAGE處理程序的機制嗎?
class CDynamicMenuControlEdit : public CEdit
{
...
LRESULT OnSetText(WPARAM wParam, LPARAM lParam);
...
}
BEGIN_MESSAGE_MAP(CDynamicMenuControlEdit, CEdit)
...
ON_MESSAGE(WM_SETTEXT, OnSetText)
...
END_MESSAGE_MAP()
LRESULT CDynamicMenuControlEdit::OnSetText(
WPARAM wParam, // not used; must be zero
LPARAM lParam // window-text string (LPCTSTR)
)
{
if (m_bHasFocus)
{
// do normal thing
// !!! THIS IS MY QUESTION: IS THIS CALLING EDIT's WNDPROC, or ::DefWinProc()? !!!
return DefWindowProc(WM_SETTEXT, wParam, lParam);
}
...
}
澄清
您可以在C ++級別擁有多個MFC子類 -
所以C繼承B繼承A,其中A是MFC類(例如CEdit
)。
每個都可以有一個MFC消息表 - 即BEGIN_MESSAGE_MAP
... END_MESSAGE_MAP
,每個都可以有任何窗口消息的處理程序,如WM_MESSAGE(WM_SETTEXT, OnSetText)
- 並且OnSetText
成員不一定是虛擬的 - 只是一個靜態成員(每個MFC子類都可以以任意方式路由該消息)。
我的問題是 - 由於WM_MESSAGE
調度條目沒有返回值,如何允許MFC在返回真實窗口'EDIT'類的wndproc之前將MFC調度表從C傳遞到B到A?
或者所有這些條目都是MFC設計級別的,不是要走路嗎? 即最多子層的調度程序是否是唯一被調用的? 如果它想利用一個繼承的成員,它必須手動進行該調用 - MFC根本沒有任何特定的通用結構嗎?
調用Default()
將導致響應消息發生時發生的“正常”處理。 我並不完全清楚你想要實現的目標,但在我看來,調用Default()
就是你想要做的。
如果你從CWnd
處理程序中的Windows消息(以及從CWnd
派生的類中的處理程序,如CEdit
)查看很多處理程序,你會看到它們調用Default()
。
明智的話, Default()
實際上會使用原始消息所具有的任何參數 - 你無法改變它們。
你說得對。 CWnd :: DefWindowProc()使用你子類化的WINDOWPROC,並將調用EDIT窗口的窗口過程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.