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