我正在檢查一些傳統的Win32/MFC項目。什麼時候應該在位圖上調用DeleteObject()
我發現以下(僞代碼):
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執行某些操作?
謝謝。
我從:: DeleteObject的(人BMP)檢查返回值和:: CloseHandle的(hFileMap),兩者相加返回TRUE,所以看起來該DeleteObject的調用不會在這件事上失敗或者我錯了嗎? – Rom098
對編輯的評論:是的,我也觀察過這種行爲,在DC上選中時,DeleteObject調用時不會刪除位圖,然後在DeleteDC調用中刪除位圖。它看起來像SelectObject/DeleteObject有一些引用計數器,但沒有關於它在MSDN中的信息。 – Rom098
@羅曼:我同意,有一些無證魔術發生。但如果我是你,我不希望我的代碼因爲這依靠那魔術我們無法保證它將來會繼續工作。 – cbranch