1:CDC方面:
       CDC有三种使用方式
       一种是获得,包括GETDC和GETWINDOWDC,这种CDC是引用,使用完了一定要ReleaseDC,不释放就会这个引用过来的CDC资源泄漏,千万不能用DeleteDC,会导致报错或程序崩溃。
       还有一种就是创建,一般是CreateDC,CreateCompatibleDC等,这是创建一个新的DC,使用完了要DeleteDC,如果是NEW的还需要DELETE。如果不是指针,而是一个CDC对象(CDC _dc;),那在使用后也可以不DeleteDC,因为CDC对象的析构函数会调用DeleteDC。
      最后一种是临时的CDC对象,(CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);),这种CDC在我们重载控件的DrawItem函数中经常用到,这类CDC是由系统在空闲时自动释放(没有测试过是否可以手动释放,有兴趣的朋友可以自己试试)。

2:下面说下GDI对象
      我的帖子举例的情况是不会造成内存泄漏的,SelectObject返回的指针是一个临时对象的指针,这个指针是保存在系统的一个MAP里的,对于MAP里的不使用的对象,系统会在空闲时自动释放。
那个例子的结果就是,把新的图片放到了那个CDC里面,CDC里面的默认或是原来的图片被替换删除了,再想用的时候就没有了。举例
1
2
3
4
pDC->TextOut("11");
pDC->SelectObject(&cpen);
pDC->TextOut("22");

cpen一个粗线条的笔,正常的想法是11是系统默认粗细的笔,22是粗线条,因为你没有选回系统默认的CPEN( pDC->SelectObject( pOldPen );),当你第二次执行这段代码的时候,11和22都是粗线条的,因为默认的笔已经被你改变了。

3:举例一:

void CMyView::OnPaint( CDC* pDC )
  {
  CBitmap bmp;
  CBitmap* pOldBmp;
  bmp.LoadBitmap(IDB_MYBMP);
  pOldBmp = pDC->SelectObject( &bmp );
  …
  if( Something() ){
  return;
  }
  pDC->SelectObject( pOldBmp );
  return;
  }

此段代码最大的问题就是在第一个return语句,如果在这种情况下,就执行选回原来的画刷,导致资源不释放,

4:举例二:

HBRUSH CCCIMSystemDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
 HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

// TODO:  在此更改 DC 的任何属性
 pDC->SetBkMode(TRANSPARENT);
HBRUSH B=CreateSolidBrush(RGB(204,204,255));
 
 return (HBRUSH)B;
 // TODO:  如果默认的不是所需画笔,则返回另一个画笔
 return hbr;
}
       此段代码主要是修改对话框以及控件的背景颜色,但是长时间运行将会发现大量资源泄漏。原因是每次进入此函数都会创建新的HBRUSH B而此对象有作为此函数的返回,即资源不会得到释放,

原文:https://blog.csdn.net/lixianjun913/article/details/9664163

GDI对象和CDC的使用方法(防止资源泄漏)相关推荐

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

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

  2. MFC和Win32之三___CGdiObject类和windows Gdi对象

    小结: 前面讲到的windows窗口对象,在windows下用句柄来代表之,并且用了一个数据结构WNDCLASS(窗口类)来描述之.同理,windows的Gdi对象也有一些句柄来代表之(比如hPen等 ...

  3. VS2010-MFC(图形图像:GDI对象之画刷CBrush)

    转自:http://www.jizhuomi.com/software/248.html 上一节讲的是画笔CPen的用法,前面也说了,GDI对象中最常用的就是画笔和画刷,本节就讲讲画刷CBrush. ...

  4. java判断一个对象是否为空_Java中判断对象是否为空的方法的详解

    首先来看一下工具StringUtils的判断方法: 一种是org.apache.commons.lang3包下的: 另一种是org.springframework.util包下的.这两种StringU ...

  5. 爬虫之requests模块cookieJar对象转换为cookies字典的方法

    爬虫之requests模块cookieJar对象转换为cookies字典的方法 使用requests获取的resposne对象,具有cookies属性.该属性值是一个cookieJar类型,包含了对方 ...

  6. selenium提取数据之driver对象的常用属性和方法

    selenium提取数据之driver对象的常用属性和方法 在使用selenium过程中,实例化driver对象后,driver对象有一些常用的属性和方法 driver.page_source 当前标 ...

  7. XE3随笔6:SuperObject 的 JSON 对象中还可以包含 方法

    SuperObject 的 JSON 对象中还可以包含 "方法", 这太有意思了; 其方法的格式是: procedure Method(const This, Params: IS ...

  8. Java中判断String对象是否为空的方法

    Java原生的方法: String对象中有一个isEmpty的方法判断是否为空,其实isEmpty完全等同于string.length()==0,注意如果String本身是null,那么使用strin ...

  9. 【Groovy】MOP 元对象协议与元编程 ( 方法委托 | 批量方法委托 )

    文章目录 一.批量方法委托 二.完整代码示例 一.批量方法委托 在上一篇博客 [Groovy]MOP 元对象协议与元编程 ( 方法委托 | 正常方法调用 | 方法委托实现 | 代码示例 ) 中 , 将 ...

最新文章

  1. Android 资源保护问题——探索
  2. LeetCode hard 668. Kth Smallest Number in Multiplication Table(二分答案)
  3. 分析 Web 资源的访问过程(Servlet 程序访问过程)
  4. python编程基础—正则表达式
  5. 配置了tomcat,更改了默认端口为8070,还是访问不了
  6. 如何从Java类创建JAR
  7. muduo源代码分析--Reactor在模型muduo使用(两)
  8. Win10系统定时开关机
  9. 分治法--线性时间选择
  10. JupyterNotebook中更新pip以及使用pip install安装lightgbm
  11. NIOS_Altera EPCS下载 注意事项20210815
  12. OSChina 周三乱弹 ——程序员是将咖啡转变成代码的工具
  13. 微信小程序中的用户ID(包括openid和unionid)
  14. STM32CubeMX学习笔记(24)——通用定时器接口使用(电容按键检测)
  15. kso经验记录 --- c# 之MD5加密算法
  16. laydate时间控件在谷歌浏览器中兼容性问题
  17. ping ,time,TTL详解
  18. TeamTalk源码分析(三) —— 服务器端的程序架构介绍
  19. 有一个8位机,采用单总线结构......(计算机组成原理课后习题)
  20. loadrunne-- Analysis 分析器

热门文章

  1. 设置Backup-masters Hbase中只有一个HMaster ,hmaster挂掉了,客户端还能连接hbase集群进行数据读写吗
  2. mysql同步大师_数据库大师成长日记:您最需要了解的NoSQL非关系型数据库
  3. 冒泡算法代码java_java版本的冒泡算法
  4. html怎么在图片上加文字_怎么把图片文字转换成word文档
  5. java实现简易聊天窗口先运行服务器还是客户端_一个简易聊天功能的服务器端和客户端源码...
  6. 用python编21点游戏_【Python3】21点游戏
  7. 华为被超越!这家公司成中国最大智能手机制造商,不是小米!
  8. 干货 | 双目摄像头实现手势识别,完美还原人体运动手势
  9. java yyyy m d_日期-Java 8时间API:如何将格式“ MM.yyyy”的字符串解析为LocalD
  10. idea页面简单介绍