ツール バーのドッキングとフローティング

Microsoft Foundation Class ライブラリは、ドッキング可能ツール バーをサポートしています。 ドッキング可能ツール バーは、その親ウィンドウの任意の辺にアタッチ (ドッキング) でき、また、独立したミニフレーム ウィンドウとしてデタッチ (フローティング) することができます。 この記事では、アプリケーションにおけるドッキング可能ツール バーの使い方について説明します。

アプリケーション ウィザードを使用してアプリケーションのスケルトンを生成する場合、ドッキング可能ツール バーを希望するかどうかを選ぶよう求められます。 既定では、アプリケーションにドッキング可能ツール バーを配置するために必要な 3 つのアクションを実行するコードがアプリケーション ウィザードによって生成されます。

この中のどのステップが欠けていても、アプリケーションには標準ツール バーが表示されます。 最後の 2 つの手順は、アプリケーションのドッキング可能なツール バーごとに実行する必要があります。

また、この記事では次のトピックについても取り上げます。

例については、MFC のサンプル (一般) の DOCKTOOL を参照してください。

フレーム ウィンドウでドッキングを有効にする

ツール バーをフレーム ウィンドウにドッキングするには、フレーム ウィンドウ (つまりドッキング先) がドッキングを許可する設定になっている必要があります。 これは CFrameWnd::EnableDocking 関数を使用して行います。この関数は、DWORD パラメーターを 1 つ受け取ります。一連のスタイル ビットで、ドッキングを受け付けるフレーム ウィンドウの辺を指定します。 ツール バーがドッキングされようとしているとき、ドッキング可能な辺が複数ある場合、EnableDocking のパラメーターで指定された辺が、上、下、左、右の順で使用されます。 コントロール バーを任意の辺にドッキングできるようにしたい場合は、EnableDockingCBRS_ALIGN_ANY を渡します。

ツール バーのドッキングを有効にする

ドッキング先を準備したら、同じようにしてツール バー (ドッキング元) を準備する必要があります。 ドッキングしたい各ツール バーについて CControlBar::EnableDocking を呼び出し、ツール バーのドッキング先となる辺を指定します。 CControlBar::EnableDocking の呼び出しで指定したどの辺も、フレーム ウィンドウでドッキングが有効になっている辺と一致しない場合、ツール バーはドッキングできず、フローティング状態になります。 いったんフローティング状態になったツール バーはフリー ツール バーとなり、フレーム ウィンドウにドッキングすることはできません。

ツール バーを常にフローティング状態にするのが目的の効果である場合は、パラメーターに 0 を指定して EnableDocking を呼び出してください。 そのうえで、CFrameWnd::FloatControlBar を呼び出します。 ツール バーは常時、フローティング状態となり、どこにもドッキングすることはできません。

ツール バーをドッキングする

ドッキングが許可されているフレーム ウィンドウのいずれかの辺にユーザーがツール バーをドロップしようとすると、フレームワークによって CFrameWnd::DockControlBar が呼び出されます。

また、この関数は、コントロール バーをフレーム ウィンドウにドッキングする目的で開発者がいつでも呼び出すことができます。 通常は、初期化中に行います。 フレーム ウィンドウの特定の辺に対し、複数のツール バーをドッキングすることができます。

ツール バーをフローティングする

ドッキング可能ツール バーをフレーム ウィンドウからデタッチすることを " ツール バーをフローティングする" といいます。 そのためには、CFrameWnd::FloatControlBar を呼び出します。 フローティングするツール バーとその位置、そして、フリー ツール バーを縦にするか横にするかを決定する配置スタイルを指定してください。

ユーザーがツール バーをそのドッキング位置からドラッグし、ドッキングが有効になっていない場所にドロップすると、この関数がフレームワークによって呼び出されます。 これはフレーム ウィンドウの内外のどこでもかまいません。 DockControlBar と同様、この関数は初期化中に呼び出すこともできます。

MFC 実装によるドッキング可能ツール バーには、ドッキング可能ツール バーをサポートする一部のアプリケーションで見られる拡張機能のいくつかが備わっていません。 カスタマイズ可能なツール バーなどの機能は提供されません。

ツール バーのサイズを動的に変更する

Visual C++ バージョン 4.0 以降では、フリー ツール バーのサイズを動的に変更する機能をアプリケーションのユーザーに提供できます。 通常、ツール バーは長い直線的な形状をしていて、水平方向に表示されます。 ただし、ツール バーの向きとその形状は変更できます。 たとえば、フレーム ウィンドウの左右いずれかの側面にユーザーがツール バーをドッキングすると、その形状が垂直レイアウトに変わります。 複数行のボタンを含んだ四角形となるようにツール バーの形状を変更することもできます。

以下のことを行えます。

  • ツール バーの特性として動的サイズ設定を指定します。

  • ツール バーの特性として固定サイズ設定を指定します。

これをサポートするために、CToolBar::Create メンバー関数の呼び出しで使用するツール バー スタイルが新たに 2 つ用意されています。 これらは次のとおりです。

  • CBRS_SIZE_DYNAMIC: コントロール バーは動的になります。

  • CBRS_SIZE_FIXED: コントロール バーは固定になります。

動的なサイズ スタイルを使用すると、ツール バーのフローティング中は、そのサイズをユーザーが変更できますが、ドッキング中は変更できません。 ユーザーによってツール バーの端がドラッグされ、形状を変更する必要が生じると、ツール バーは "折り返し" ます。

サイズ固定のスタイルでは、ツール バーの折り返し状態が維持され、各列のボタンの位置が固定されます。 アプリケーションのユーザーがツール バーの形状を変更することはできません。 ツール バーの折り返しは、ボタン間の区切りの位置など、指定された位置で行われます。 ツール バーがドッキングされているかフローティング状態であるかに関係なく、その形状が維持されます。 複数列のボタンが固定的に並んだパレットのように見えます。

CToolBar::GetButtonStyle を使用して、ツール バー上のボタンの状態とスタイルを取得することもできます。 ボタンの見え方やユーザー入力への反応は、ボタンのスタイルによって決まります。一方、ボタンが折り返されているかどうかは、その状態によって識別されます。

固定スタイルのツール バーの折り返し位置を設定する

サイズ固定スタイルのツール バーでは、その折り返し位置のボタンのインデックスを指定します。 次のコードは、メイン フレーム ウィンドウの OnCreate オーバーライドでこれを行う方法を示しています。

// Get the style of the first button separator
UINT nStyle = m_wndToolBar.GetButtonStyle(3);
// Augment the state for wrapping
nStyle |= TBBS_WRAPPED;
m_wndToolBar.SetButtonStyle(3, nStyle);

// Do the same for other wrap locations ...

// Set the bar style to size fixed
m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
   CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_FIXED);

// Call docking/floating functions as needed ...

MFC のサンプル (一般) の DOCKTOOL には、CControlBar クラスと CToolBar クラスのメンバー関数を使用してツール バーの動的レイアウトを管理する方法が紹介されています。 DOCKTOOL の EDITBAR.CPP ファイルを参照してください。

さらに詳しい情報

関連項目

MFC ツール バーの実装