Share via


对 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
控件