加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

windows – 我什么时候应该在位图上调用DeleteObject()

发布时间:2020-12-13 22:29:41 所属栏目:Windows 来源:网络整理
导读:我正在研究一些传统的Win32 / MFC项目. 我发现了以下(伪代码): HDC hDC = ::CreateCompatibleDC(hDCWnd);HANDLE hFileMap = ::CreateFileMapping(INVALID_HANDLE_VALUE,PAGE_READWRITE,dwSize,FileMapName);HBITMAP hBmp = ::CreateDIBSection(hDCWnd,zBI,D
我正在研究一些传统的Win32 / MFC项目.

我发现了以下(伪代码):

HDC hDC = ::CreateCompatibleDC(hDCWnd);
HANDLE hFileMap = ::CreateFileMapping(INVALID_HANDLE_VALUE,PAGE_READWRITE,dwSize,FileMapName);
HBITMAP hBmp = ::CreateDIBSection(hDCWnd,&zBI,DIB_RGB_COLORS,&pvNull,hFileMap,0);

::SelectObject(hDC,hBmp);
::DeleteObject(hBmp);
::CloseHandle(hFileMap);

// .. do something with hDC ..

::DeleteDC(hDC);

这对我来说很奇怪.任何人都可以解释一下,在我对DC做某事之前删除位图和/或关闭文件句柄是否正确?

谢谢.

解决方法

不,这不对.代码调用SelectObject()以将位图选择到设备上下文中,然后调用DeleteObject()以尝试删除位图,同时仍在设备上下文中选择该位图.在这种情况下,DeleteObject()将失败,因此位图被泄露.

http://msdn.microsoft.com/en-us/library/dd183539(v=vs.85).aspx

“当它仍然被选择到设备上下文中时,不要删除绘图对象(笔或画笔).”

编辑:

嗯,这很有趣.我尝试在设备上下文中选择位图时调用DeleteObject(),它也为我返回1.有趣的是,此时实际上并未删除位图;在“已删除”位图上调用GetObject()成功!但是,只要从设备上下文中选择了删除的位图,就会将其删除;此时调用GetObject()失败.我还通过观察任务管理器中的GDI句柄计数来验证.因此,如果位图当前被选择到设备上下文中,显然DeleteObject()将推迟删除,尽管我不相信任何地方都有记录.

HDC hdc = CreateCompatibleDC(NULL);
if (hdc != NULL) {
    HBITMAP hBitmap = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_SAMPLE));

    BITMAP bm = { 0 };
    int numBytes;

    // this succeeds as expected
    numBytes = GetObject(hBitmap,sizeof(BITMAP),&bm);

    HBITMAP hOldBitmap = SelectBitmap(hdc,hBitmap);

    DeleteObject(hBitmap);

    // this succeeds -- NOT expected!
    numBytes = GetObject(hBitmap,&bm);

    SelectBitmap(hdc,hOldBitmap);

    // this fails as expected
    numBytes = GetObject(hBitmap,&bm);

    DeleteDC(hdc);
}

最重要的是,您发布的代码似乎有效,但依赖于未记录的行为.我倾向于安全地发挥它并消除这种依赖性.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读