チュートリアル: ツール バーへのコントロールの追加

このアーティクルでは、Windows コントロールを含むツールバー ボタンをツールバーに追加する方法を説明します。 MFC では、ツールバーボタンは、CMFCToolBarComboBoxButton クラスCMFCToolBarEditBoxButton クラスCMFCDropDownToolbarButton クラスCmfctoolbarmenubutton クラスなど、CMFCToolBarButton クラスの派生クラスである必要があります。

ツール バーへのコントロールの追加

ツール バーにコントロールを追加するには、次の手順を実行します。

  1. 親ツール バー リソースでボタンのダミー リソース ID を予約します。 Visual Studio でツールバー エディターを使用してボタンを作成する方法の詳細は、ツールバー エディターを参照してください。

  2. 親ツール バーのすべてのビットマップでボタンのツール バー イメージ (ボタン アイコン) を予約します。

  3. AFX_WM_RESETTOOLBAR メッセージを処理するメッセージ ハンドラーで、次の操作を行います。

    1. CMFCToolbarButton 派生クラスを使用して、ボタン コントロールを作成します。

    2. 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] コンボ ボックス コントロールを作成します。

  1. アプリケーション リソースにボタンとコマンドを追加します。

    1. アプリケーション リソースで、ID_EDIT_FIND コマンド ID を持つ新しいボタンをアプリケーションのツール バー、およびツール バーに関連付けられたビットマップに追加します。

    2. ID_EDIT_FIND コマンド ID を使用して、新しいメニュー項目を作成します。

    3. 新しい文字列 "Find the text\nFind" を文字列テーブルに追加し、ID_EDIT_FIND_COMBO コマンド ID を割り当てます。 このコマンド ID は、[Find] コンボ ボックス ボタンのコマンド ID として使用されます。

      Note

      ID_EDIT_FINDCEditView によって処理される標準のコマンドであるため、このコマンド用の特別なハンドラーを実装する必要はありません。 ただし、新しいコマンド ID_EDIT_FIND_COMBO のハンドラーを実装する必要があります。

  2. CComboBox Class から派生した新しいクラス CFindComboBox を作成します。

  3. CFindComboBox クラスで、PreTranslateMessage 仮想メソッドをオーバーライドします。 このメソッドにより、コンボ ボックスは WM_KEYDOWN メッセージを処理できます。 ユーザーが Esc キーを押す (VK_ESCAPE) と、フォーカスがメイン フレーム ウィンドウに戻ります。 ユーザーが Enter キーを押す (VK_ENTER) と、WM_COMMAND コマンド ID を含む ID_EDIT_FIND_COMBO メッセージがメイン フレーム ウィンドウにポストされます。

  4. CMFCToolBarComboBoxButton クラスから派生した [Find] コンボ ボックス ボタンのクラスを作成します。 この例では、それには CFindComboButton という名前が付いています。

  5. CMFCToolbarComboBoxButton のコンストラクターは、3 つのパラメーター (ボタンのコマンド ID、ボタン イメージのインデックス、およびコンボ ボックスのスタイル) を受け取ります。 これらのパラメーターを次のように設定します。

    1. ID_EDIT_FIND_COMBO をコマンド ID として渡します。

    2. ID_EDIT_FINDCCommandManager::GetCmdImage を使用して、イメージのインデックスを取得します。

    3. 使用可能なコンボ ボックス スタイルの一覧は、コンボ ボックス スタイルを参照してください。

  6. CFindComboButton クラスで、CMFCToolbarComboBoxButton::CreateCombo メソッドをオーバーライドします。 ここで、CFindComboButton オブジェクトを作成し、オブジェクトへのポインターを返す必要があります。

  7. IMPLEMENT_SERIAL マクロを使用して、コンボ ボタンを持続させることができます。 ワークスペース マネージャーは、ボタンの状態を自動的に読み込み、Windows レジストリに保存します。

  8. ドキュメント ビューで ID_EDIT_FIND_COMBO ハンドラーを実装します。 すべての [Find] コンボ ボックス ボタンを取得するには、ID_EDIT_FIND_COMBOCMFCToolBar::GetCommandButtons を使用します。 カスタマイズにより、同じコマンド ID を持つ複数のボタンが存在する可能性があります。

  9. ID_EDIT_FINDメッセージ ハンドラー OnFindで、CMFCToolBar::IsLastCommandFromButton を使用して、検索コマンドが [Find] コンボ ボックス ボタンから送信されたかを確認します。 該当する場合は、テキストを検索し、検索文字列をコンボ ボックスに追加します。

メイン ツール バーへの Find コントロールの追加

ツール バーにコンボ ボックス ボタンを追加するには、次の手順を実行します。

  1. メイン フレーム ウィンドウに AFX_WM_RESETTOOLBAR メッセージ ハンドラー OnToolbarReset を実装します。

    Note

    アプリケーションの起動中にツール バーが初期化されたとき、またはカスタマイズ中にツール バーがリセットされたときに、フレームワークはこのメッセージをメイン フレーム ウィンドウに送信します。 どちらの場合も、標準のツールバー ボタンをカスタム [Find] コンボ ボックス ボタンに置き換える必要があります。

  2. 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 クラス