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