用透明背景的CWnd(CWnd with transparent background)

2019-10-17 11:10发布

我想创建一个CWnd基础类,将推出带有透明背景的控制。

没有什么大不了的,我来创建一个控制和只要内容是静态的画与透明背景的内容。

问题是,当我想创建一个不断变化的内容的控制。 这是becaue我不知道如何删除与父母的背景(这在一般情况下,可能不只是一个纯色)控制的内容。

所以我想达到的目标是画了conent前擦除控制,控制从未有(父母,也许其他控件可能出现),而且比在这个地方的油漆控制。

Answer 1:

如果你想创建一个顶级窗口罗埃尔答案是罚款。 如果您需要箱子一个子窗口(如果你正在创建一个控制,一定是这样的),你不能使用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;


Answer 2:

您可以使用WS_EX_LAYERED和UpdateLayeredWindow()API绘制你的窗口。 见http://msdn.microsoft.com/en-us/library/ms997507.aspx 。



Answer 3:

我用下面的代码为我的自定义静态控制:

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); 
}


文章来源: CWnd with transparent background