powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / [WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
22 сообщений из 22, страница 1 из 1
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
    #39664682
Ветки конкретно по WinAPI почему-то нету. Почему? Сам ж WinAPI не зависит от языка.
Ну да ладно, изначально хотел написать в C++, но там "У вас нет прав на добавление сообщений в данный форум" .

Вопрос такой:
Я создал свой HBITMAP нужного мне формата и размера, захотел на нём порисовать. Рисовать можно только на HDC. Ну ладно - создал временный служебный HDC. Соединил HDC и HBITMAP функцией SelectObject().
Рисую (проверял, всё рисуется), после этого мне надо отдать свой HBITMAP и забыть про него (там уже сами должны управлять/освобождать). Но что мне cделать с HDC? Вернее как мне убрать из него мой HBITMAP ?
Если я вызову DeleteDC() - то мой HBITMAP же тоже пометится освобождённым, так ведь? Или как вопрос наоборот - если при DeleteDC() связанный HBITMAP не освобождается, то как тогда его вообще корректно освобождать?

Может есть функция обратная SelectObject(), просто я её не нашёл? Спасибо!
...
Рейтинг: 0 / 0
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
    #39664684
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сверкающий,

https://msdn.microsoft.com/ru-ru/library/windows/desktop/dd162957(v=vs.85).aspx Return value
If the selected object is not a region and the function succeeds, the return value is a handle to the object being replaced.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
OldBitmap := SelectObject(TmpDC, hMyBitmap);

... рисуем ... 

if SelectObject(TmpDC, OldBitmap) = 0 then 
  raise Exception.Create('Что-то пошло не так...');

... тут битмап отдельно, HDC отдельно ...
...
Рейтинг: 0 / 0
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
    #39664685
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СверкающийЕсли я вызову DeleteDC() - то мой HBITMAP же тоже пометится освобождённым, так ведь?

С чего ты это взял?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
    #39664689
С чего ты это взял?Читал. То ли в самом MSDN, то ли в каком-то переводе онного на русский, хотя возможно что и в книге по графике в WinAPI.

object being replacedм? Но если я только что создал скажем так "пустой" HDC - разве в нём уже есть какой-либо HBITMAP?

Большое спасибо, сейчас попробую!
Только видимо не "равно нулю", а проверять что вернуло именно мой HBITMAP - это будет обозначать что он отсоеденён!
...
Рейтинг: 0 / 0
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
    #39664690
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СверкающийТолько видимо не "равно нулю", а проверять что вернуло именно мой HBITMAP - это будет обозначать что он отсоеденён!
https://msdn.microsoft.com/ru-ru/library/windows/desktop/dd162957(v=vs.85).aspx If an error occurs and the selected object is not a region, the return value is NULL. Otherwise, it is HGDI_ERROR.Если вернуло не 0 и не битмап, значит где-то раньше его уже заменили...
...
Рейтинг: 0 / 0
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
    #39664692
о... Вот как... Надо бы подробнее проштудировать...
Но где раньше-то? Я же сам только что создал. И сам выбираю.

и не битмапэм... А я не знаю как проверить - битмап это или нет...
...
Рейтинг: 0 / 0
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
    #39664693
а... Или вы имели ввиду "не мой битмап"? :)
Пардон)
...
Рейтинг: 0 / 0
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
    #39664707
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сверкающийимели ввиду "не мой битмап"
...
Рейтинг: 0 / 0
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
    #39664715
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СверкающийЧитал. То ли в самом MSDN, то ли в каком-то переводе онного на русский, хотя возможно что
и в книге по графике в WinAPI.

Если это в книге - в печь.
На самом MSDN ничего даже отдалённо похожего не написано.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
    #39664765
Вы уверены?
MSDNNote: When a memory device context is created, it initially has a 1-by-1 monochrome bitmap selected into it.Когда HDC создаётся, он также получает (считай создаёт) некий "битмап по умолчанию", размерами 1x1 и форматом 1 бит на пиксель (монохромное).
Вопрос: если, как вы говорите , DeleteDC() не удаляет связанные с ним объекты - тогда кто же удаляет этот "битмап по умолчанию"..?

Хотя да, каких-то явных конкретных пояснений "что при вызове DeleteDC() происходит с выбранными в удаляемый HDC объектами" я что-то сходу не нашёл...
...
Рейтинг: 0 / 0
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
    #39664795
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СверкающийВопрос: если, как вы говорите, DeleteDC() не удаляет связанные с ним объекты - тогда
кто же удаляет этот "битмап по умолчанию"..?
Это же очевидно: тот, кто его создал.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
    #39664797
ma1tus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сверкающий,

Принципа "не ты выдал - не ты забираешь" - недостаточно? Создал контекст, сохранил оригинал объекта, поюзал, вернул оригинал, удалил.

Ну и у Эпплмана написано, что вызов DeleteDC освобождает всю память, выделенную при создании...
...
Рейтинг: 0 / 0
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
    #39664799
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ma1tusНу и у Эпплмана написано, что вызов DeleteDC освобождает всю память, выделенную при
создании...

Ключевое слово "при создании". А аффтар думает, что будет освобождено ещё и то, что
назначили в качестве внешней ссылки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
    #39664866
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovma1tusНу и у Эпплмана написано, что вызов DeleteDC освобождает всю память, выделенную при
создании...

Ключевое слово "при создании". А аффтар думает, что будет освобождено ещё и то, что
назначили в качестве внешней ссылки.

