次の方法で共有


TN031: コントロール バー

次のテクニカル ノートは、最初にオンライン ドキュメントに含まれてから更新されていません。 その結果、一部の手順やトピックが古くなっているか、正しくない可能性があります。 最新情報については、オンライン ドキュメント インデックスで関心のあるトピックを検索することをお勧めします。

このメモでは、MFC のコントロール バー クラス (一般的な CControlBar、CStatusBarCToolBarCDialogBar、およびCDockBar) について説明します。

CControlBar

ControlBarは、次のCWnd派生クラスです。

  • フレーム ウィンドウの上部または下部に配置されます。

  • HWND ベースのコントロール ( CDialogBar など) またはHWND 以外の項目 ( CToolBarCStatusBarなど) である子項目を含む場合があります。

コントロール バーでは、追加のスタイルがサポートされています。

  • CBRS_TOP (既定値) コントロール バーを上部にピン留めします。

  • CBRS_BOTTOMコントロール バーを下部にピン留めします。

  • CBRS_NOALIGN 親のサイズを変更するときにコントロール バーの位置を変更しないでください。

CControlBarから派生したクラスは、より興味深い実装を提供します。

  • CStatusBar ステータス バーは、アイテムがテキストを含むステータス バー ペインです。

  • CToolBar ツールバーでは、項目は行に配置されたビットマップ ボタンです。

  • CDialogBar 標準のウィンドウ コントロール (ダイアログ テンプレート リソースから作成) を含むツール バーに似たフレーム。

  • CDockBar 他の CControlBar 派生オブジェクトの一般化されたドッキング領域。 このクラスで使用できる特定のメンバー関数と変数は、将来のリリースで変更される可能性があります。

すべてのコントロール バー オブジェクト/ウィンドウは、一部の親フレーム ウィンドウの子ウィンドウになります。 通常、これらは、フレームのクライアント領域 (MDI クライアントやビューなど) に兄弟として追加されます。 コントロール バーの子ウィンドウ ID が重要です。 コントロール バーの既定のレイアウトは、AFX_IDW_CONTROLBAR_FIRSTからAFX_IDW_CONTROLBAR_LASTまでの範囲の ID を持つコントロール バーに対してのみ機能します。 256 個のコントロール バー ID の範囲がある場合でも、これらのコントロール バー ID の最初の 32 個は、印刷プレビュー アーキテクチャで直接サポートされているため、特別であることに注意してください。

CControlBar クラスは、次の標準実装を提供します。

  • コントロール バーをフレームの上部、下部、または両側に配置します。

  • コントロール項目配列の割り当て。

  • 派生クラスの実装をサポートします。

C++ コントロール バー オブジェクトは、通常、 CFrameWnd 派生クラスのメンバーとして埋め込まれます。親 HWND とオブジェクトが破棄されるとクリーンアップされます。 ヒープにコントロール バー オブジェクトを割り当てる必要がある場合は、m_bAutoDestruct メンバーを TRUE に設定するだけで、HWNDが破棄されたときにコントロール バーがdelete this;呼び出されるようにすることができます。

、、など、MFC の派生クラスのいずれかを使用するのではなく、独自の派生クラスを作成する場合は、m_dwStyle データ メンバーを設定する必要があります。 これは、 Createのオーバーライドで行うことができます。

// CMyControlBar is derived from CControlBar
BOOL CMyControlBar::Create(CWnd* pParentWnd,
    DWORD dwStyle,
    UINT nID)
{
    m_dwStyle = dwStyle;

.
.
.
}

コントロール バー レイアウト アルゴリズム

コントロール バーのレイアウト アルゴリズムは非常に単純です。 フレーム ウィンドウは、コントロール バー範囲内のすべての子にWM_SIZEPARENTメッセージを送信します。 このメッセージと共に、親のクライアントの四角形へのポインターが渡されます。 このメッセージは、子に Z オーダーで送信されます。 コントロール バーの子は、この情報を使用して自分自身を配置し、親のクライアント領域のサイズを小さくします。 通常のクライアント領域 (コントロール バーが少ない) に残っている最終的な四角形は、メイン クライアント ウィンドウ (通常は MDI クライアント、ビュー、または分割ウィンドウ) を配置するために使用されます。

