使用Rebar控件的一个对话栏

按照 Rebar 控件和带区所述,每个带区只能包含一个子窗口 (或控件)。 ,如果要有多每个带区,一个子窗口这可能是限制。 一种方便工作区由多个控件创建对话栏资源然后添加 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

概念

控件(MFC)