自绘控件背景透明
来源:互联网 发布:怎么上badoo网络 编辑:程序博客网 时间:2024/06/05 11:53
从CWnd派生的自绘控件,想要做背景透明的话,采用的方案是复制父窗口背景。
即在绘制函数中,先将父窗口的背景图贴到控件的背景上。
实际操作中,发生了一个问题,就是不断绘制、刷新的过程中,发现有叠加现象,直到透明区变成黑色。
经过检查发现,是由于获取父窗口背景然后绘制到控件背景的相关代码是在控件的Paint函数中实现的,而这种方式每次获取的背景是上一次绘制后的结果,所以产生了叠加。
因此,做如下修改:
1.定义控制变量,控制是否去获取父窗口背景,初始为真;
2.定义画布成员变量,用来保存获取到的父窗口背景;
3.定义函数,获取父窗口背景,并保存到成员变量中,且将控制变量置为假
4.在Paint函数中每次调取获取父窗口背景的函数,在该函数中根据控制变量判断是否需要再重新获取父窗口背景。
5.在Paint函数中将画布成员变量贴图到控件的dc上。
即在绘制函数中,先将父窗口的背景图贴到控件的背景上。
实际操作中,发生了一个问题,就是不断绘制、刷新的过程中,发现有叠加现象,直到透明区变成黑色。
经过检查发现,是由于获取父窗口背景然后绘制到控件背景的相关代码是在控件的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;}
- 自绘控件背景透明
- MFC CStatic控件自绘,背景透明。
- 自绘标题栏,不规则窗口,背景透明
- 控件透明背景
- VC控件背景透明
- QT 控件背景透明
- 控件背景透明代码
- 设置控件背景透明
- 静态控件背景透明
- VC 控件背景透明、文字背景透明
- html控件透明与背景透明
- html 控件/元素 透明与背景透明
- Richtextbox控件透明加入背景
- 使控件拥有透明背景
- 设置Cstatic控件背景透明
- C#自定义控件背景透明
- 实现控件的透明背景
- 标签控件的背景透明
- requestDisallowInterceptTouchEvent
- TCP/IP详解学习笔记(13)-TCP坚持定时器,TCP保活定时器
- linux 移植遇到的问题备份
- s5pv210 video设备节点
- 面试题40:数组中只出现一次的数字
- 自绘控件背景透明
- 简单实现添加menu
- 着色器和shade
- TextView展开加动画效果实现
- Xcode5使用遇到的问题
- scp 断点续传
- C语言中char int转换问题
- ThreadLock2
- iOS 开发,工程中混合使用 ARC 和非ARC