请看下面的代码:
 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

最新文章

  1. 多线程条件通行工具——Semaphore
  2. EF DbContext 并发执行时可能出现的问题
  3. cordova 下载更新
  4. Java ClassLoader基础及加载不同依赖 Jar 中的公共类
  5. vmware, failed to lock the file
  6. Python对象(译)
  7. Only one database connection at a time is supported
  8. java 对象序列化 RMI
  9. 关于apriori算法的一个简单的例子
  10. serialVersionUID作用
  11. android-读取Assets图片资源保存到SD - 随心
  12. 使用jquery.form.js文件进行文件上传
  13. yum源配置问题
  14. [JVM-1]Java运行时数据区域
  15. 懒人小工具:T4生成实体类Model,Insert,Select,Delete以及导出Excel的方法
  16. HD200703
  17. 【Linux】关于路由跟踪指令traceroute
  18. MySQL测试工具之-tpcc
  19. 【总结整理】令人惊喜的app
  20. 【bzoj1002】轮状病毒

热门文章

  1. json 打印
  2. 01分数规划初探?!By cellur925
  3. CSS揭秘—打字动效(四)
  4. Codeforces Round #433 (Div. 2, based on Olympiad of Metropolises) B
  5. Ocelot实现API网关服务
  6. Net Core2-JWT
  7. MySQL 查看表大小
  8. Sqoop基础学习(1)
  9. Elasticsearch-分片原理1
  10. Layer:如何调用layer.open打开的的iframe窗口中的JS?