分享方式:


標準 Windows 訊息的處理常式

標準 Windows 訊息的預設處理常式 ( WM_ ) 在 類別 CWnd 中預先定義。 類別庫以訊息名稱作為這些處理常式的基礎。 例如,WM_PAINT 訊息的 處理常式宣告 CWnd 為:

afx_msg void OnPaint();

afx_msg 關鍵字藉由區分處理常式與其他 CWnd 成員函式,來建議 C++ virtual 關鍵字的效果。 不過,請注意,這些函式不是真實運作,它們是透過訊息對應實作。 訊息對應完全取決於標準前置處理器巨集,而不是 C++ 語言的任何擴充功能。 afx_msg 關鍵字在前置處理之後解析為空白字元。

若要覆寫基底類別中定義的處理常式,只需用您的衍生類別中的相同原型定義函式,並製作處理常式的訊息對應項目即可。 您的處理常式會「覆寫」您類別的基底類別中名稱相同的任何處理常式。

在某些情況下,處理常式應該呼叫基底類別中被覆寫的處理常式,讓基底類別和 Windows 能對訊息產生作用。 有關在何處呼叫覆寫的基底類別處理常式,端視情況而定。 有時,您必須先呼叫基底類別處理常式,有時最後才呼叫。 如果您選擇不自行處理訊息,有時您會有條件地呼叫基底類別處理常式。 有時您應該呼叫基底類別處理常式,然後根據基底類別處理常式傳回的值或狀態,有條件地執行您自己的處理常式程式碼。

警告

如果您想要將它們傳遞給基底類別處理常式,修改傳遞至處理常式的引數並不安全。 例如,您可能想要修改 處理常式的 OnChar nChar 引數(例如轉換成大寫)。 此行為相當模糊,但如果您需要完成此效果,請改用 CWnd 成員函式 SendMessage

如何判斷覆寫指定訊息的適當方式:當類別精靈 為指定訊息撰寫處理常式函式的基本架構時 OnCreate 例如,WM_CREATE 的處理常式 ,它會以建議覆寫成員函式的形式草圖。 下列範例建議處理常式先呼叫基類處理常式,並只在不會傳回 -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 參考 ,作為名稱開頭為 「On」 之類別 CWnd 的成員函式。中的 CWnd 成員函式宣告前面會加上 afx_msg

另請參閱

宣告訊息處理函式