テクニカル ノート 31: コントロール バー
更新 : 2007 年 11 月
メモ : |
---|
次のテクニカル ノートは、最初にオンライン ドキュメントの一部とされてから更新されていません。結果として、一部のプロシージャおよびトピックが最新でないか、不正になります。最新の情報について、オンライン ドキュメントのキーワードで関係のあるトピックを検索することをお勧めします。 |
ここでは MFC (Microsoft Foundation Class) のコントロール バー クラスである CControlBar、CStatusBar、CToolBar、CDialogBar、CDockBar について説明します。
CControlBar
ControlBar は CWnd の派生クラスで、次のような特徴があります。
フレーム ウィンドウの上端または下端に配置されます。
子コントロールとして HWND を使うコントロール (CDialogBar など) や HWND を使わないコントロール (CToolBar や CStatusBar など) を持つことができます。
コントロール バーには次に示すスタイルを指定できます。
CBRS_TOP (既定) コントロール バーを上端に固定します。
CBRS_BOTTOM コントロール バーを下端に固定します。
CBRS_NOALIGN 親ウィンドウのサイズが変更されても、コントロール バーの位置を変更しません。
CControlBar 派生クラスには、次のようなクラスがあります。
CStatusBar ステータス バー。テキストを表示するステータス バー ペインを持ちます。
CToolBar ツール バー。ビットマップ ボタン列を持ちます。
CDialogBar ツール バーに似たフレーム。Windows 標準コントロール (ダイアログ テンプレート リソースから生成) を持ちます。
CDockBar 他の CControlBar 派生オブジェクトとドッキングするために使用する汎用的な領域。このクラス固有のメンバ関数とメンバ変数は将来変更される予定です。
コントロール バー オブジェクトおよびウィンドウは、フレーム ウィンドウの子ウィンドウになります。通常、コントロール バー オブジェクトおよびウィンドウは、フレームのクライアント領域 (MDI クライアントやビュー) の兄弟オブジェクトとして作成されます。コントロール バーの子ウィンドウ ID 値を指定するときは注意が必要です。コントロール バーが既定の配置で動作するのは、コントロール バーの ID が AFX_IDW_CONTROLBAR_FIRST から AFX_IDW_CONTROLBAR_LAST の範囲に含まれている場合だけです。コントロール バー ID の取り得る値は 256 個ありますが、このうち最初の 32 個は印刷プレビュー処理で使用される特殊な ID です。
CControlBar クラスには、次の機能が用意されています。
コントロール バーをフレームの上下左右いずれかの端に固定できます。
コントロール アイテム配列を割り当てます。
派生クラスを作成できます。
通常、C++ コントロール バー オブジェクトは CFrameWnd 派生クラスのメンバとして埋め込まれ、親の HWND とオブジェクトが破棄されると同時に破棄されます。コントロール バー オブジェクトをヒープ上に割り当てるときは、m_bAutoDestruct メンバを TRUE に設定します。HWND が破棄されると、"delete this" によってコントロール バーも破棄されます。
メモ : |
---|
CStatusBar、CToolBar、CDialogBar などの MFC の派生クラスを使用せずに独自の CControlBar 派生クラスを作成する場合は、m_dwStyle データ メンバを設定する必要があります。この設定は、次のように Create のオーバーライドで行うことができます。 |
// CMyControlBar is derived from CControlBar
BOOL CMyControlBar::Create( CWnd* pParentWnd, DWORD dwStyle, UINT nID )
{
m_dwStyle = dwStyle;
.
.
.
}
コントロール バーの配置アルゴリズム
コントロール バーの配置アルゴリズムは単純です。フレーム ウィンドウは WM_SIZEPARENT メッセージをコントロール バーの範囲に含まれる ID を持つすべての子コントロールに送ります。このメッセージと共に、親のクライアント領域を示す四角形へのポインタが渡されます。このメッセージは Z オーダーで子コントロールへ送られます。子コントロール バーはこの情報に基づいて自分の配置を決定し、その分だけ親ウィンドウのクライアント領域を縮小します。最終的に通常のクライアント領域として残された部分 (コントロール バーを除いた部分) を表す四角形に、メイン クライアント ウィンドウ (MDI クライアント、ビュー、分割ウィンドウなど) が表示されます。
この詳細については、CWnd::RepositionBars と CFrameWnd::RecalcLayout を参照してください。
WM_SIZEPARENT は MFC のプライベート Windows メッセージです。詳細については、「テクニカル ノート 24: MFC で定義されているメッセージおよびリソース」を参照してください。
CStatusBar
ステータス バーはテキスト出力ペインを持つコントロール バーです。テキスト出力ペインには次の 2 種類の利用方法があります。
メッセージ行として使用
たとえば、標準メニュー ヘルプ メッセージ行がこれに該当します。通常、この種のペインは 0 から始まるインデックス番号で指定します。
標準インジケータとして使用
CAP、NUM、SCRL などのインジケータがこれに該当します。通常、この種のペインは文字列 ID やコマンド ID を使って指定します。
ステータス バーで使用されるフォントは MS Sans Serif 10 ポイントです。このフォントを使用することは『Windows Interface: An Application Design Guide』(Microsoft Corporation 著、Microsoft Press、1995) で規定されています。このフォントを指定しない場合は、フォント マップによって Swiss プロポーショナル フォント 10 ポイントが選択されます。ただし Windows の日本語バージョンなどでは、これ以外のフォントが使用されることがあります。
ステータス バーの中で使用される配色も『Windows Interface: An Application Design Guide』(Microsoft Corporation 著、Microsoft Press、1995) で規定されています。配色はプログラム中で直接指定せず、コントロール パネルのユーザー設定によって動的に変更できるようにします。
項目 |
Windows COLOR 値 |
既定の RGB |
---|---|---|
ステータス バーの背景 |
COLOR_BTNFACE |
RGB(192, 192, 192) |
ステータス バーの文字 |
COLOR_BTNTEXT |
RGB(000, 000, 000) |
ステータス バーの上辺と左辺 |
COLOR_BTNHIGHLIGHT |
RGB(255, 255, 255) |
ステータス バーの右辺と下辺 |
COLOR_BTNSHADOW |
RGB(128, 128, 128) |
CStatusBar の CCmdUI 処理
通常、インジケータは ON_UPDATE_COMMAND_UI 機構を通じて更新されます。アイドル時に、ステータス バーはインジケータ ペインの文字列 ID に対する ON_UPDATE_COMMAND_UI ハンドラを呼び出します。
ON_UPDATE_COMMAND_UI ハンドラでは次の関数を呼び出すことができます。
Enable: ペインを有効または無効に設定します。無効に設定されたペインの外観は有効に設定された場合と同じですが、インジケータ文字列が非表示になります。つまり、テキスト インジケータがオフになります。
SetText: 表示する文字列を変更します。ペインのサイズは自動的に調節されません。
CStatusBar の作成と API のカスタマイズの詳細については、『MFC ライブラリ リファレンス』の「CStatusBar クラス」を参照してください。通常は、初期化処理の中でステータス バーが表示される前にカスタマイズを行います。
ステータス バーは、サイズ調節可能なペインを 1 つしか持てません。通常これが先頭のペインです。実際には、このペインのサイズは最小サイズです。ただし、ステータス バーの幅がすべてのペインの合計サイズよりも大きい場合、余った幅はすべてこのサイズ調節可能なペインが使用します。ステータス バーを持つ既定のアプリケーションでは、先頭のペインのサイズを調節できるため、ステータス バーの右側に CAP、NUM、SCRL インジケータが配置されます。
CToolBar
ツール バーは、内部にビットマップ ボタン (区分線を含む) が配置されているコントロール バーです。ボタンのスタイルとしてプッシュ ボタンとチェック ボックス ボタンの 2 種類が使用できます。オプション ボタンのグループ機能はチェック ボックス ボタンと ON_UPDATE_COMMAND_UI によって実現できます。
ツール バー中に表示されるすべてのボタンは、1 個のビットマップによって描画されます。ビットマップ中には各ボタンを表すイメージや図形が描かれている必要があります。一般には、ビットマップ中のイメージや図形の配列がそのままの順序で画面上に描画されます。この配列順は API をカスタマイズすると変更できます。
各ボタンのサイズは統一する必要があります。既定のサイズは 24 × 22 ピクセルです。各ボタン中に表示されるイメージや図形のサイズも統一し、ビットマップ中では隣接して並べる必要があります。イメージや図形の既定のサイズは 16 × 15 ピクセルです。このため、10 個の (標準サイズの) ボタンを持つツール バー用には、横 160 ピクセル、縦 15 ピクセルのビットマップを用意する必要があります。
各ボタンはそれぞれ 1 つだけイメージや図形を持っています。ボタンの状態やスタイル (たとえば押された状態、通常の状態、押し込まれた状態、選択不可能な状態、選択不可能で押し込まれた状態、未確定状態など) はこのビットマップから計算によって作られます。カラー ビットマップや DIB は理論上は使用できません。ボタンの状態に合わせてビットマップを計算するアルゴリズムは、元のビットマップが灰色の陰影で表現されていることを前提に設計されています。ビットマップの例については、標準ツール バー ボタンや、MFC サンプル アプリケーション CLIPART のツール バー ボタン クリップアートを参照してください。
ツール バー中で使用される配色は『Windows Interface: An Application Design Guide』(Microsoft Corporation 著、Microsoft Press、1995) で規定されています。配色はプログラム中で直接指定せず、コントロール パネルのユーザー設定によって動的に変更できるようにします。
項目 |
Windows COLOR 値 |
既定の RGB |
---|---|---|
ツール バーの背景 |
COLOR_BTNFACE |
RGB(192,192,192) |
ツール バー ボタンの上辺と左辺 |
COLOR_BTNHIGHLIGHT |
RGB(255,255,255) |
ツール バー ボタンの右辺と下辺 |
COLOR_BTNSHADOW |
RGB(128,128,128) |
Windows の標準ボタン コントロールと同様に、ツール バーのビットマップ ボタンの配色が変更される場合があります。この変更は、ビットマップがリソースから読み込まれたときと、コントロール パネルのユーザー設定に従ってシステム カラーが変更されたときに起こります。ツール バー ビットマップに次の色が使用されていると、その色は自動的に変更されるので注意してください。ビットマップの配色を変更させない場合は、近似色 (RGB 値を少しだけ変更した色) を使用してください。RGB 値が次のリストの値に完全に一致する色は自動的に変化します。
RGB 値 |
動的に設定される COLOR 値 |
---|---|
RGB(000, 000, 000) |
COLOR_BTNTEXT |
RGB(128, 128, 128) |
COLOR_BTNSHADOW |
RGB(192, 192, 192) |
COLOR_BTNFACE |
RGB(255, 255, 255) |
COLOR_BTNHIGHLIGHT |
CToolBar の作成と API のカスタマイズについては、『MFC ライブラリ リファレンス』の「CToolBar」を参照してください。通常は、初期化処理の中でステータス バーが表示される前にカスタマイズを行います。
カスタマイズ用 API は、ボタン ID、スタイル、配置間隔を変更したり、ボタンの中に表示するイメージや図形を変更するときに行います。通常はこれらの API は必要ありません。
CToolBar の CCmdUI 処理
ツール バー ボタンは必ず ON_UPDATE_COMMAND_UI 機構を通じて更新されます。アイドル時に、そのボタンのコマンド ID に対する ON_UPDATE_COMMAND_UI ハンドラを呼び出します。ON_UPDATE_COMMAND_UI は区分線に対しては呼び出されず、プッシュ ボタンとチェック ボックス ボタンに対してだけ呼び出されます。
ON_UPDATE_COMMAND_UI ハンドラでは次の関数を呼び出すことができます。
Enable: ボタンを選択可能または選択不可能に設定します。この関数はプッシュ ボタンとチェック ボックス ボタンに対して同じように動作します。
SetCheck: ボタンのチェック状態を設定します。ツール バー ボタンに対してこの関数を呼び出すと、そのボタンはチェック ボックス ボタンに変更されます。SetCheck のパラメータ値には 0 (オフ)、1 (オン)、2 (不確定) のいずれかを設定できます。
SetRadio: SetCheck の簡略形です。
チェック ボックス ボタンは "自動の" ボタンです。ユーザーがこのボタンを押すと、直ちにボタンの状態が変化します。オン状態 (チェックが表示されている状態) はボタンが押された状態または押し続けられている状態に相当します。未確定状態を表示するためのユーザー インターフェイスは用意されていません。未確定状態が必要な場合は描画コードを直接作成する必要があります。
カスタマイズ用 API でも任意のツール バー ボタンの状態を変更できますが、ボタン状態の操作は、そのボタンに対するコマンドの ON_UPDATE_COMMAND_UI ハンドラの中で処理する必要があります。ツール バー ボタンの状態はアイドル処理の中で ON_UPDATE_COMMAND_UI ハンドラによって変更されるので、SetButtonStyle を使ってボタン状態を変更しても、次のアイドル処理が発生した時点で元に戻されてしまいます。
通常のボタンやメニュー コマンドと同じように、ツール バー ボタンは WM_COMMAND メッセージを送出します。このメッセージは ON_UPDATE_COMMAND_UI ハンドラと同じクラスの ON_COMMAND ハンドラによって処理されます。
ツール バー ボタンの状態 (TBBS_ 値) には次の 4 種類があります。状態によってボタンの表示が異なります。
TBBS_CHECKED: チェック ボックスがオンの (押し込まれた) 状態です。
TBBS_INDETERMINATE: チェック ボックスが未確定の状態です。
TBBS_DISABLED: ボタンが選択不可能な状態です。
TBBS_PRESSED: ボタンが押し続けられている状態です。
『Windows Interface: An Application Design Guide』(Microsoft Corporation 著、Microsoft Press、1995) で規定されているボタン状態は 6 種類あります。これらの状態は次の TBBS 値で表されます。
押されていない状態 = 0
押し続けられている状態 = TBBS_PRESSED (| <他のスタイル>)
選択不可能な状態 = TBBS_DISABLED
押し込まれている状態 = TBBS_CHECKED
押し込まれて選択不可能な状態 = TBBS_CHECKED | TBBS_DISABLED
未確定状態 = TBBS_INDETERMINATE
CDialogBar
ダイアログ バーは内部に Windows の標準コントロールが配置されたコントロール バーです。ダイアログ バーは内部のコントロールをダイアログ ボックスと同じように処理します。また Tab キーが押されると、フォーカスがコントロール間を移動します。ダイアログ テンプレートによってバーを表す点もダイアログ ボックスと同じです。
印刷プレビューのツール バーは CDialogBar を使って作成されています。このツール バーは標準プッシュ ボタン コントロールを持っています。
CDialogBar は CFormView と同じ方法で利用できます。ダイアログ バーを使用するには、ダイアログ テンプレートを用意する必要があります。また WS_CHILD 以外のスタイルは使用できません。ダイアログは非表示にしなければならないことに注意してください。
CDialogBar に対するコントロール通知は、ツール バー ボタンの場合と同じように、コントロール バーの親に送られます。
CDialogBar の CCmdUI 処理
ダイアログ バー ボタンは ON_UPDATE_COMMAND_UI ハンドラ機構を通じて更新する必要があります。アイドル時に、ダイアログ バーは、0x8000 以上の ID (コマンド ID の範囲に含まれる) を持つすべてのボタンに対するコマンド ID を指定して ON_UPDATE_COMMAND_UI ハンドラを呼び出します。
ON_UPDATE_COMMAND_UI ハンドラでは次の関数を呼び出すことができます。
Enable: ボタンを選択可能または選択不可能に設定します。
SetText: ボタン中に表示される文字列を変更します。
カスタマイズは標準ウィンドウ マネージャ API で行うことができます。