共用方式為


訊息對應範圍處理常式

這篇文章說明如何將一個範圍的訊息對應到單一訊息處理函式 (而非只有一個函式来對應一封郵件)。

很多時候當您需要以完全相同的方式處理多個訊息或控制項的告知。 在這些時候,您可能希望將所有訊息對應到單一的處理常式函式。 訊息對應範圍允許您為連續範圍的郵件執行這項操作:

  • 您可以將對應至命令 Id 的範圍:

    • 命令處理常式的函式。

    • 命令更新處理函式。

  • 您可以將某個範圍內的控制項 Id 的控制項告知訊息對應到訊息處理函式。

本文所涵蓋的主題包括:

  • 寫入訊息對應項目

  • 宣告處理函式

  • 命令 Id 的某個範圍的範例

  • 某個範圍內的控制項 Id 的範例

寫入訊息對應項目

在中。CPP 檔案中加入您的訊息對應項目,如下列範例所示:

ON_COMMAND_RANGE(ID_MYCMD_ONE, ID_MYCMD_TEN, &OnDoSomething)

訊息對應項目包含下列項目:

  • 訊息對應範圍巨集:

  • 巨集的參數:

    前兩個巨集採用三個參數:

    • 開始範圍的命令 ID

    • 結束範圍的命令 ID

    • 訊息處理常式函式名稱

    命令 Id 的範圍必須是連續的。

    第三個巨集, ON_CONTROL_RANGE,會使用額外的第一個參數: 控制項告知訊息,例如 EN_CHANGE

宣告處理函式

新增您的處理常式函式宣告中。H 檔案中。 下列程式碼會顯示可能的外觀,如下所示:

public:
   afx_msg void OnDoSomething(UINT nID);

單一命令的處理函式通常不採用參數。 更新處理函式,是例外的訊息對應範圍處理函式需要額外的參數, nID,型別的 UINT。 這個參數是第一個參數。 額外的參數所能容納的指定使用者真正選擇的命令所需的額外命令 ID。

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

範圍的命令 Id 範例

何時需要使用範圍? 例如,在處理命令和 MFC 範例中的 [縮放] 指令一樣 HIERSVR。 這個命令縮放檢視中,25%和它的正常大小的 300%間縮放其比例。 HIERSVR 的檢視類別會使用範圍來處理縮放命令,以類似的訊息對應項目:

ON_COMMAND_RANGE(ID_VIEW_ZOOM25, ID_VIEW_ZOOM300, &OnZoom)

當您撰寫訊息對應項目時,可以指定:

  • 兩個命令 Id,開始跟結束一個連續範圍。

    Here they are ID_VIEW_ZOOM25 and ID_VIEW_ZOOM300.

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

    Here it's OnZoom.

函式宣告會像這樣:

public:
   afx_msg void OnZoom(UINT nID);

更新處理函式的情況是類似的而且可能更廣泛地有用。 是相當常見的撰寫ON_UPDATE_COMMAND_UI將多個命令的處理常式,並發現自己撰寫,或複製,相同的程式碼重複。 解決方法是將對應範圍的命令 Id,其中一個更新處理常式函式使用ON_UPDATE_COMMAND_UI_RANGE巨集。 命令 Id 必須形成一個連續範圍。 如需範例,請參閱 OnUpdateZoom 處理常式以及其ON_UPDATE_COMMAND_UI_RANGE HIERSVR 範例的檢視類別中的訊息對應項目。

更新處理函式,為單一命令通常會採用一個參數, pCmdUI,型別的 CCmdUI 1。 不同於處理函式,訊息對應範圍的更新處理函式不需要額外的參數, nID,型別的 UINT。 中找不到命令 ID,就需要指定哪個指令使用者真正選擇, CCmdUI物件。

範圍的控制項 Id 範例

另一個有趣的案例將某個範圍內的控制項 Id 的控制項告知訊息對應到單一的處理常式。 假設使用者可以按一下任何一個 10 個按鈕。 若要對應全部 10 個按鈕到一個處理常式,您的訊息對應項看起來會像這樣:

ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON1, IDC_BUTTON10, OnButtonClicked)    

當您撰寫ON_CONTROL_RANGE在您的訊息對應中的巨集,指定:

  • 特殊的控制項告知訊息。

    這裡有 BN_CLICKED

  • 控制項的連續範圍相關聯控制項 ID 的值。

    Here these are IDC_BUTTON1 and IDC_BUTTON10.

  • 訊息處理函式的名稱。

    Here it's OnButtonClicked.

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

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

OnButtonClicked的單一的處理常式 BN_CLICKED 訊息沒有參數。 某個範圍內的按鈕相同的處理常式會使用其中一個 UINT。 額外的參數可以用來識別負責產生的特定控制項 BN_CLICKED 訊息。

範例所示的程式碼通常是: 將值傳遞至轉換int中的郵件範圍,判斷提示這大小寫。 然後,您可能需要不同的動作取決於所按按鈕為何。

請參閱

概念

宣告訊息處理常式函式