首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有透明背景的CWnd

具有透明背景的CWnd
EN

Stack Overflow用户
提问于 2012-12-03 21:38:21
回答 3查看 7.3K关注 0票数 1

我想创建一个基于CWnd的类,它将引入一个具有透明背景的控件。

只要内容是静态的,创建一个控件并绘制具有透明背景的内容对我来说没有什么大不了的。

问题是当我想创建一个内容不断变化的控件时。这是因为我不知道如何用父母的背景删除控件的内容(一般情况下可能不仅仅是纯色)。

所以我想要实现的目标是在绘制控件的内容之前擦除它,因为控件从来不在那里(父控件,可能会出现其他控件),而不是在这个地方绘制控件。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-04 01:22:03

如果你想创建一个顶级窗口,Roel answer是不错的选择。如果你需要创建一个子窗口(如果你正在创建一个控件,这必须是这种情况),你不能使用WS_EX_LAYERED (我认为这从Windows8开始已经改变了)。

简单的技巧是将parent绘制为控件背景。因此,您可以在OnEraseBkgnd中添加以下代码:

代码语言:javascript
复制
BOOL uiBarcodeButton::OnEraseBkgnd(CDC* pDC)
{
    CRect rect;
    GetClientRect(rect);

    return afxGlobalData.DrawParentBackground( this, pDC, rect);
}

不确定afxGlobalData全局变量是否仅用于MFC2008功能包。如果您使用的是MFC的早期版本,则可以使用DrawParentBackground中的代码:

代码语言:javascript
复制
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;
票数 4
EN

Stack Overflow用户

发布于 2012-12-03 23:07:45

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

票数 2
EN

Stack Overflow用户

发布于 2014-03-17 10:12:15

我在我的自定义静态控件中使用了以下代码:

代码语言:javascript
复制
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); 
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13684437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档