詳細については、 CWnd::RepositionBarsCFrameWnd::RecalcLayout を参照してください。

WM_SIZEPARENTを含む MFC プライベート Windows メッセージについては、 テクニカル ノート 24 を参照してください。

CStatusBar

ステータス バーは、テキスト出力ペインの行を含むコントロール バーです。 テキスト出力ウィンドウを使用するには、次の 2 つの一般的な方法があります。

  • メッセージ行として

    (標準メニューのヘルプ メッセージ行など)。 これらは通常、0 から始まるインデックス付き

  • 状態インジケーターとして

    (CAP、NUM、SCRL インジケーターなど)。 これらは通常、文字列/コマンド ID によってアクセスされます。

ステータス バーのフォントは 10 ポイントの MS Sans Serif です (Windows インターフェイス アプリケーション デザイン ガイドまたはフォント マッパーは、10 ポイントのスイスのプロポーショナル フォントに最も一致します)。 特定のバージョンの Windows (日本語版など) では、選択されているフォントが異なります。

ステータス バーで使用される色も、Windows インターフェイス アプリケーション設計ガイドの推奨事項と一致しています。 これらの色はハード コーディングされておらず、コントロール パネルでのユーザーのカスタマイズに応じて動的に変更されます。

アイテム 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 の詳細については、「クラス ライブラリ リファレンス」の CStatusBar クラスを参照してください。 ステータス バーのほとんどのカスタマイズは、ステータス バーが最初に表示される前に行う必要があります。

ステータス バーでは、1 つのストレッチ ウィンドウ (通常は最初のペイン) のみがサポートされます。 このウィンドウのサイズは、実際には最小サイズです。 ステータス バーがすべてのペインの最小サイズより大きい場合は、追加の幅がストレッチ ウィンドウに与えられます。 ステータス バーを持つ既定のアプリケーションには、最初のウィンドウが拡大されているため、CAP、NUM、SCRL の右揃えインジケーターがあります。

CToolBar

ツールバーは、区切り記号を含むビットマップ ボタンの行を含むコントロール バーです。 ボタンの 2 つのスタイルがサポートされています。プッシュ ボタンとチェック ボックス ボタンです。 ラジオ グループ機能は、チェック ボックス ボタンとON_UPDATE_COMMAND_UIを使用して構築できます。

ツール バーのすべてのビットマップ ボタンは、1 つのビットマップから取得されます。 このビットマップには、ボタンごとに 1 つの画像またはグリフが含まれている必要があります。 通常、ビットマップ内のイメージ/グリフの順序は、画面上で描画される順序と同じです。 (これはカスタマイズ API を使用して変更できます)。

各ボタンは同じサイズにする必要があります。 既定値は標準の 24 x 22 ピクセルです。 各イメージ/グリフは同じサイズで、ビットマップ内で並べて表示する必要があります。 既定の画像/グリフ サイズは 16 x 15 ピクセルです。 したがって、(標準サイズを使用して) 10 個のボタンがあるツール バーの場合は、幅 160 ピクセル、高さ 15 ピクセルのビットマップが必要です。

各ボタンには 1 つだけの画像/グリフがあります。 さまざまなボタンの状態とスタイル (押された、上、下、無効、無効、不確定など) は、その 1 つの画像/グリフからアルゴリズムによって生成されます。 理論上、任意のカラー ビットマップまたは DIB を使用できます。 元の画像が灰色の網掛けである場合、さまざまなボタンの状態を生成するためのアルゴリズムが最適です。 たとえば、MFC General サンプル CLIPART で提供されている標準のツール バー ボタンとツール バー ボタン のクリップアート を確認します。

ツール バーで使用される色も、Windows インターフェイス アプリケーション 設計ガイドの推奨事項と一致しています。 これらの色はハード コーディングされておらず、コントロール パネルでのユーザーのカスタマイズに応じて動的に変更されます。

アイテム Windows COLOR 値 既定の RGB
ToolBar の背景 COLOR_BTNFACE RGB(192,192,192)
ToolBar ボタンの上端または左端 COLOR_BTNHIGHLIGHT RGB(255,255,255)
ToolBar ボタン ボット/右端 COLOR_BTNSHADOW RGB(128,128,128)

