|
|
|
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
|
|||
|---|---|---|---|
|
#18+
Ветки конкретно по WinAPI почему-то нету. Почему? Сам ж WinAPI не зависит от языка. Ну да ладно, изначально хотел написать в C++, но там "У вас нет прав на добавление сообщений в данный форум" . Вопрос такой: Я создал свой HBITMAP нужного мне формата и размера, захотел на нём порисовать. Рисовать можно только на HDC. Ну ладно - создал временный служебный HDC. Соединил HDC и HBITMAP функцией SelectObject(). Рисую (проверял, всё рисуется), после этого мне надо отдать свой HBITMAP и забыть про него (там уже сами должны управлять/освобождать). Но что мне cделать с HDC? Вернее как мне убрать из него мой HBITMAP ? Если я вызову DeleteDC() - то мой HBITMAP же тоже пометится освобождённым, так ведь? Или как вопрос наоборот - если при DeleteDC() связанный HBITMAP не освобождается, то как тогда его вообще корректно освобождать? Может есть функция обратная SelectObject(), просто я её не нашёл? Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2018, 19:06 |
|
||
|
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
|
|||
|---|---|---|---|
|
#18+
Сверкающий, 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2018, 19:11 |
|
||
|
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
|
|||
|---|---|---|---|
|
#18+
СверкающийЕсли я вызову DeleteDC() - то мой HBITMAP же тоже пометится освобождённым, так ведь? С чего ты это взял? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2018, 19:12 |
|
||
|
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
|
|||
|---|---|---|---|
|
#18+
С чего ты это взял?Читал. То ли в самом MSDN, то ли в каком-то переводе онного на русский, хотя возможно что и в книге по графике в WinAPI. object being replacedм? Но если я только что создал скажем так "пустой" HDC - разве в нём уже есть какой-либо HBITMAP? Большое спасибо, сейчас попробую! Только видимо не "равно нулю", а проверять что вернуло именно мой HBITMAP - это будет обозначать что он отсоеденён! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2018, 19:23 |
|
||
|
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
|
|||
|---|---|---|---|
|
#18+
СверкающийТолько видимо не "равно нулю", а проверять что вернуло именно мой 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 и не битмап, значит где-то раньше его уже заменили... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2018, 19:27 |
|
||
|
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
|
|||
|---|---|---|---|
|
#18+
о... Вот как... Надо бы подробнее проштудировать... Но где раньше-то? Я же сам только что создал. И сам выбираю. и не битмапэм... А я не знаю как проверить - битмап это или нет... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2018, 19:35 |
|
||
|
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
|
|||
|---|---|---|---|
|
#18+
а... Или вы имели ввиду "не мой битмап"? :) Пардон) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2018, 19:36 |
|
||
|
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
|
|||
|---|---|---|---|
|
#18+
Сверкающийимели ввиду "не мой битмап" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2018, 20:29 |
|
||
|
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
|
|||
|---|---|---|---|
|
#18+
СверкающийЧитал. То ли в самом MSDN, то ли в каком-то переводе онного на русский, хотя возможно что и в книге по графике в WinAPI. Если это в книге - в печь. На самом MSDN ничего даже отдалённо похожего не написано. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2018, 21:09 |
|
||
|
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
|
|||
|---|---|---|---|
|
#18+
Вы уверены? 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 объектами" я что-то сходу не нашёл... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2018, 02:54 |
|
||
|
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
|
|||
|---|---|---|---|
|
#18+
СверкающийВопрос: если, как вы говорите, DeleteDC() не удаляет связанные с ним объекты - тогда кто же удаляет этот "битмап по умолчанию"..? Это же очевидно: тот, кто его создал. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2018, 12:15 |
|
||
|
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
|
|||
|---|---|---|---|
|
#18+
Сверкающий, Принципа "не ты выдал - не ты забираешь" - недостаточно? Создал контекст, сохранил оригинал объекта, поюзал, вернул оригинал, удалил. Ну и у Эпплмана написано, что вызов DeleteDC освобождает всю память, выделенную при создании... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2018, 12:38 |
|
||
|
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
|
|||
|---|---|---|---|
|
#18+
ma1tusНу и у Эпплмана написано, что вызов DeleteDC освобождает всю память, выделенную при создании... Ключевое слово "при создании". А аффтар думает, что будет освобождено ещё и то, что назначили в качестве внешней ссылки. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2018, 12:54 |
|
||
|
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovma1tusНу и у Эпплмана написано, что вызов DeleteDC освобождает всю память, выделенную при создании... Ключевое слово "при создании". А аффтар думает, что будет освобождено ещё и то, что назначили в качестве внешней ссылки. На самом деле напрямую нигде не говорится, что будет освобождено то, что было назначено "извне", но зато везде говорится что после рисования необходимо вернуть на место все исходные объекты . Подробнее тут . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2018, 18:39 |
|
||
|
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
|
|||
|---|---|---|---|
|
#18+
alekcvpпосле рисования необходимо вернуть на место все исходные объекты Это утверждение неверно. При создании DC битмап будет пустым, а остальные атрибуты заполнены stock-объектами. Т.е. вместе с DC ничего дополнительно не создается. Соответственно, не будет и удаляться. Поэтому перед или после удаления нужно только свои объекты чистить, если нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2018, 18:47 |
|
||
|
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
|
|||
|---|---|---|---|
|
#18+
Соколинский Борис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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2018, 19:10 |
|
||
|
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
|
|||
|---|---|---|---|
|
#18+
alekcvpMicrosoft'у об этом расскажите: Зачем? Это элементарно проверяется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2018, 19:15 |
|
||
|
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
|
|||
|---|---|---|---|
|
#18+
Соколинский БорисalekcvpMicrosoft'у об этом расскажите: Зачем? Это элементарно проверяется. Затем, что если сейчас это так - это не значит что в один прекрасный момент это не поменяется. И тогда все программы, которые не используют рекомендуемую реализацию могут столкнуться с "неожиданными трудностями" (С). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2018, 19:31 |
|
||
|
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
|
|||
|---|---|---|---|
|
#18+
alekcvpЗатем, что если сейчас это так - это не значит что в один прекрасный момент это не поменяется. И тогда все программы, которые не используют рекомендуемую реализацию могут столкнуться с "неожиданными трудностями" (С).Если за 20 лет в этом месте ничего не менялось вряд ли измениться когда-либо позже. Напротив, менялось как раз то, на что в ранней документации не было никаких указаний. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2018, 21:01 |
|
||
|
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
|
|||
|---|---|---|---|
|
#18+
alekcvpпосле рисования необходимо вернуть на место все исходные объекты Да, написано после выполнения своих действий слудует возвращать на место как было, видел, читал. Также написано не удалять объекты, пока они ещё выбраны в контекст. А ещё написано что впоследствии выяснилось что этим двум правилам почему-то мало кто следовал на практике, и были жуткие утечки. И тогда в новых версиях ОС ввели какие-то изменения. Например раньше DeleteObject() именно и сразу "удалял", но если объект при этом оставался куда-то выбранным - то по факту удаления не происходило, и получалась утечка. Сейчас DeleteObject() не делает непосредственного удаления. Он "освобождает", или иначе "помечает освобождёным". Объект существует ещё какое-то время, а удаляется позже ( отложенное удаление ). Поэтому неофициально стало можно применять DeleteObject() на ещё выбраные в контекст объекты. Документация всё ещё запрещает так делать, но система уже штатно ожидает нарушения и обрабатывает вполне корректно. И мне кажется что правило возвращать в исходное состояние относится только к ситуациям когда HDC приходит откуда-то извне и дальше пойдёт неизвестно куда. Когда не мы его "курируем". Соколинский Борисатрибуты заполнены stock-объектами Ах, да - а stock-объекты же удалять не нужно ( интересно почему конкретно ). гм... Тогда вполне можно предположить что тот "битмап по умолчанию" - это возможно также некий специальный stock-объект? И тогда да, удалять его не требуется... ma1tusСоздал контекст, сохранил оригинал объекта, поюзал, вернул оригинал, удалил. А если мне требуется не единично "порисовать" на чём-то и отпустить на обработку дальше, а создать/хранить/управлять/использовать самостоятельно на протяжении допустим ближайшего часа/двух/трёх? Мне всё это время надо хранить ещё и "битмап по умолчанию"? Или он stock-объект и про него можно просто забыть? Или сперва сделать ему DeleteObject(), а потом забыть? Зачем его возвращать, если он или stock или уже удалён? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2018, 21:50 |
|
||
|
[WinAPI] Как удалить HDC не удаляя выбранный в него HBITMAP или как убрать HBITMAP из HDC?
|
|||
|---|---|---|---|
|
#18+
Я не "думает", я "спрашивает". Потому что в документации этого не указано явно . Создали HDC. Создали HBITMAP. Выбрали HBITMAP в HDC. Теперь HBITMAP помечен выбранным в этот HDC, а сам HDC запомнил что его текущий битмап тот что мы ему задали. Что конкретно будет, если мы (или кто-то другой) возьмёт да и вызовет DeleteDC()? Забыли или не знали что там HBITMAP. HDC удалится корректно и полностью? А HBITMAP случайно не пометится ли освобождённым? А если не пометится - перестанет ли он иметь статус выбраного в тот HDC? В документации не сказано что именно будет. Там не сказано что удалится. Но и что не удалится также не сказано. Может он просто отвяжется от контекста - но это также не сказано. Или даже не отвяжется? Я просто хочу разобраться - что будет. Соколинский БорисЭто элементарно проверяется. Увы, но нет. Выше я описал какие изменения были с DeleteObject(). Не знаю как раньше, а сейчас уже нет возможности проверить был ли непосредственно удалён HGDIOBJECT. После вызова для объекта DeleteObject() тот какое-то неизвестное время остаётся существующим/валидным и даже содержащим все прежные данные. Я проверял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2018, 21:55 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39665601&tid=2040699]: |
0ms |
get settings: |
8ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
158ms |
get topic data: |
9ms |
get forum data: |
4ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 234ms |
| total: | 495ms |

| 0 / 0 |
