GDI绘图(一)
2012-09-25 13:50
162 查看
最近在做一个聊天界面,使用GDI绘制。
基本的思路还是一样,首先建立一个兼容DC,选入适当大小的内存位图,然后在兼容DC上绘制你想要的图像,最后复制到设备DC上。这是常规的防止闪屏的一种方法!
绘制过程比较顺利,但是调试的时候发现内存泄露的比较严重。查看任务管理器,可以看见内存不断的增长,同时GDI对象数目不断增多。
总结一下
这是第一次关注GDI内存泄露问题,以前总认为我建的只是局部变量,当函数调用完毕,GDI对象应该自己调用析构函数释放内存。可是很显然,事实没如我所愿。
GetDC
After painting with a common DC, the
ReleaseDC function must be called to release the DC. Class and private DCs do not have to be released.ReleaseDC must be called from the same thread that called
GetDC. The number of DCs is limited only by available memory.
一般来说,GetDC()之后,一定要调用ReleaseDC()
SelectObject
This function returns the previously selected object of the specified type. An application should always replace a new object with the original, default object after it has finished drawing with the new object.An application
cannot select a bitmap into more than one DC at a time.
一开始不知道为什么一定要把GDI对象选出,觉得我用完了就用完了啊,反正我再进来我再选我要的GDI对象。但是 ,当你调用DeleteObject(),有这么一句话:
Do not delete a drawing object (pen or brush) while it is still selected into a DC.
也就是说你不把对象选出DC就进行删除,会删除失败,DeleteObject返回False。
对于GDI对象的释放,总结起来就是这么几点:
1 Create出来的DC,DeleteDC()释放,GetDC(),ReleaseDC()释放。
2 欲删除一个GDI对象,必须将其从DC中选出,DeleteObject()才会成功!
3
有时,闪烁的原因是因为当重画时,父窗体没有剪切其子窗体区域。这样的结果导致,整个父窗口内容被重画,而子窗体又被显示在了上面(造成闪烁)。这个可以通过在父窗体上设置WS_CLIPCHILDREN 来解决。当这个标志被设置时,被子窗体占据的任何区域将会被排除在更新区域外。因此,即使你尝试在子窗体所在的位置上绘制(父窗口的内容),BeginPaint中的剪切区域也会阻止其绘制效果。
基本的思路还是一样,首先建立一个兼容DC,选入适当大小的内存位图,然后在兼容DC上绘制你想要的图像,最后复制到设备DC上。这是常规的防止闪屏的一种方法!
绘制过程比较顺利,但是调试的时候发现内存泄露的比较严重。查看任务管理器,可以看见内存不断的增长,同时GDI对象数目不断增多。
总结一下
这是第一次关注GDI内存泄露问题,以前总认为我建的只是局部变量,当函数调用完毕,GDI对象应该自己调用析构函数释放内存。可是很显然,事实没如我所愿。
GetDC
After painting with a common DC, the
ReleaseDC function must be called to release the DC. Class and private DCs do not have to be released.ReleaseDC must be called from the same thread that called
GetDC. The number of DCs is limited only by available memory.
一般来说,GetDC()之后,一定要调用ReleaseDC()
SelectObject
This function returns the previously selected object of the specified type. An application should always replace a new object with the original, default object after it has finished drawing with the new object.An application
cannot select a bitmap into more than one DC at a time.
一开始不知道为什么一定要把GDI对象选出,觉得我用完了就用完了啊,反正我再进来我再选我要的GDI对象。但是 ,当你调用DeleteObject(),有这么一句话:
Do not delete a drawing object (pen or brush) while it is still selected into a DC.
也就是说你不把对象选出DC就进行删除,会删除失败,DeleteObject返回False。
对于GDI对象的释放,总结起来就是这么几点:
1 Create出来的DC,DeleteDC()释放,GetDC(),ReleaseDC()释放。
2 欲删除一个GDI对象,必须将其从DC中选出,DeleteObject()才会成功!
3
有时,闪烁的原因是因为当重画时,父窗体没有剪切其子窗体区域。这样的结果导致,整个父窗口内容被重画,而子窗体又被显示在了上面(造成闪烁)。这个可以通过在父窗体上设置WS_CLIPCHILDREN 来解决。当这个标志被设置时,被子窗体占据的任何区域将会被排除在更新区域外。因此,即使你尝试在子窗体所在的位置上绘制(父窗口的内容),BeginPaint中的剪切区域也会阻止其绘制效果。
相关文章推荐
- GDI绘图中的映射模式CDC::SetMapMode()
- C#GDI绘图流程
- GDI绘图之缩放成像
- MFC 调用GDI库的虚线画笔绘图,放大到一定程度后变成实线解决方案
- [收藏转载]C# GDI+ 简单绘图
- GDI 绘图 内存泄漏问题
- WINDOW API基本屏幕绘图(GDI Graphics Device Interface 图像设备接口)
- C# GDI+ 简单绘图(三)
- c# GDI+简单绘图(四)
- 谈GDI绘图中的资源释放
- windows编程学习笔记(4)GDI绘图
- 关于GDI绘图的新手说明
- C# GDI+ 简单绘图 (三) 实现仿QQ截图功能
- GDI绘图方法的初步分析
- GDI绘图中的资源释放
- c++ GDI绘图 利用SetROP2函数的R2_NOT与R2_NOTXORPEN属性,重新绘制时清除原先的图
- Windows图形设备接口(GDI)及Windows绘图
- C# GDI+绘图高级编程(三)
- GDI绘图
- GDI绘图1——自定义函数