標準的 Windows 訊息處理常式
預設的標準的 Windows 訊息處理常式 (WM_) 預先定義的類別中CWnd。 類別庫的訊息名稱來建立這些處理常式的名稱。 比方說,這個處理常式中的WM_PAINT訊息宣告於CWnd為:
afx_msg void OnPaint();
Afx_msg 關鍵字建議 C++ 的效果虛擬關鍵字來區別彼此的處理常式CWnd成員函式。 不過請注意,這些函式並非真是虛擬的。 它們反而是經由訊息對應來實作。 訊息對應僅依據標準前置處理器巨集,不會在任何 C++ 語言的擴充功能。 Afx_msg 後的前置處理關鍵字會解析為泛空白字元。
要覆寫基底類別中定義的處理常式,只需定義具有相同的原型的函式在您的衍生類別中,並製作訊息對應項目處理常式。 您的處理常式 「 覆寫 」 任何類別的基底類別中相同名稱的任何處理常式。
在某些情況下,您的處理常式應該覆寫的處理常式中呼叫基底類別如此基底類別和 Windows 可操作這些訊息。 您的覆寫的何處呼叫基底類別處理常式視狀況而定。 有時候,您必須先呼叫基底類別處理常式,而有些時候最後。 有時候您呼叫基底類別處理常式有條件地,如果您選擇不要自己處理這些訊息。 有時候,您應該呼叫基底類別處理常式,然後視條件執行您的處理常式程式碼,取決於基底類別處理常式傳回的狀態的值。
警告
不安全,修改傳入處理常式,如果您想要傳遞至基底類別處理常式的引數。比方說,您可能會想要修改nChar引數的OnChar處理常式 (要轉換為大寫,例如)。這個行為會很模糊,但如果您需要完成這一個效果,使用CWnd成員函式 SendMessage 相反的。
您要如何判斷要覆寫給定的訊息的正確方法? 當 [屬性] 視窗會寫入指定訊息的處理函式的基本結構 — OnCreate的處理常式WM_CREATE,例如 — 它 sketches 建議的覆寫的成員函式的形式。 下面的範例建議處理常式首先呼叫基底類別處理常式,並繼續進行,只有在條件,才會傳回 – 1。
int CMyView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFormView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
return 0;
}
依照慣例,這些處理常式的名稱開頭的前置詞"On"。當其他人需要幾個,這些處理常式中,有些會接受任何引數。 有些也有傳回型別不是void。 所有的預設處理常式 WM_ 的郵件會詳加 MFC 參考手冊 》 類別的成員函式為CWnd名稱開頭以 「 On 」。成員函式宣告,在CWnd前面加上了 afx_msg。