如 Rebar 控件和带区中所述,每个带只能包含一个子窗口(或控件)。 如果希望每个带具有多个子窗口,这可能是一个限制。 一种方便的解决方法是创建具有多个控件的对话框栏资源,然后将一个 rebar 带(包含对话框栏)添加到 rebar 控件。
通常,如果希望对话框栏带显示为透明,则设置对话栏对象的WS_EX_TRANSPARENT扩展样式。 但是,由于WS_EX_TRANSPARENT在正确绘制对话栏背景方面存在一些问题,因此需要做一些额外的工作才能达到所需的效果。
以下过程详细介绍了在不使用WS_EX_TRANSPARENT扩展样式的情况下实现透明度所需的步骤。
在 rebar 带中实现透明对话栏
使用 “添加类”对话框,添加实现对话框栏对象的新类(例如
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消息转发到父窗口并强制每次移动对话栏对象时强制重新修补来模拟对话栏的透明度。