您的位置:首页 > 移动开发 > Objective-C

DeleteObject(Bitmap.m_hObject)对象创佳完成以后,必须删除对象

2008-06-16 15:19 218 查看
DeleteObject之我见,真的不能删除已选入DC的GDI对象?
MSDN中关于DeleteObject函数的解释,我看过三、四个版本,都说不能删除已选入DC的GDI对象,比如MSDN2005:

Return Values
If the function succeeds, the return value is nonzero.
If the specified handle is not valid or is currently selected into a DC, the return value is zero.

Windows NT/2000/XP: To get extended error information, call GetLastError.

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

注意上面的Do not,看到真是吓人,我记得以前某个版本的MSDN写的是Should not,可是我从来都是直接删除GDI对象的,从来不关心它是否已选入DC,比如:
CDC* pDC = GetDC();
CPen pen(PS_SOLID, 1, RGB(255, 0, 0));
pDC->SelectObject(&pen);
if (pen.DeleteObject())
Beep(1500, 100); //选择MSDN,这个Beep应该不会被执行,实际是执行了
ReleaseDC(pDC);
上面的程序会Beep,说明删除是成功的;
在debug版下,没有断言错误(从源码也可以看出,它直接就调用了API-::DeleteObject);
用baundschecker查看内存,没有泄漏。

到这里,不知道你的观点是怎么样的呢?
注:我的一个曲线绘制控件,十天半个月的自动绘制实时曲线,没有发现GDI泄漏的问题,已使用几年了,
所以我才敢怀疑MSDN中的说法。
注意,我讨论的是能不能删除已选入DC的GDI对象,而不是讨论程序是否合理!
也就是说,我讨论的是是与否的问题,而非好与次的问题,所以应该不算钻牛角尖吧!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