いくつかのボタンがあり、それらすべてに対して1つのメッセージハンドラーを作成したいと思います。どのボタンがクリックされたかを確認する方法はありますか?C#にはパラメーター(送信者)がありましたが、MFCにはそのようなものがありますか?または、すべてのボタンに同じメッセージハンドラーを個別に作成する必要がありますか?
4 に答える
最善のオプションは、おそらくすべてのボタンに連続したID番号を付けてから、ON_COMMAND_RANGE(FIRST_BUTTON_ID、LAST_BUTTON_ID、HandlerFunction)を使用することです。次に、HandlerFunctionは、ハンドラーを呼び出したボタンのID番号となるUINTnIDを取得します。詳細はこちら
通常のWM_COMMANDメッセージの場合、メッセージのlParamメンバーは、送信者がウィンドウの場合、送信者のHWNDを保持することになっています。@Redeyeが返信したように、すべてのボタンを範囲内に配置し、メッセージテーブルにON_COMMAND_RANGE()エントリを書き込み、ウィンドウ、ダイアログ、ビューのメンバー関数としてOnCommand(UINT nCmd)(または名前を付けたもの)を書き込むことができます。 、フレーム、またはドキュメントクラス。ボタンは必ずしも範囲内にある必要はありません。ボタンIDごとに1つのエントリをON_COMMAND_RANGE(IDC_BUTTON1, IDC_BUTTON1)
--または識別子が何であれとして配置できます。そのマクロでは、開始範囲と停止範囲を異ならせる必要があるという規則はありません。
独自のメッセージクラッキングマクロを作成できます。これは、基本的にON_COMMAND_RANGE()が実行することを実行しますが、1つのエントリを取得するだけです。
ハンドラーでCWnd::GetCurrentMessage()を呼び出し、ハンドラーでそれをクラックしてコマンドを取得することもできます。メッセージのwParamメンバーのLOWORDは、制御IDを保持します。メッセージのlParamメンバーは、送信コントロールHWNDを保持します(ウィンドウの場合)。ツールバーのようなものの場合、ツールバーボタンは実際のボタンではなく、lParamが常にツールバーのHWNDになるようにツールバーによって描画されます。
質問を正しく理解していれば、それは非常に簡単です。プロパティエディタでOnCommandイベントを割り当てるときは、もう一度クリックしないでください(ウィザードに別のメッセージハンドラを追加させ、代わりに既存のハンドラの1つを選択します。これを作成できない場合動作します(VStudioのバージョンと設定がわかりません)。手動で行うことができます。新しいハンドラーを通常どおりに作成し、保存してから.cppファイルと.hファイルに移動し、クラスヘッダーの宣言と実装を削除します。 .cppファイルで、メッセージマップに移動し、ON_COMMANDエントリを変更して、既存の(古い/共通の)ハンドラーを使用するようにします。複数のUIオブジェクト(メニュー項目、ツールバーボタンなど)があるON_UPDATE_UIハンドラーにも非常に役立ちます。同じ条件に基づいて有効化/無効化/チェック済みなど(したがって、それらをグループ化して、すべてに対して1つのハンドラーを持つことが可能です。それぞれに1つのハンドラーのインストラクション)。
編集:たぶん私は間違っていました、質問が未解決の外部のみに関するものだった場合、OnSignButton()はCTabTwoのメンバーとして実装されていますか?投稿した実装(コード)がクラス宣言の外にある場合、そうではありません。void CTabTwo :: OnSignButton(UINT ID)..として宣言します。
たまたまこの投稿を見てください。これは別の方法ですか?仮想関数OnCommandを使用します。
BOOL CKeyboard::OnCommand(WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
//
if (HIWORD(wParam)==BN_CLICKED)
{
switch(LOWORD(wParam))
{
case IDC_BUTTON1:
break;
case IDC_BUTTON2:
break;
case IDC_BUTTON3:
break;
}
}
return CView::OnCommand(wParam, lParam);
}