【转】pDc->SelectObject(pOldBrush)恢复画刷
2024-08-30 05:23:03
请看下面的代码:
CDC *pDc=new CClientDC(this);
CBrush brush;
brush.CreateSolidBrush(RGB(0,255,0));
CBrush *pOldBrush = pDc->SelectObject(&brush);
pDc->Rectangle(50,50,200,200);
pDc->SelectObject(pOldBrush);
delete pDc;
比较困惑的是pDc->SelectObject(&brush);将刷子选入dc中,返回了一个CBrush类型的指针pOldBrush ,为什么在画完矩形之后,还要有pDc->SelectObject(pOldBrush);这么一条语句呢?怎么还要把pOldBrush 指针也选入dc中呢?书上解释说是恢复原来的画刷,晕~我这画刷也没改变啊,恢复个什么呢?
.................
CBrush *pOldBrush = pDc->SelectObject(&brush);
将brush自己定义的brush画刷选入dc中,此时dc就可以使用我们自己定义的brush画刷进行作业。
同时pDc->SelectObject(&brush)方法返回一个指针,该指针实际上是未引入brush之前dc中的缺省指针,这里我们将这个缺省指针返回了,并将之赋值为CBrush类型的,也就是pOldBrush 指针就是这个缺省指针。
在我们作业完成后,不能将dc中的brush消除掉,如果我们使用delete方法直接删除掉brush对象的话,也就是说brush对象没有了 但dc中仍保留了原先brush对象的句柄,这是不正确的,也是容易出问题的,因此我们要将dc中的brush的句柄给消除掉,怎么消除掉呢?我们知道 句柄实际上应该是个指针,我们只需要将dc中原先的brush指针替换掉就好了,就好比,只有一个位置,我要进来,你必须离开。那么现在就是brush的句柄要走,谁接替之呢?恰好是刚才被pDc->SelectObject(&brush)这个语句返回的默认指针,也就是pOldBrush ,还是由它来回归正统的好~所以,理所当然的要再将之选入到dc中了,也就有了语句pDc->SelectObject(pOldBrush); 这样以来dc中的brush句柄被冲刷掉了,如果delete brush的话 也不会在有句柄未被释放掉这样的烦恼了,因此,也就不会造成内存泄露的问题了。
CBrush *pOldBrush = pDc->SelectObject(&brush);中pOldBrush指向的是select之前的系统画刷或者其它画刷,并不是当前使用的brush,因此使用完画刷使用pDc->SelectObject(pOldBrush);恢复到初始状态。
转载自:http://blog.sina.com.cn/s/blog_a2aa00d7010190zd.html
最新文章
- 多线程条件通行工具——Semaphore
- EF DbContext 并发执行时可能出现的问题
- cordova 下载更新
- Java ClassLoader基础及加载不同依赖 Jar 中的公共类
- vmware, failed to lock the file
- Python对象(译)
- Only one database connection at a time is supported
- java 对象序列化 RMI
- 关于apriori算法的一个简单的例子
- serialVersionUID作用
- android-读取Assets图片资源保存到SD - 随心
- 使用jquery.form.js文件进行文件上传
- yum源配置问题
- [JVM-1]Java运行时数据区域
- 懒人小工具:T4生成实体类Model,Insert,Select,Delete以及导出Excel的方法
- HD200703
- 【Linux】关于路由跟踪指令traceroute
- MySQL测试工具之-tpcc
- 【总结整理】令人惊喜的app
- 【bzoj1002】轮状病毒