Привет!
Допустим, я делаю memDC:
HDC hMemDc = ::CreateCompatibleDC(hScreenDc);
HBITMAP hMemBmp = ::CreateCompatibleBitmap(hScreenDc, clientSize.x, clientSize.y );
HBITMAP hOldMemBmp = (HBITMAP)::SelectObject(hMemDc, (HGDIOBJ)hMemBmp);
Перед удалением hMemDc обычно принято восстанавливать в контексте hOldMemBmp. А надо ли это обязательно делать? Я так понимаю, что при разрушении hMemDc он разрушит тот hBitmap, который в него выбран — т.е. тот, который я создал и выбрал в DC. А hOldMemBmp я сам разрушу. Нормально так делать?
Здравствуйте, пффф, Вы писали:
П>П>HDC hMemDc = ::CreateCompatibleDC(hScreenDc);
П>HBITMAP hMemBmp = ::CreateCompatibleBitmap(hScreenDc, clientSize.x, clientSize.y );
П>HBITMAP hOldMemBmp = (HBITMAP)::SelectObject(hMemDc, (HGDIOBJ)hMemBmp);
П>
П>Перед удалением hMemDc обычно принято восстанавливать в контексте hOldMemBmp. А надо ли это обязательно делать?
Надо.
>Я так понимаю, что при разрушении hMemDc он разрушит тот hBitmap, который в него выбран — т.е. тот, который я создал и выбрал в DC.
Не разрушит. Это не деструктор. Надо для hMemBmp делать DeleteObject, а для того, чтобы он сработал, надо, чтобы hMemBmp не была выбрана в контексте
Do not delete a drawing object (pen or brush) while it is still selected into a DC.
https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-deleteobject
>А hOldMemBmp я сам разрушу.
А ее разрушать не надо — ты ее не создавал, она сама создалась при создании hMemDC.
Здравствуйте, Pavel Dvorkin, Вы писали:
П>>Перед удалением hMemDc обычно принято восстанавливать в контексте hOldMemBmp. А надо ли это обязательно делать?
PD>Надо.
Аргументируй
>>Я так понимаю, что при разрушении hMemDc он разрушит тот hBitmap, который в него выбран — т.е. тот, который я создал и выбрал в DC.
PD>Не разрушит. Это не деструктор. Надо для hMemBmp делать DeleteObject, а для того, чтобы он сработал, надо, чтобы hMemBmp не была выбрана в контексте
Почему не разрушит? При создании HDC там же откуда-то появляется дефолтный hBitmap? Я полагаю, что он создаётся вполне стандартными средствами. Ну, может, там унутре есть функция с доп параметром bool allowDestroySelectedObj, что в наружу не прокинуто, или делается SelectObject с нулевым hBitmap, освобождая дефолтный и позволяя его удаление.
PD>Do not delete a drawing object (pen or brush) while it is still selected into a DC.
PD>https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-deleteobject
Это я в курсе. Но это снаружи, а как унутре, кто знает?
>>А hOldMemBmp я сам разрушу.
PD>А ее разрушать не надо — ты ее не создавал, она сама создалась при создании hMemDC.
Так создалась скорее всего через стандартные механизмы.
Я на самом деле что-то не заметил нигде запрета такого способа работы с GDI ресурсами.
Ну и пока сделал именно так — всё работает, ничего не падает, GDI ресурсы вроде не текут, всё нормально
Здравствуйте, пффф, Вы писали:
PD>>Надо.
П>Аргументируй
Ниже было.
>>>Я так понимаю, что при разрушении hMemDc он разрушит тот hBitmap, который в него выбран — т.е. тот, который я создал и выбрал в DC.
PD>>Не разрушит. Это не деструктор. Надо для hMemBmp делать DeleteObject, а для того, чтобы он сработал, надо, чтобы hMemBmp не была выбрана в контексте
П>Почему не разрушит? При создании HDC там же откуда-то появляется дефолтный hBitmap? Я полагаю, что он создаётся вполне стандартными средствами. Ну, может, там унутре есть функция с доп параметром bool allowDestroySelectedObj, что в наружу не прокинуто, или делается SelectObject с нулевым hBitmap, освобождая дефолтный и позволяя его удаление.
Ты можешь предполагать что хочешь, но это стандартный прием. Если хочешь подробности, то
https://www.labirint.ru/books/20294/
PD>>Do not delete a drawing object (pen or brush) while it is still selected into a DC.
PD>>https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-deleteobject
П>Это я в курсе. Но это снаружи, а как унутре, кто знает?
Фень Юань в руки, там как раз о том, что внутри.
>>>А hOldMemBmp я сам разрушу.
PD>>А ее разрушать не надо — ты ее не создавал, она сама создалась при создании hMemDC.
П>Так создалась скорее всего через стандартные механизмы.
Не ты ее создавал и не надо ее уничтожать.
П>Я на самом деле что-то не заметил нигде запрета такого способа работы с GDI ресурсами.
П>Ну и пока сделал именно так — всё работает, ничего не падает, GDI ресурсы вроде не текут, всё нормально
Бога ради.