2012-12-03 111 views
1

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

只要内容是静态的,创建控件并使用透明背景绘制其内容没有什么大不了的。

问题是当我想通过更改内容创建控件时。这是因为我不知道如何通过父母的背景来清除控件的内容(在一般情况下,这可能不仅仅是纯色)。

所以我想要实现的目标是在绘制控件之前删除控件,因为控件永远不会存在(父类,也许其他控件可能会出现),而不是在此处绘制控件。

回答

2

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

简单的技巧是将父母作为控件背景。所以在OnEraseBkgnd您可以添加以下代码:如果afxGlobalData全局变量只是MFC 2008功能包

BOOL uiBarcodeButton::OnEraseBkgnd(CDC* pDC) 
{ 
    CRect rect; 
    GetClientRect(rect); 

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

不知道。如果您使用的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; 
0

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

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