DeleteObject之我见,真的不能删除已选入DC的GDI对象?

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对象,而不是讨论程序是否合理!
也就是说,我讨论的是是与否的问题,而非好与次的问题,所以应该不算钻牛角尖吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
可以按照下面的步骤使用GDI+将CString对象绘制到内存DC中,然后将其粘贴到指定区域: 1. 创建一个内存DC,可以使用CreateCompatibleDC函数创建。例如: ``` CDC memDC; memDC.CreateCompatibleDC(pDC); ``` 2. 创建一个内存Bitmap,可以使用CreateCompatibleBitmap函数创建。例如: ``` CBitmap bmp; bmp.CreateCompatibleBitmap(pDC, width, height); ``` 3. 将内存Bitmap选入内存DC,可以使用SelectObject函数。例如: ``` CBitmap* pOldBmp = memDC.SelectObject(&bmp); ``` 4. 创建一个Graphics对象,可以使用Gdiplus::Graphics类创建。例如: ``` Gdiplus::Graphics graphics(memDC.GetSafeHdc()); ``` 5. 将CString对象绘制到内存DC中,可以使用Gdiplus::Graphics类的DrawString函数。例如: ``` Gdiplus::Font font(L"Arial", 12); Gdiplus::SolidBrush brush(Gdiplus::Color(255, 0, 0)); Gdiplus::RectF rect(0, 0, width, height); graphics.DrawString(str.GetString(), -1, &font, rect, NULL, &brush); ``` 这里假设你要将CString对象绘制到整个内存Bitmap中。 6. 将内存DC中的图像粘贴到指定区域,可以使用BitBlt函数。例如: ``` pDC->BitBlt(destX, destY, width, height, &memDC, 0, 0, SRCCOPY); ``` 这里假设你要将内存Bitmap中的图像粘贴到pDC的(destX, destY)位置。 7. 清除资源,包括内存DC和内存Bitmap。例如: ``` memDC.SelectObject(pOldBmp); bmp.DeleteObject(); memDC.DeleteDC(); ``` 完成上述步骤后,你就可以将CString对象绘制到内存DC中,并将其粘贴到指定区域了。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值