次の方法で共有


チュートリアル: ツール バーにコントロールを配置する

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

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

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

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

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

  3. AFX_WM_RESETTOOLBAR メッセージを処理するメッセージ ハンドラーで、次の手順を実行します。

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

    2. CMFCToolBar::ReplaceButtonを使用して、ダミー ボタンを新しいコントロールに置き換えます。 ReplaceButtonはボタン オブジェクトをコピーし、コピーを保持するため、スタック上にボタン オブジェクトを作成できます。

アプリケーションでカスタマイズを有効にした場合は、[カスタマイズ] ダイアログ ボックスの [ツール バー] タブの [リセット] ボタンを使用してツール バーをリセットし、再コンパイル後にアプリケーションで更新されたコントロールを表示する必要がある場合があります。 ツール バーの状態は Windows レジストリに保存され、アプリケーションの起動時に ReplaceButton メソッドが実行された後にレジストリ情報が読み込まれ、適用されます。

ツール バー コントロールとカスタマイズ

[カスタマイズ] ダイアログ ボックスの [コマンド] タブには、アプリケーションで使用できるコマンドの一覧が表示されます。 既定では、[ カスタマイズ ] ダイアログ ボックスはアプリケーション メニューを処理し、各メニュー カテゴリの標準ツール バー ボタンの一覧を作成します。 ツール バー コントロールが提供する拡張機能を維持するには、[ カスタマイズ ] ダイアログ ボックスの標準ツール バー ボタンをカスタム コントロールに置き換える必要があります。

カスタマイズを有効にする場合は、CMFCToolBarsCustomizeDialogクラス クラスを使用して、カスタマイズ ハンドラー OnViewCustomizeで [カスタマイズ] ダイアログ ボックスを作成します。 CMFCToolBarsCustomizeDialog::Createを呼び出して [カスタマイズ] ダイアログ ボックスを表示する前に、CMFCToolBarsCustomizeDialog::ReplaceButtonを呼び出して、標準ボタンを新しいコントロールに置き換えます。

例: 検索コンボ ボックスを作成する

このセクションでは、ツール バーに表示され、最近使用した検索文字列を含む 検索 コンボ ボックス コントロールを作成する方法について説明します。 ユーザーは、コントロールに文字列を入力し、Enter キーを押してドキュメントを検索するか、エスケープ キーを押してフォーカスをメイン フレームに戻すことができます。 次の使用例は、ドキュメントが CEditView クラス派生ビューに表示されることを前提としています。

検索コントロールの作成

まず、[ 検索 ] コンボ ボックス コントロールを作成します。

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

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

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

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

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

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

  3. CFindComboBox クラスで、PreTranslateMessage仮想メソッドをオーバーライドします。 このメソッドは、コンボ ボックスで WM_KEYDOWN メッセージを処理できるようにします。 ユーザーがエスケープ キー (VK_ESCAPE) にヒットした場合は、フォーカスをメイン フレーム ウィンドウに戻します。 ユーザーが Enter キー (VK_ENTER) にヒットした場合は、メイン フレーム ウィンドウに、ID_EDIT_FIND_COMBO コマンド ID を含むWM_COMMAND メッセージを投稿します。

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

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

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

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

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

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

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

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

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

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

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

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

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

  2. AFX_WM_RESETTOOLBAR ハンドラーで、ツール バー ID、つまり、AFX_WM_RESETTOOLBAR メッセージのWPARAMを調べます。 ツール バー ID が [ 検索 ] コンボ ボックス ボタンを含むツール バーの ID と等しい場合は、 CMFCToolBar::ReplaceButton を呼び出して、[ 検索 ] ボタン (つまり、コマンド ID ID_EDIT_FINDのボタン) を CFindComboButton オブジェクトに置き換えます。

    ReplaceButtonはボタン オブジェクトをコピーし、コピーを保持するため、スタック上にCFindComboBox オブジェクトを作成できます。

[カスタマイズ] ダイアログ ボックスへの検索コントロールの追加

カスタマイズ ハンドラー OnViewCustomizeで、 CMFCToolBarsCustomizeDialog::ReplaceButton を呼び出して 、[検索 ] ボタン (つまり、コマンド ID ID_EDIT_FINDのボタン) を CFindComboButton オブジェクトに置き換えます。

こちらも参照ください

階層グラフの
クラス
CMFCToolBar クラスの
CMFCToolBarButton クラスの
CMFCToolBarComboBoxButton クラスの
CMFCToolBarsCustomizeDialog クラスの