「鉄筋コントロールとバンド」で説明したように、各バンドには子ウィンドウ (またはコントロール) を 1 つだけ含めることができます。 バンドごとに複数の子ウィンドウを使用する場合は、この制限が発生する可能性があります。 便利な回避策は、複数のコントロールを含むダイアログ バー リソースを作成し、鉄筋コントロールに鉄筋バンド (ダイアログ バーを含む) を追加することです。
通常、ダイアログ バーのバンドを透明に表示する場合は、ダイアログ バー オブジェクトのWS_EX_TRANSPARENT拡張スタイルを設定します。 ただし、WS_EX_TRANSPARENTにはダイアログ バーの背景を適切に描画する際にいくつかの問題があるため、目的の効果を得るには少し余分な作業を行う必要があります。
次の手順では、WS_EX_TRANSPARENT拡張スタイルを使用せずに透明度を実現するために必要な手順について詳しく説明します。
鉄筋バンドに透明なダイアログ バーを実装するには
[ クラスの追加] ダイアログ ボックスを使用して、ダイアログ バー オブジェクトを実装する新しいクラス (
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 メッセージを親ウィンドウに転送し、ダイアログ バー オブジェクトが移動されるたびに強制的に再描画することで、ダイアログ バーの透明度をシミュレートします。