HDC (MemDC) и его bitmap
От: пффф  
Дата: 29.03.24 15:47
Оценка:
Привет!

Допустим, я делаю 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 я сам разрушу. Нормально так делать?
Re: HDC (MemDC) и его bitmap
От: Pavel Dvorkin Россия  
Дата: 29.03.24 16:18
Оценка: +1
Здравствуйте, пффф, Вы писали:

П>
П>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.
With best regards
Pavel Dvorkin
Отредактировано 29.03.2024 16:19 Pavel Dvorkin . Предыдущая версия .
Re[2]: HDC (MemDC) и его bitmap
От: пффф  
Дата: 29.03.24 16:40
Оценка:
Здравствуйте, 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 ресурсы вроде не текут, всё нормально
Re[3]: HDC (MemDC) и его bitmap
От: Pavel Dvorkin Россия  
Дата: 30.03.24 02:33
Оценка: +1
Здравствуйте, пффф, Вы писали:

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 ресурсы вроде не текут, всё нормально


Бога ради.
With best regards
Pavel Dvorkin
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.