分享方式:


訊息對應範圍的處理常式

本文說明如何將一系列訊息對應至單一訊息處理常式函式(而不是將一則訊息對應至一個函式)。

有時候,您需要以完全相同的方式處理多個訊息或控制通知。 有時候,您可能想要將所有訊息對應至單一處理程式函式。 訊息對應範圍可讓您針對連續的訊息範圍執行此動作:

  • 您可以將命令識別碼的範圍對應至:

    • 命令處理常式函式。

    • 命令更新處理常式函式。

  • 您可以將控制項識別碼範圍的控制項通知訊息對應至訊息處理常式函式。

本文涵蓋的主題包括:

撰寫訊息對應專案

在。CPP 檔案,新增您的訊息對應專案,如下列範例所示:

ON_COMMAND_RANGE(ID_MYCMD_ONE, ID_MYCMD_TEN, &OnDoSomething)

訊息對應專案包含下列專案:

  • 訊息對應範圍宏:

  • 宏的參數:

    前兩個宏採用三個參數:

    • 啟動範圍的命令識別碼

    • 結束範圍的命令識別碼

    • 訊息處理常式函式的名稱

    命令識別碼的範圍必須連續。

    第三個宏 ON_CONTROL_RANGE 會採用額外的第一個參數:控制項通知訊息,例如 EN_CHANGE

宣告處理常式函式

在 中新增處理常式函式宣告。H 檔案。 下列程式碼顯示其外觀,如下所示:

public:
   afx_msg void OnDoSomething(UINT nID);

單一命令的處理常式函式通常不採用任何參數。 除了更新處理常式函式之外,訊息對應範圍的處理常式函式需要 UINT 類型的 額外參數 nID 。 此參數是第一個參數。 額外參數會容納指定使用者實際選擇哪一個命令所需的額外命令識別碼。

如需更新處理常式函式的參數需求詳細資訊,請參閱 命令 識別碼範圍的範例。

命令識別碼範圍的範例

使用範圍時:其中一個範例是在處理 MFC 範例 HIERSVR 中的 Zoom 命令之類的命令。 此命令會縮放檢視,將其縮放為正常大小的 25% 到 300%。 HIERSVR 的檢視類別會使用範圍來處理 Zoom 命令,其訊息對應專案與下列專案相同:

ON_COMMAND_RANGE(ID_VIEW_ZOOM25, ID_VIEW_ZOOM300, &OnZoom)

當您撰寫訊息對應專案時,您可以指定:

  • 兩個命令識別碼,開始和結束連續範圍。

    在這裡,它們是 ID_VIEW_ZOOM25 ID_VIEW_ZOOM300

  • 命令的處理常式函式名稱。

    OnZoom以下是 。

函式宣告會類似這樣:

public:
   afx_msg void OnZoom(UINT nID);

更新處理常式函式的案例很類似,而且可能更廣為實用。 撰寫許多命令的處理常式相當常見 ON_UPDATE_COMMAND_UI ,併發現自己撰寫或複製相同的程式碼。 解決方案是使用 ON_UPDATE_COMMAND_UI_RANGE 宏,將一系列命令識別碼對應至一個更新處理常式函式。 命令識別碼必須形成連續的範圍。 如需範例,請參閱 OnUpdateZoom HIERSVR 範例檢視類別中的處理常式及其 ON_UPDATE_COMMAND_UI_RANGE 訊息對應專案。

單一命令的更新處理常式函式通常會採用類型的 CCmdUI* 單一參數 pCmdUI 。 與處理常式函式不同,訊息對應範圍的更新處理常式函式不需要 UINT 類型的 額外參數 nID 。 在 物件中找到 CCmdUI 指定使用者實際選擇的命令所需的命令識別碼。

控制項識別碼範圍的範例

另一個有趣的案例是將控制項識別碼範圍的控制項通知訊息對應至單一處理程式。 假設使用者可以按一下 10 個按鈕中的任何一個。 若要將所有 10 個按鈕對應至一個處理常式,您的訊息對應專案看起來會像這樣:

ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON1, IDC_BUTTON10, OnButtonClicked)

當您在訊息對應中撰寫 ON_CONTROL_RANGE 宏時,您可以指定:

  • 特定控制項通知訊息。

    以下是BN_CLICKED

  • 與連續控制項範圍相關聯的控制項識別碼值。

    以下是IDC_BUTTON1 IDC_BUTTON10

  • 訊息處理常式函式的名稱。

    OnButtonClicked以下是 。

當您撰寫處理常式函式時,請指定額外的 UINT 參數,如下所示:

void CRangesView::OnButtonClicked(UINT nID)
{
   int nButton = nID - IDC_BUTTON1;
   ASSERT(nButton >= 0 && nButton < 10);
   // ...
}

OnButtonClicked 一BN_CLICKED 訊息的處理常式不會接受任何參數。 一系列按鈕的相同處理常式會採用一個 UINT 。 額外的參數可讓您識別負責產生 BN_CLICKED 訊息的特定控制項。

範例中顯示的程式碼是典型的:將傳遞至 int 訊息範圍內 的值,並判斷提示這是這種情況。 然後,視按下哪個按鈕而定,您可能會採取一些不同的動作。

另請參閱

宣告訊息處理函式