自绘控件背景透明

来源:互联网 发布:怎么上badoo网络 编辑:程序博客网 时间:2024/06/05 11:53
从CWnd派生的自绘控件,想要做背景透明的话,采用的方案是复制父窗口背景。
即在绘制函数中,先将父窗口的背景图贴到控件的背景上。
实际操作中,发生了一个问题,就是不断绘制、刷新的过程中,发现有叠加现象,直到透明区变成黑色。
经过检查发现,是由于获取父窗口背景然后绘制到控件背景的相关代码是在控件的Paint函数中实现的,而这种方式每次获取的背景是上一次绘制后的结果,所以产生了叠加。
因此,做如下修改:
1.定义控制变量,控制是否去获取父窗口背景,初始为真;
2.定义画布成员变量,用来保存获取到的父窗口背景;
3.定义函数,获取父窗口背景,并保存到成员变量中,且将控制变量置为假
4.在Paint函数中每次调取获取父窗口背景的函数,在该函数中根据控制变量判断是否需要再重新获取父窗口背景。
5.在Paint函数中将画布成员变量贴图到控件的dc上。

6.在窗口尺寸改变,或控件在窗口的位置改变等会导致控件对应父窗口位置的背景变化时,改变控制变量为真。


以下是获取父窗口背景的函数:

void CFullShowPanel::GetBkgnd(CDC* pSrcDC, CRect* pRect){if (!m_bGetBk) // 控制变量{return;}if (m_dcTmpBk.m_hDC == NULL){m_dcTmpBk.CreateCompatibleDC(pSrcDC);}if (m_pBmpTmpOld != NULL){m_dcTmpBk.SelectObject(m_pBmpTmpOld);m_bmpTmpBk.DeleteObject();m_pBmpTmpOld = NULL;}m_bmpTmpBk.CreateCompatibleBitmap(pSrcDC, pRect->Width(), pRect->Height());m_pBmpTmpOld = m_dcTmpBk.SelectObject(&m_bmpTmpBk);CWnd* pWnd = GetParent();CDC* pParentDC = pWnd->GetDC();CRect rcBtnInParent;GetWindowRect(&rcBtnInParent);pWnd->ScreenToClient(rcBtnInParent);m_dcTmpBk.BitBlt(0, 0, pRect->Width(), pRect->Height(), pParentDC, rcBtnInParent.left, rcBtnInParent.top, SRCCOPY);m_bGetBk = FALSE;}


原创粉丝点击