【转】GDI使用经验分享
来源:互联网 发布:运维常用python脚本 编辑:程序博客网 时间:2024/05/01 09:33
在windows系列上做编程,gdi是一个很重要的技术点,有很多程序在运行多次后出现异常,除了众所周知的内存泄露以外,gdi资源泄露也是一个很直接的原因.今天就把我自己在编程中总结的一些经验给大家分享,欢迎高手补充.
1.Create出来的gdi对象,一定要用DeleteObject来释放,释放顺序是先Create的后释放,后Create的先释放.
这里的Create指的是以它为开头的gdi函数,比如,CreateDIBITmap,CreateFont等等,最后都要调用DeleteObject来释放.
2.Create出来的dc要用DeleteDC来释放,Get到的要用ReleASEDC释放.
3.确保释放DC的时候DC中的各gdi对象都不是你自己创建的;确保个gdi对象在释放的时候不被任何dc选中使用.
假如我们要使用gdi函数画图,正确的步骤应该如下:
a.创建一个内存兼容dc(CreateCompatibleDC)
b.创建一个内存兼容bitmap(CreateCompatibleBITmap)
c.关联创建的内存兼容dc和bITmap(SelectObject)
d.画图
e.BITBlt到目的dc上
f.断开内存兼容dc和bITmap关联(SelectObject)
g.销毁内存兼容bITmap
h.销毁内存兼容dc
由于SelectObject在选入一个新的gdi对象的时候会返回一个原来的gdi对象(假如成功的话),所以需要在步骤c的时候保存返回值,在步骤f的时候当作入口参数使用.还有,步骤g和步骤h实际上顺序可以随意,因为他们两个此刻已经没有关系了,但是为了结构清晰,我建议按照"先Create的后释放,后Create的先释放"的原则进行.
关于步骤f,可能会有争议,因为即使省略这一步,步骤g和步骤h看起来照样可以返回一个成功的值.但实际上可能并没有执行成功,至少boundschecker会报告有错,错误信息大致是说,在释放dc的时候还包含有非默认的gdi对象,在释放gdi对象的时候又说这个gdi对象还被一个dc在使用.所以,我建议保留步骤f.
- 【转】GDI使用经验分享
- gdi使用经验分享
- gdi使用经验分享
- gdi使用经验分享
- gdi使用经验分享[原创]
- GDI经验分享
- sscanf使用经验分享
- unixODBC使用经验分享
- FastDFS使用经验分享
- 使用Sublime经验分享
- FastDFS 使用经验分享
- FastDFS 使用经验分享
- FastDFS 使用经验分享
- Spark使用经验分享
- FastDFS使用经验分享
- umeditor 使用经验分享
- Mac使用经验分享
- winForm框架下GDI绘图的一点经验分享
- C# 操作文件夹及文件
- C#钩子实现简单鼠标键盘的监控和屏蔽
- 这个问题是这样的
- JavaFX体验——弹跳的视频球
- 头文件的规则
- 【转】GDI使用经验分享
- struts中和validator相关的一些注意事项
- 2008年总结+2009展望
- 面向用户的网站性能优化
- 第10章 SQL的语言--SQL基础知识及SQL的历史
- 双系统如何设置系统默认启动
- 程序员的九重境界,你是第几重?
- 2009
- Delphi中將本機時間(包含毫秒)更新到數據庫。