На самом деле напрямую нигде не говорится, что будет освобождено то, что было назначено "извне", но зато везде говорится что после рисования необходимо вернуть на место все исходные объекты . Подробнее тут .
...
Рейтинг: 0 / 0
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
    #39664869
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpпосле рисования необходимо вернуть на место все исходные объекты Это утверждение неверно.
При создании DC битмап будет пустым, а остальные атрибуты заполнены stock-объектами. Т.е. вместе с DC ничего дополнительно не создается. Соответственно, не будет и удаляться.
Поэтому перед или после удаления нужно только свои объекты чистить, если нужно.
...
Рейтинг: 0 / 0
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
    #39664874
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борисalekcvpпосле рисования необходимо вернуть на место все исходные объекты Это утверждение неверно. Microsoft'у об этом расскажите:
https://msdn.microsoft.com/en-us/library/dd162957.aspx This function returns the previously selected object of the specified type. An application should always replace a new object with the original, default object after it has finished drawing with the new object.
...
Рейтинг: 0 / 0
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
    #39664876
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpMicrosoft'у об этом расскажите: Зачем?
Это элементарно проверяется.
...
Рейтинг: 0 / 0
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
    #39664880
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский БорисalekcvpMicrosoft'у об этом расскажите: Зачем?
Это элементарно проверяется.
Затем, что если сейчас это так - это не значит что в один прекрасный момент это не поменяется. И тогда все программы, которые не используют рекомендуемую реализацию могут столкнуться с "неожиданными трудностями" (С).
...
Рейтинг: 0 / 0
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
    #39664916
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpЗатем, что если сейчас это так - это не значит что в один прекрасный момент это не поменяется. И тогда все программы, которые не используют рекомендуемую реализацию могут столкнуться с "неожиданными трудностями" (С).Если за 20 лет в этом месте ничего не менялось вряд ли измениться когда-либо позже. Напротив, менялось как раз то, на что в ранней документации не было никаких указаний.
...
Рейтинг: 0 / 0
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
    #39665601
alekcvpпосле рисования необходимо вернуть на место все исходные объекты
Да, написано после выполнения своих действий слудует возвращать на место как было, видел, читал. Также написано не удалять объекты, пока они ещё выбраны в контекст.
А ещё написано что впоследствии выяснилось что этим двум правилам почему-то мало кто следовал на практике, и были жуткие утечки. И тогда в новых версиях ОС ввели какие-то изменения.
Например раньше DeleteObject() именно и сразу "удалял", но если объект при этом оставался куда-то выбранным - то по факту удаления не происходило, и получалась утечка.
Сейчас DeleteObject() не делает непосредственного удаления. Он "освобождает", или иначе "помечает освобождёным". Объект существует ещё какое-то время, а удаляется позже ( отложенное удаление ).
Поэтому неофициально стало можно применять DeleteObject() на ещё выбраные в контекст объекты. Документация всё ещё запрещает так делать, но система уже штатно ожидает нарушения и обрабатывает вполне корректно.

И мне кажется что правило возвращать в исходное состояние относится только к ситуациям когда HDC приходит откуда-то извне и дальше пойдёт неизвестно куда. Когда не мы его "курируем".

Соколинский Борисатрибуты заполнены stock-объектами
Ах, да - а stock-объекты же удалять не нужно ( интересно почему конкретно ).
гм... Тогда вполне можно предположить что тот "битмап по умолчанию" - это возможно также некий специальный stock-объект? И тогда да, удалять его не требуется...

ma1tusСоздал контекст, сохранил оригинал объекта, поюзал, вернул оригинал, удалил.
А если мне требуется не единично "порисовать" на чём-то и отпустить на обработку дальше, а создать/хранить/управлять/использовать самостоятельно на протяжении допустим ближайшего часа/двух/трёх?
Мне всё это время надо хранить ещё и "битмап по умолчанию"? Или он stock-объект и про него можно просто забыть? Или сперва сделать ему DeleteObject(), а потом забыть? Зачем его возвращать, если он или stock или уже удалён?
...
Рейтинг: 0 / 0
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
    #39665602
Я не "думает", я "спрашивает". Потому что в документации этого не указано явно .
Создали HDC. Создали HBITMAP. Выбрали HBITMAP в HDC. Теперь HBITMAP помечен выбранным в этот HDC, а сам HDC запомнил что его текущий битмап тот что мы ему задали.
Что конкретно будет, если мы (или кто-то другой) возьмёт да и вызовет DeleteDC()? Забыли или не знали что там HBITMAP. HDC удалится корректно и полностью?
А HBITMAP случайно не пометится ли освобождённым? А если не пометится - перестанет ли он иметь статус выбраного в тот HDC?

В документации не сказано что именно будет. Там не сказано что удалится. Но и что не удалится также не сказано.
Может он просто отвяжется от контекста - но это также не сказано. Или даже не отвяжется? Я просто хочу разобраться - что будет.

Соколинский БорисЭто элементарно проверяется.
Увы, но нет. Выше я описал какие изменения были с DeleteObject().
Не знаю как раньше, а сейчас уже нет возможности проверить был ли непосредственно удалён HGDIOBJECT.
После вызова для объекта DeleteObject() тот какое-то неизвестное время остаётся существующим/валидным и даже содержащим все прежные данные. Я проверял.
...
Рейтинг: 0 / 0
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
    #39665622
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто-нибудь объяснит мне о чём этот топик? Есть чёткие правила работы с контекстом. Им и надо следовать. А ещё лучше почитать Фень Юаня
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / [WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]