さらに、ツール バーのビットマップ ボタンは、標準の Windows ボタン コントロールであるかのように色が変更されます。 この色変更は、ビットマップがリソースから読み込まれ、コントロール パネルでのユーザーのカスタマイズに応じてシステムの色の変更に応じて発生します。 ツール バー ビットマップの次の色は自動的に色変更されるため、慎重に使用する必要があります。 ビットマップの一部の色を変更しない場合は、マップされた RGB 値の 1 つに近い色を使用します。 マッピングは、正確な 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 とカスタマイズ API の詳細については、クラス 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の短縮形。

チェック ボックス ボタンは "AUTO" チェック ボックス ボタンです。つまり、ユーザーが押すと、すぐに状態が変更されます。 チェックはダウン状態または押し下げ状態です。 ボタンを "不確定" 状態に変更するユーザー インターフェイスの組み込み方法はありません。コードを使用して実行する必要があります。

カスタマイズ API を使用すると、特定のツール バー ボタンの状態を変更できます。ツール バー ボタンが表すコマンドのON_UPDATE_COMMAND_UI ハンドラーでこれらの状態を変更することをお勧めします。 アイドル処理では、ON_UPDATE_COMMAND_UI ハンドラーを使用してツール バー ボタンの状態が変更されるため、SetButtonStyle を使用して行われたこれらの状態に対する変更は、次のアイドル状態の後に失われる可能性があります。

ツール バー ボタンは、通常のボタンやメニュー項目などのWM_COMMANDメッセージを送信し、通常は、ON_UPDATE_COMMAND_UI ハンドラーを提供する同じクラスのON_COMMAND ハンドラーによって処理されます。

表示状態には、次の 4 つのツール バー ボタン スタイル (TBBS_値) が使用されます。

  • TBBS_CHECKED: チェック ボックスは現在オン (ダウン) です。

  • TBBS_INDETERMINATE: チェック ボックスは現在不確定です。

  • TBBS_DISABLED: ボタンは現在無効になっています。

  • TBBS_PRESSED: ボタンは現在押されています。

6 つの公式 Windows インターフェイス アプリケーション デザイン ガイド ボタン のスタイルは、次の TBBS 値で表されます。

  • Up = 0

  • マウス ダウン = TBBS_PRESSED (| その他のスタイル)

  • Disabled = TBBS_DISABLED

  • Down = TBBS_CHECKED

  • 無効 = TBBS_CHECKED |TBBS_DISABLED

  • 不確定 = TBBS_INDETERMINATE

CDialogBar

ダイアログ バーは、標準の Windows コントロールを含むコントロール バーです。 コントロールを含み、それらの間のタブをサポートするという点で、ダイアログのように機能します。 また、ダイアログ テンプレートを使用してバーを表すという点でも、ダイアログのように機能します。

CDialogBarは、標準の押ボタン コントロールを含む印刷プレビュー ツール バーに使用されます。

CDialogBarの使用は、CFormViewの使用に似ています。 ダイアログ バーのダイアログ テンプレートを定義し、WS_CHILD以外のすべてのスタイルを削除する必要があります。 ダイアログボックスを表示することはできません。

CDialogBarのコントロール通知は、(ツール バー ボタンと同様に) コントロール バーの親に送信されます。

CDialogBar の CCmdUI サポート

ダイアログ バーのボタンは、ON_UPDATE_COMMAND_UI ハンドラー メカニズムを使用して更新する必要があります。 アイドル時に、ダイアログ バーは、ID >= 0x8000 (つまり、コマンド ID の範囲内) を持つすべてのボタンのコマンド ID を使用して、ON_UPDATE_COMMAND_UI ハンドラーを呼び出します。

ON_UPDATE_COMMAND_UI ハンドラーは次を呼び出すことができます。

  • 有効: ボタンを有効または無効にします。

  • SetText: ボタンのテキストを変更します。

カスタマイズは、標準のウィンドウ マネージャー API を使用して行うことができます。

こちらも参照ください

番号別テクニカル ノート
カテゴリ別テクニカル ノート