我想创建一个CWnd基础类,将推出带有透明背景的控制。
没有什么大不了的,我来创建一个控制和只要内容是静态的画与透明背景的内容。
问题是,当我想创建一个不断变化的内容的控制。 这是becaue我不知道如何删除与父母的背景(这在一般情况下,可能不只是一个纯色)控制的内容。
所以我想达到的目标是画了conent前擦除控制,控制从未有(父母,也许其他控件可能出现),而且比在这个地方的油漆控制。
我想创建一个CWnd基础类,将推出带有透明背景的控制。
没有什么大不了的,我来创建一个控制和只要内容是静态的画与透明背景的内容。
问题是,当我想创建一个不断变化的内容的控制。 这是becaue我不知道如何删除与父母的背景(这在一般情况下,可能不只是一个纯色)控制的内容。
所以我想达到的目标是画了conent前擦除控制,控制从未有(父母,也许其他控件可能出现),而且比在这个地方的油漆控制。
如果你想创建一个顶级窗口罗埃尔答案是罚款。 如果您需要箱子一个子窗口(如果你正在创建一个控制,一定是这样的),你不能使用WS_EX_LAYERED(我认为这已经从Windows 8上的改变)。
最简单的窍门是绘制父母作为对照研究背景。 所以在OnEraseBkgnd您可以添加以下代码:
BOOL uiBarcodeButton::OnEraseBkgnd(CDC* pDC)
{
CRect rect;
GetClientRect(rect);
return afxGlobalData.DrawParentBackground( this, pDC, rect);
}
不知道是否afxGlobalData全局变量只是MFC 2008功能包。 如果您使用的MFC的早期版本,那么你可以使用来自DrawParentBackground的代码:
ASSERT_VALID(pDC);
ASSERT_VALID(pWnd);
BOOL bRes = FALSE;
CRgn rgn;
if (rectClip != NULL)
{
rgn.CreateRectRgnIndirect(rectClip);
pDC->SelectClipRgn(&rgn);
}
CWnd* pParent = pWnd->GetParent();
ASSERT_VALID(pParent);
// In Windows XP, we need to call DrawThemeParentBackground function to implement
// transparent controls
if (m_pfDrawThemeBackground != NULL)
{
bRes = (*m_pfDrawThemeBackground)(pWnd->GetSafeHwnd(), pDC->GetSafeHdc(), rectClip) == S_OK;
}
if (!bRes)
{
CPoint pt(0, 0);
pWnd->MapWindowPoints(pParent, &pt, 1);
pt = pDC->OffsetWindowOrg(pt.x, pt.y);
bRes = (BOOL) pParent->SendMessage(WM_ERASEBKGND, (WPARAM)pDC->m_hDC);
pDC->SetWindowOrg(pt.x, pt.y);
}
pDC->SelectClipRgn(NULL);
return bRes;
您可以使用WS_EX_LAYERED和UpdateLayeredWindow()API绘制你的窗口。 见http://msdn.microsoft.com/en-us/library/ms997507.aspx 。
我用下面的代码为我的自定义静态控制:
BOOL MyStaticText::OnEraseBkgnd(CDC* pDC)
{
CRect rect;
GetClientRect(&rect);
pDC->SelectObject((HBRUSH)GetStockObject(NULL_BRUSH));
return pDC->PatBlt(0, 0, rect.Width(), rect.Height(), PATCOPY);
}