次の方法で共有


Rebar コントロールでのダイアログ バーの使い方

更新 : 2007 年 11 月

Rebar コントロールとバンド」で説明したように、各バンドには 1 つしか子ウィンドウ (コントロール) を含むことができません。各バンドに複数の子ウィンドウを含めたい場合は、この点が制約になります。代替手段として便利な方法は、複数のコントロールを持つダイアログ バー リソースを作成し、そのダイアログ バーを含む Rebar バンドを Rebar コントロールに追加することです。

ダイアログ バー バンドを透明にするには、通常、ダイアログ バー オブジェクトに拡張スタイル WS_EX_TRANSPARENT を設定します。ただし、WS_EX_TRANSPARENT を使うとダイアログ バーの背景が適切に描画されないため、多少の追加作業が必要になります。

WS_EX_TRANSPARENT 拡張スタイルを使用せずに透明にする手順を次に示します。

Rebar バンドで透過的なダイアログ バーを実装するには

  1. MFC クラスの追加 」に記述されている説明に従って、ダイアログ バー オブジェクトを実装する新しいクラス (たとえば CMyDlgBar) を追加します。

  2. WM_ERASEBKGND メッセージのハンドラを追加します。

  3. このハンドラの既存のコードを次のように変更します。

    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;
    }
    
  4. WM_MOVE メッセージのハンドラを追加します。

  5. このハンドラの既存のコードを次のように変更します。

    void CMyDlgBar::OnMove(int x, int y)
    {
       UNREFERENCED_PARAMETER(x);
       UNREFERENCED_PARAMETER(y);
    
       Invalidate();
    }
    

新しいハンドラによって、ダイアログ バーの透過性がシミュレートされます。つまり、ダイアログ バー オブジェクトが移動するたびに、WM_ERASEBKGND メッセージが親ウィンドウに転送され、オブジェクトが再描画されます。

参照

概念

コントロール (MFC)

参照

CReBarCtrl の使い方