读书人

画图时亟需恢复原来的CPen之类的吗

发布时间: 2013-07-04 11:45:51 作者: rapoo

画图时,需要恢复原来的CPen之类的吗?
一般用CDC时,都是选中Pen或Brush时保存原来的数据。
然后画完之后,再SelectObject恢复。

但我在画完之后不调用SelectObject恢复原来的Pen之类的,
看样子也没有什么特别的情况发生。这样是不是不用恢复,可以简单很多。。。
[解决办法]
要调的,不然会GDI泄露,泄露多了程序就挂了。

可以写个程序帮意泄露一下,在任务管理器中看一下GDI对象数就明白了。
[解决办法]

引用:
要调的,不然会GDI泄露,泄露多了程序就挂了。

可以写个程序帮意泄露一下,在任务管理器中看一下GDI对象数就明白了。

楼主可能没有遇到这方面的问题,记着当初开发一个图像编辑器的软件,会在使用的过程中出现内存不够的提示,而且也不是经常出现,要等程序用了一段时间才出现,查找了很久都没有找出问题,最后在任务管理器中发现GDI句柄有几万个,吓到了,最后才发现没有释放资源导致.
[解决办法]
需要啊
An application should always replace a new object with the original, default object after it has finished drawing with the new object.

[解决办法]
必须的
[解决办法]
凡是改动的,一概要改回来。

[解决办法]
看DeleteObject的说明你就明白了

If the specified handle is not valid or is currently selected into a DC, the return value is zero.

Do not delete a drawing object (pen or brush) while it is still selected into a DC.

如果你的GDI对象每次都创建,但GDI对象每次用完后 DeleteObject都失败,这就造成了泄露.

但如果你用的是全局变量,GDI对象仅创建一次,那就肯定没那么夸张


还有补充一下:
如果GDI对象如果被选进的是内存DC,当内存DC被DeleteDC后,DeleteObject是成功
我看过很多人家的双缓冲画图代码最后都有用SelectObject恢复原来的,然而我觉得这种情况是不必的,因为都是要DeleteDC的,DeleteObject是成功。

读书人网 >VC/MFC

热点推荐