Вопрос в удалении HGDIOBJ результата возвращаемого функцией SelectObject(..).
Из MSDN документации вообще не очевидно когда надо удалять, там указывается понятие замещать - что не во всех случаях очевидно. Например такой код:
HDC hdcMem = ::CreateCompatibleDC(hdc);
HGDIOBJ hgdi = ::SelectObject(hdcMem, hbmp);
GetObject(hbmp, sizeof(bitmap), &bitmap);
::StretchBlt(..., hdcMem, ...);
/// ... много всякого всего ...
::DeleteObject(hgdi); // <- он тут нужен?
::DeleteDC(hdcMem);
или
hdcc = ::CreateCompatibleDC(NULL);
hobj = ::SelectObject(hdcc, hbmp);
GetDIBits(hdcc, hbmp, ...);
SetDIBits(hdcc, hbmp, ...);
/// ... много всякого всего ...
::DeleteObject(hobj); // <- он тут нужен?
::DeleteDC(hdcc);
Эта функция возвращает ранее выбранный объект указанного типа. Приложение должно всегда заменять новый объект оригинальным объектом по умолчанию после завершения рисования новым объектом.
https://docs.microsoft.com/ru-ru/windows/desktop/api/wingdi/nf-wingdi-selectobject
Удалять необходимо только те объекты GDI, которые вы сами создали. И удалять их можно только после того, как вы их "отселектили" из GDI контекста. Системные GDI объекты удалять нельзя.
В ваших примерах оба удаления некорректны. Удалять эти объекты нельзя - это системные объекты "по умолчанию", которые находились в контекстах до того, как вы выбрали туда свой объект hbmp. Я уверен, что попытки удаления таких системных объектов, не приведут ни к каким негативным последствиям - DeleteObject просто ничего не сделает. Но все равно это бессмысленная и некорректная операция.
Вместо удаления вам, как сказано в документации, надо выбрать эти объекты обратно в контекст
::SelectObject(hdcMem, hgdi);
::DeleteDC(hdcMem);
// ...
::SelectObject(hdcc, hobj);
::DeleteDC(hdcc);
Эти SelectObject, возможно, не обязательны, если вы все равно собираетесь следующим же шагом уничтожать эти контексты через DeleteDC. Но я бы все-таки их выполнял чисто из соображений аккуратности.
Продвижение своими сайтами как стратегия роста и независимости