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[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
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[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 ресурсы вроде не текут, всё нормально
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.