Rebar コントロールでのダイアログ バーの使い方
更新 : 2007 年 11 月
「Rebar コントロールとバンド」で説明したように、各バンドには 1 つしか子ウィンドウ (コントロール) を含むことができません。各バンドに複数の子ウィンドウを含めたい場合は、この点が制約になります。代替手段として便利な方法は、複数のコントロールを持つダイアログ バー リソースを作成し、そのダイアログ バーを含む Rebar バンドを Rebar コントロールに追加することです。
ダイアログ バー バンドを透明にするには、通常、ダイアログ バー オブジェクトに拡張スタイル WS_EX_TRANSPARENT を設定します。ただし、WS_EX_TRANSPARENT を使うとダイアログ バーの背景が適切に描画されないため、多少の追加作業が必要になります。
WS_EX_TRANSPARENT 拡張スタイルを使用せずに透明にする手順を次に示します。
Rebar バンドで透過的なダイアログ バーを実装するには
「MFC クラスの追加 」に記述されている説明に従って、ダイアログ バー オブジェクトを実装する新しいクラス (たとえば CMyDlgBar) を追加します。
WM_ERASEBKGND メッセージのハンドラを追加します。
このハンドラの既存のコードを次のように変更します。
BOOL CMyDlgBar::OnEraseBkgnd(CDC* pDC) { CWnd* pParent = GetParent(); ASSERT_VALID(pParent); CPoint pt(0, 0); MapWindowPoints(pParent, &pt, 1); pt = pDC->OffsetWindowOrg(pt.x, pt.y); LRESULT lResult = pParent->SendMessage(WM_ERASEBKGND, (WPARAM)pDC->m_hDC, 0L); pDC->SetWindowOrg(pt.x, pt.y); return (BOOL)lResult; }
WM_MOVE メッセージのハンドラを追加します。
このハンドラの既存のコードを次のように変更します。
void CMyDlgBar::OnMove(int x, int y) { UNREFERENCED_PARAMETER(x); UNREFERENCED_PARAMETER(y); Invalidate(); }
新しいハンドラによって、ダイアログ バーの透過性がシミュレートされます。つまり、ダイアログ バー オブジェクトが移動するたびに、WM_ERASEBKGND メッセージが親ウィンドウに転送され、オブジェクトが再描画されます。