对 Rebar 控件使用对话栏
如 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 消息转发到父窗口并在每次移动对话栏对象时强制执行重新绘制,从而模拟对话栏的透明效果。
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