この記事では、Windows コントロールを含むツール バー ボタンをツール バーに追加する方法について説明します。 MFC では、ツール バー ボタンは、CMFCToolBarComboBoxButton クラス、CMFCToolBarEditBoxButton クラス、CMFCDropDownToolbarButton クラス、CMFCToolBarMenuButton クラスなど、CMFCToolBarButton クラス派生クラスである必要があります。
ツール バーへのコントロールの追加
ツール バーにコントロールを追加するには、次の手順に従います。
親ツール バー リソースのボタンのダミー リソース ID を予約します。 Visual Studio で ツール バー エディター を使用してボタンを作成する方法の詳細については、 ツール バー エディター の記事を参照してください。
親ツールバーのすべてのビットマップ内のボタンのツールバー イメージ (ボタン アイコン) を予約します。
AFX_WM_RESETTOOLBARメッセージを処理するメッセージ ハンドラーで、次の手順を実行します。CMFCToolbarButton派生クラスを使用してボタン コントロールを構築します。CMFCToolBar::ReplaceButtonを使用して、ダミー ボタンを新しいコントロールに置き換えます。ReplaceButtonはボタン オブジェクトをコピーし、コピーを保持するため、スタック上にボタン オブジェクトを作成できます。
注
アプリケーションでカスタマイズを有効にした場合は、[カスタマイズ] ダイアログ ボックスの [ツール バー] タブの [リセット] ボタンを使用してツール バーをリセットし、再コンパイル後にアプリケーションで更新されたコントロールを表示する必要がある場合があります。 ツール バーの状態は Windows レジストリに保存され、アプリケーションの起動時に ReplaceButton メソッドが実行された後にレジストリ情報が読み込まれ、適用されます。
ツール バー コントロールとカスタマイズ
[カスタマイズ] ダイアログ ボックスの [コマンド] タブには、アプリケーションで使用できるコマンドの一覧が表示されます。 既定では、[ カスタマイズ ] ダイアログ ボックスはアプリケーション メニューを処理し、各メニュー カテゴリの標準ツール バー ボタンの一覧を作成します。 ツール バー コントロールが提供する拡張機能を維持するには、[ カスタマイズ ] ダイアログ ボックスの標準ツール バー ボタンをカスタム コントロールに置き換える必要があります。
カスタマイズを有効にする場合は、CMFCToolBarsCustomizeDialogクラス クラスを使用して、カスタマイズ ハンドラー OnViewCustomizeで [カスタマイズ] ダイアログ ボックスを作成します。
CMFCToolBarsCustomizeDialog::Createを呼び出して [カスタマイズ] ダイアログ ボックスを表示する前に、CMFCToolBarsCustomizeDialog::ReplaceButtonを呼び出して、標準ボタンを新しいコントロールに置き換えます。
例: 検索コンボ ボックスを作成する
このセクションでは、ツール バーに表示され、最近使用した検索文字列を含む 検索 コンボ ボックス コントロールを作成する方法について説明します。 ユーザーは、コントロールに文字列を入力し、Enter キーを押してドキュメントを検索するか、エスケープ キーを押してフォーカスをメイン フレームに戻すことができます。 次の使用例は、ドキュメントが CEditView クラス派生ビューに表示されることを前提としています。
検索コントロールの作成
まず、[ 検索 ] コンボ ボックス コントロールを作成します。
ボタンとそのコマンドをアプリケーション リソースに追加します。
アプリケーション リソースで、
ID_EDIT_FINDコマンド ID を持つ新しいボタンを、アプリケーションのツール バーおよびツール バーに関連付けられているビットマップに追加します。ID_EDIT_FINDコマンド ID を使用して新しいメニュー項目を作成します。文字列テーブルに新しい文字列
"Find the text\nFind"を追加し、ID_EDIT_FIND_COMBOコマンド ID を割り当てます。 この ID は、[ 検索 ] コンボ ボックス ボタンのコマンド ID として使用されます。注
ID_EDIT_FINDはCEditViewによって処理される標準コマンドであるため、このコマンドの特別なハンドラーを実装する必要はありません。 ただし、新しいコマンドID_EDIT_FIND_COMBOのハンドラーを実装する必要があります。
CComboBoxクラスから派生した新しいクラスCFindComboBoxを作成します。CFindComboBoxクラスで、PreTranslateMessage仮想メソッドをオーバーライドします。 このメソッドは、コンボ ボックスでWM_KEYDOWNメッセージを処理できるようにします。 ユーザーがエスケープ キー (VK_ESCAPE) にヒットした場合は、フォーカスをメイン フレーム ウィンドウに戻します。 ユーザーが Enter キー (VK_ENTER) にヒットした場合は、メイン フレーム ウィンドウに、ID_EDIT_FIND_COMBOコマンド ID を含むWM_COMMANDメッセージを投稿します。CMFCToolBarComboBoxButtonクラスから派生した [検索] コンボ ボックス ボタンのクラスを作成します。 この例では、CFindComboButtonという名前です。CMFCToolbarComboBoxButtonのコンストラクターは、ボタンのコマンド ID、ボタンイメージのインデックス、コンボ ボックスのスタイルの 3 つのパラメーターを受け取ります。 これらのパラメーターを次のように設定します。コマンド ID として
ID_EDIT_FIND_COMBOを渡します。CCommandManager::GetCmdImageとID_EDIT_FINDを使用して、イメージ インデックスを取得します。使用可能なコンボ ボックス スタイルの一覧については、「 Combo-Box スタイル」を参照してください。
CFindComboButtonクラスで、CMFCToolbarComboBoxButton::CreateComboメソッドをオーバーライドします。 ここでは、CFindComboButtonオブジェクトを作成し、そのオブジェクトへのポインターを返す必要があります。IMPLEMENT_SERIALマクロを使用して、コンボ ボタンを永続的にします。 ワークスペース マネージャーは、ボタンの状態を Windows レジストリに自動的に読み込んで保存します。ドキュメント ビューに
ID_EDIT_FIND_COMBOハンドラーを実装します。ID_EDIT_FIND_COMBOでCMFCToolBar::GetCommandButtonsを使用して、すべての [検索] コンボ ボックス ボタンを取得します。 カスタマイズにより、同じコマンド ID を持つボタンのコピーが複数存在する場合があります。ID_EDIT_FINDメッセージ ハンドラーOnFindで、CMFCToolBar::IsLastCommandFromButtonを使用して、[検索] コンボ ボックス ボタンから検索コマンドが送信されたかどうかを確認します。 その場合は、テキストを検索し、検索文字列をコンボ ボックスに追加します。
メイン ツールバーへの検索コントロールの追加
コンボ ボックス ボタンをツール バーに追加するには、次の手順に従います。
メイン フレーム ウィンドウに
AFX_WM_RESETTOOLBARメッセージ ハンドラーOnToolbarResetを実装します。注
フレームワークは、アプリケーションの起動時にツール バーが初期化されたとき、またはカスタマイズ中にツール バーがリセットされたときに、このメッセージをメイン フレーム ウィンドウに送信します。 どちらの場合も、標準のツール バー ボタンをカスタムの [検索 ] コンボ ボックス ボタンに置き換える必要があります。
AFX_WM_RESETTOOLBARハンドラーで、ツール バー ID、つまり、AFX_WM_RESETTOOLBARメッセージのWPARAMを調べます。 ツール バー ID が [ 検索 ] コンボ ボックス ボタンを含むツール バーの ID と等しい場合は、CMFCToolBar::ReplaceButtonを呼び出して、[ 検索 ] ボタン (つまり、コマンド IDID_EDIT_FINDのボタン) をCFindComboButtonオブジェクトに置き換えます。注
ReplaceButtonはボタン オブジェクトをコピーし、コピーを保持するため、スタック上にCFindComboBoxオブジェクトを作成できます。
[カスタマイズ] ダイアログ ボックスへの検索コントロールの追加
カスタマイズ ハンドラー OnViewCustomizeで、 CMFCToolBarsCustomizeDialog::ReplaceButton を呼び出して 、[検索 ] ボタン (つまり、コマンド ID ID_EDIT_FINDのボタン) を CFindComboButton オブジェクトに置き換えます。
こちらも参照ください
階層グラフの
クラス
CMFCToolBar クラスの
CMFCToolBarButton クラスの
CMFCToolBarComboBoxButton クラスの
CMFCToolBarsCustomizeDialog クラスの