Нет, это не правильно.Код вызывает 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);
}
Суть в том, что код, который вы опубликовали, появляетсяработать, но зависит от недокументированного поведения.Я бы предпочел не рисковать и устранить эту зависимость.