gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 13:28:10 26 4
gpt4 key购买 nike

我正在检查一些遗留的 Win32/MFC 项目。

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

HDC hDC = ::CreateCompatibleDC(hDCWnd);
HANDLE hFileMap = ::CreateFileMapping(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, 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, sizeof(BITMAP), &bm);

SelectBitmap(hdc, hOldBitmap);

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

DeleteDC(hdc);
}

底线是您发布的代码似乎有效,但取决于未记录的行为。我的偏好是安全行事并消除这种依赖性。

关于windows - 我什么时候应该在位图上调用 DeleteObject(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8500137/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com