OnDraw(CDC× pDC): { CPen aPen; aPen.CreatePen(PS_SOLID, 2, RGB(0, 0, 0)); CPen* pOldPen = pDC->SelectObject(&aPen); //.... pDC->SelectObject(pOldPen); // 为什么要这一句, } 为什么要保留原来的Pen, 每次都会新建...展开
{CPen aPen;aPen.CreatePen(PS_SOLID, 2, RGB(0, 0, 0));CPen* pOldPen = pDC->SelectObject(&aPen);//....pDC->SelectObject(pOldPen);
}
就像这么简单的情况也得还原成原来的画笔吗?

原因有以下几个:
  1. 窗口(视图)类,在任何地方(包括基础代码)都能获取DC并调整画笔,你无法确认上次使用的画笔是否被更换了,因此在每次画之前要Select

  2. 通常画笔都是使用临时变量CPen,这样在函数执行后,这个画笔会失效,如果不将OldPen放回去,会造成内存泄露(应该释放但因DC绑定而无法释放,下次放弃使用的时候又无法判断是否应该释放)

  3. 如果同样的画笔被重复频繁使用,可以在堆上建一个画笔指针,这样能提高效率(具体可以作为View类成员指针变量)

总之,SelectObject(pOldPen)是避免内存泄露的良好编程习惯。

MFC为什么要保留原来的CPen, 然后SelectObject相关推荐

  1. 使用MFC绘制一些简单图形

    目录 一.画直线 更改画笔样式 二.使用画刷画一个矩形 透明矩形 自定义颜色填充矩形 自定义图形填充矩形 四.实现一个画笔 五.画扇形 六.画椭圆 七.画圆 八.输出文本 一.画直线 画一条直线需要一 ...

  2. [转载] MFC绘制动态曲线,用双缓冲绘图技术防闪烁

    转载的原文地址 先上效果图 随着时间的推移,曲线向右平移,同时X轴的时间坐标跟着更新. 一.如何绘制动态曲线 所谓动画,都是一帧一帧的图像连续呈现在用户面前形成的.所以如果你掌握了如何绘制静态曲线,那 ...

  3. MFC绘制动态曲线,用双缓冲绘图技术防闪烁

    转载自:ZHY_ongu的博客:MFC绘制动态曲线,用双缓冲绘图技术防闪烁 先上效果图    随着时间的推移,曲线向右平移,同时X轴的时间坐标跟着更新. 一.如何绘制动态曲线. 所谓动画,都是一帧一帧 ...

  4. MFC真的过时了吗?C++是否真的适合做GUI界面?

    1.前言   这几天在论坛看到一个有趣的问题:新人入职公司做C++开发,发现公司用的界面GUI还是微软古老的MFC框架,想问大家MFC是不是已经过时了?是否还有深入学习的必要? 其实,个人觉得在讨论这 ...

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

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

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

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

  7. Windows编程与MFC # 4 单文档应用程序(1)

    整理自VC++程序设计课程课件 使用VC++的应用程序向导MFC AppWizard可以开发: Single document(单文档) Multiple document(多文档) Dialog b ...

  8. C++实现指针式时钟Sample

    前言 <指针式时钟>问题分析,功能分析 (1)正确显示系统时钟: (2)能准确定位时钟刻度和时分秒针的位置: (3)能随窗口大小的变化而变化. 源码下载链接,本文Sample源码下载地址: ...

  9. VS2010/MFC编程入门之五十(图形图像:GDI对象之画笔CPen)

    上一节中鸡啄米讲了CDC类及其屏幕绘图函数,本节的主要内容是GDI对象之画笔CPen. GDI对象 在MFC中,CGdiObject类是GDI对象的基类,通过查阅MSDN我们可以看到,CGdiObje ...

最新文章

  1. Docker、Kubernetes、Apache Mesos 之争 | 一个与传说不同的故事
  2. C语言其实不难,只是你没有找对方法!
  3. Qt5.7+Opencv2.4.9人脸识别(三)人脸处理
  4. python学习——matplotlib库——折线图
  5. Loopback for Mac(创建虚拟音频设备与音频编辑工具)
  6. python查找在圆周率100万个数字中是否有你的生日
  7. android+汉王手写引擎,汉王 从手写专家到输入法专家
  8. java实现输入数字 输出金额_JAVA实现数字大写金额转换的方法
  9. 什么是web services?它有什么作用,以及它如何实现?
  10. %02x与%2x 区别
  11. RS485 光照度传感器 pc串口工具调试设备 亲身体验
  12. tushare获得股票数据后进行数据合并
  13. 生活需要创意-精彩的水果创意设计
  14. 雨水情测报系统+智慧水库大坝安全监测系统
  15. 为什么mac Safari提示:打不开该网页,因为无法与服务器建立安全的链接?
  16. 刻录光盘软件测试工资,Windows XP刻录数据光碟
  17. 基于HTML电商项目的设计与实现——html静态网站基于数码类电商购物网站网页设计与实现共计30个页面...
  18. 基于单片机的智能晾衣杆
  19. ip nat inside sourse 和 ip nat source 区别
  20. java过滤.txt_关键词过滤实现(JAVA TXT)

热门文章

  1. boost::range_category和boost::iterator_category相关的测试程序
  2. 使用 Boost.MPI 的 reduce() 连接字符串的示例
  3. boost::mp11::mp_apply_q相关用法的测试程序
  4. boost::geometry::dot_product用法的测试程序
  5. boost::fusion::extension::adt_attribute_proxy用法的测试程序
  6. boost::function模块function_typeof的测试程序
  7. boost::filesystem模块和boost::timer混合的测试程序
  8. VTK:小部件之CompassWidget
  9. VTK:可视化之AxisActor
  10. VTK:PolyData之TransformOrderDemo