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

Rebar コントロールとバンド」で説明したように、各バンドには子ウィンドウ (またはコントロール) を 1 つだけ含めることができます。 これは、1 つのバンドに複数の子ウィンドウを含める必要がある場合には制限となります。 便利な回避策として、複数のコントロールを含むダイアログ バー リソースを作成し、rebar コントロールに、(ダイアログ バーを含む) rebar バンドを追加する方法があります。

通常、ダイアログ バーのバンドを透明にする場合は、ダイアログ バー オブジェクトの WS_EX_TRANSPARENT 拡張スタイルを設定します。 ただし、WS_EX_TRANSPARENT には、ダイアログ バーの背景を適切に描画するうえでいくつかの問題があるため、必要な効果を実現するために、少し余分な作業を行う必要があります。

次の手順では、WS_EX_TRANSPARENT 拡張スタイルを使用せずに透明度を実現するために必要な手順について説明します。

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

  1. [クラスの追加] ダイアログ ボックスを使用して、ダイアログ バー オブジェクトを実装する新しいクラス (例: 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 メッセージを親ウィンドウに転送し、ダイアログ バー オブジェクトが移動されるたびに強制的に再描画することによって、ダイアログ バーの透明度をシミュレートします。

関連項目

CReBarCtrl の使い方
コントロール