この技術情報では、一つのメッセージのハンドラー関数にメッセージの範囲をマップする方法を示しています (1 の関数だけにマッピング 1 のメッセージではなく)。
複数のメッセージまたはコントロール通知と同様に処理する必要がある場合があります。このような場合に、一つのハンドラー関数にメッセージをすべてマップする場合があります。メッセージマップの範囲は、メッセージの連続した範囲のこれを行うようにします:
コマンド ID の範囲をマップする場合:
コマンド ハンドラー関数。
コマンド更新ハンドラー関数。
メッセージ ハンドラー関数にコントロール ID の範囲のコントロール通知のメッセージをマップできます。
この技術情報で説明するトピックは次のとおりです。:
メッセージマップ エントリを作成できます。
ハンドラー関数の宣言
コマンド ID の範囲の例
コントロール ID の範囲の例
メッセージマップ エントリを作成できます。
.cpp ファイルで、次の例に示すようにメッセージマップ エントリを追加します:
ON_COMMAND_RANGE(ID_MYCMD_ONE, ID_MYCMD_TEN, &OnDoSomething)
メッセージマップ エントリには、以下の項目で構成されます:
メッセージマップの範囲のマクロ:
マクロのパラメーター:
最初の 2 種類のマクロが 3 の三つのパラメーターをとります:
範囲を開始するコマンド ID
範囲を終了するコマンド ID
メッセージ ハンドラー関数の名前
コマンド ID の範囲は連続している必要があります。
3 番目のマクロ、 ON_CONTROL_RANGEは、追加の最初のパラメーターを受け取ります: EN_CHANGEなどのコントロール通知メッセージ。
ハンドラー関数の宣言
のハンドラー関数の宣言を追加します。H ファイル。次のコードは、これがどのように表示されるかを示します次に示すように、:
public:
afx_msg void OnDoSomething(UINT nID);
一つのコマンドのハンドラー関数は、通常、パラメーターを受け取りません。更新ハンドラー関数を除いて、メッセージマップの範囲のハンドラー関数は補足的なパラメーター、 nIDの型 uintが必要です。このパラメーターは、最初のパラメーターです。補足的なパラメーターは、コマンドをユーザーが実際に選択したかを指定するために必要な追加のコマンド ID が格納されます。
ハンドラー関数を更新するためのパラメーター要件に関する詳細については、 コマンド ID の範囲の例を参照してください。
コマンド ID の範囲の例
いつ範囲を使用するかどうか。1 例は、 MFC のサンプル HIERSVRのズーム コマンドのようなコマンドの処理にあります。このコマンドは、ビューの拡大し、標準サイズの 25% と 300% の間に XML をスケーリングします。HIERSVR のビュー クラスは次のようになります。メッセージマップ入力してズーム コマンドを処理するために範囲を使用して:
ON_COMMAND_RANGE(ID_VIEW_ZOOM25, ID_VIEW_ZOOM300, &OnZoom)
メッセージマップ エントリを記述するときに指定します:
2 個のコマンド ID、開始および終了連続する範囲。
ここには ID_VIEW_ZOOM25 と ID_VIEW_ZOOM300です。
コマンドのハンドラー関数の名前。
ここでは OnZoomです。
関数宣言は次のようになります。:
public:
afx_msg void OnZoom(UINT nID);
更新ハンドラー関数には類似して、便利で幅が広くなります。これが一般的多数のコマンドの ON_UPDATE_COMMAND_UI ハンドラーを記述し、自身を検索するに書き込み、または、同じコードを何度もコピーです。ソリューションは ON_UPDATE_COMMAND_UI_RANGE マクロを使用して 1 個の更新ハンドラー関数にコマンド ID の範囲をマップします。コマンド ID は、連続する範囲を形成する必要があります。例については、 HIERSVR サンプルのビュー クラスの OnUpdateZoom ハンドラーと ON_UPDATE_COMMAND_UI_RANGE のメッセージマップ " を参照してください。
一つのコマンドの更新ハンドラー関数は通常、一つのパラメーター、 pCmdUIの型 **CCmdUI***を受け取ります。ハンドラー関数とは異なり、メッセージマップの範囲の更新ハンドラー関数は補足的なパラメーター、 nIDの型 uintを必要としません。どのコマンドをユーザーが実際に選択したかを指定するために必要なコマンド ID が CCmdUI のオブジェクトに、あります。
コントロール ID の範囲の例
別の重要なケースは一つのハンドラーにコントロール ID の範囲のコントロール通知のメッセージをマップします。ユーザーが 10 のボタンをクリックするとします。10 のすべてのボタンから 1 人のハンドラーをマップするには、メッセージマップ エントリは次のようになります。:
ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON1, IDC_BUTTON10, OnButtonClicked)
メッセージ マップの ON_CONTROL_RANGE マクロを記述するときに指定します:
特定のコントロール通知メッセージ。
ここでは BN_CLICKEDです。
コントロールの連続した範囲に関連付けられたコントロール ID 値。
ここでは、これら IDC_BUTTON1 と IDC_BUTTON10です。
メッセージ ハンドラー関数の名前。
ここでは OnButtonClickedです。
ハンドラー関数を作成すると、次に示すように uint 追加のパラメーターを指定する:
void CRangesView::OnButtonClicked( UINT nID )
{
int nButton = nID - IDC_BUTTON1;
ASSERT( nButton >= 0 && nButton < 10 );
// ...
}
BN_CLICKED にメッセージの OnButtonClicked ハンドラーはパラメーターを受け取りません。ボタンの範囲の同じハンドラーは 1 uintを受け取ります。補足的なパラメーターは BN_CLICKED のメッセージを生成する必要があるコントロールを識別するようにします。
例に示すコードは一般的です: 値を変換すると、メッセージの範囲、このケースに該当することをアサートすると、内の int に渡されました。これで、ボタンがクリックされた異なるアクションを受け取ることがあります。