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

转载于:https://www.cnblogs.com/zhanjxcom/p/4442443.html

【转】pDc-SelectObject(pOldBrush)恢复画刷相关推荐

  1. Visual C++/MFC入门教程

    Visual C++/MFC入门教程 VC开发指南 1.1 如何学好VC 这个问题很多朋友都问过我,当然流汗是必须的,但同时如果按照某种思路进行有计划的学习就会起到更好的效果.万事开头难,为了帮助朋友 ...

  2. Windows DC 画线

    好久没搞MFC,复习下知识. CPaintDC .CWindowDC. CClientDC. CDC 关系图: 一句话概括: CPaintDC            无效区dc,      相当于Be ...

  3. VC开发指南--Visual C++/MFC入门教程

    VC开发指南 1.1 如何学好VC 这个问题很多朋友都问过我,当然流汗是必须的,但同时如果按照某种思路进行有计划的学习就会起到更好的效果.万事开头难,为了帮助朋友们更快的掌握VC开发,下面我将自己的一 ...

  4. VC++ 常用编程技巧总结

    VC++6.0的使用以及编程技巧整理 1.MDI子窗口一启动就最大化      BOOL   CChildFrame::PreCreateWindow(CREATESTRUCT&   cs) ...

  5. visual c++ 技术资料(网络收集)

    1.如何获取应用程序的 实例句柄? 应用程序的实例句柄保存在CWinApp m_hInstance 中,可以这么调用AfxGetInstancdHandle获得句柄. Example: HANDLE ...

  6. MFC 常见窗口操作

    1.改变窗口大小或全屏窗口可用下面的代码: MoveWindow(hDlg,0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN ...

  7. MFC 108问题

    (1) 如何通过代码获得应用程序主窗口的 指针? 主窗口的 指针保存在CWinThread::m_pMainWnd中,调用AfxGetMainWnd实现. AfxGetMainWnd() ->S ...

  8. vc常见问题108问-很有资料价值

    1) 如何通过代码获得应用程序主窗口的 指针? 主窗口的 指针保存在CWinThread::m_pMainWnd中,调用AfxGetMainWnd实现. AfxGetMainWnd() ->Sh ...

  9. VC常见的108个问题

    VC常见的108个问题 http://blog.csdn.net/dongliqiang2006/article/details/5658504 1) 如何通过代码获得应用程序主窗口的 指针? 主窗口 ...

最新文章

  1. JS魔法堂:mmDeferred源码剖析
  2. 一、ExtMail Solution概述--EXTMAIL
  3. Python的enumerate()的坑
  4. mongodb学习篇
  5. pip 和 conda 源更改
  6. 牛客16662 津津的储蓄计划
  7. 刀片服务器改台式电脑_服务器到底是个什么东东?跟电脑有啥区别?电脑知识学习!...
  8. 创建计算机桌面快捷方式图标异常,桌面快捷方式图标显示异常,win7无法正常显示桌面图标怎么办?...
  9. 如何调用webservice服务端
  10. 个人博客系统整体介绍
  11. Adaptive icon 一 :理解 Android 的「自适应图标」
  12. 全国海选第四期:北京和海外赛区(视频)
  13. Springboot集合POI导出多sheet的Excel表格
  14. 2020-2021 Winter Petrozavodsk Camp, Belarusian SU Contest (XXI Open Cup, Grand Prix of Belarus)
  15. 滴滴 NewSQL 演进之 Fusion 实践
  16. 安装win10时无法安装若要在此计算机,win10安装时遇问题如何解决 win10安装解决方案...
  17. scrum立会报告+燃尽图(第三周第五次)
  18. OpenStack云平台搭建(5) | 部署Nova
  19. 彼岸夏花(一个爱与救赎的凄美故事)
  20. 怎样对计算机实现远程关机,计算机实验室如何实现远程关机.pdf

热门文章

  1. OpenGL环境搭建
  2. ubuntu 16.0.4 配置 tensorflow-gpu 1.1.0
  3. 二、python基础(列表、元组、字符串、集合、字典、文件操作,函数基本语法及特性)...
  4. 364. Nested List Weight Sum II
  5. C# indexof和indexofany区别(转)
  6. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) 分块
  7. asp.net中缓存Cache类的使用案例(附源码)
  8. 我的编码规范(慢慢补充)
  9. semantic ui框架学习笔记三
  10. 在WPF中实现平滑滚动