訊息對應範圍處理常式
這篇文章說明如何將一個範圍的訊息對應到單一訊息處理函式 (而非只有一個函式来對應一封郵件)。
很多時候當您需要以完全相同的方式處理多個訊息或控制項的告知。 在這些時候,您可能希望將所有訊息對應到單一的處理常式函式。 訊息對應範圍允許您為連續範圍的郵件執行這項操作:
您可以將對應至命令 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中的郵件範圍,判斷提示這大小寫。 然後,您可能需要不同的動作取決於所按按鈕為何。