Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/25: Рейтинг темы: голосов - 25, средняя оценка - 4.56
1 / 1 / 0
Регистрация: 26.04.2014
Сообщений: 7

Про "излишество" GDI объектов: CreateCompatibleDC() и CreateCompatibleBitmap()

05.05.2014, 23:21. Показов 5037. Ответов 2

Студворк — интернет-сервис помощи студентам
Доброго времени суток, товарищи программисты))
Возник такой вопрос:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
case WM_PAINT:
        {
            hDC = BeginPaint(hWnd, &ps);
            HDC Comp = CreateCompatibleDC(hDC);
            HBITMAP bitmap = CreateCompatibleBitmap(hDC, 100, 100);
            SelectObject(Comp, bitmap);
            Rectangle(Comp, 20, 20 ,80, 80);
            if(!DeleteObject(bitmap)) MessageBox(0, "ERROR", "ERROR", MB_OK);
            BitBlt(hDC, 0, 0, 100, 100, Comp, 0, 0, SRCCOPY);
            DeleteDC(Comp);
            EndPaint(hWnd, &ps);
            break;
        }
Функция DeleteObject(bitmap) сработала, но в то же время всё замечательно вывелось на экран. Из этого я, как старающийся всё объяснить себе студент, делаю вывод, что SelectObject(Comp, bitmap) скопировала bitmap в Сomp, т.е. не просто скопировала хэндл (это ведь, насколько я могу судить, указатель) на битмап, а именно скопировала содержимое этого битмапа. Ведь в противном случае после DeleteObject(bitmap) пострадал бы и тот битмап, который выбран в Comp, и ничего хорошего бы ждать не пришлось.

С другой стороны:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    case WM_PAINT:
        {
            hDC = BeginPaint(hWnd, &ps);
            HDC Comp = CreateCompatibleDC(hDC);
            HBITMAP bitmap = CreateCompatibleBitmap(hDC, 100, 100);
            SelectObject(Comp, bitmap);
            Rectangle(Comp, 20, 20 ,80, 80);
            DeleteDC(Comp);
            Comp = CreateCompatibleDC(hDC);
            SelectObject(Comp, bitmap);
            BitBlt(hDC, 0, 0, 100, 100, Comp, 0, 0, SRCCOPY);
            DeleteDC(Comp);
            DeleteObject(bitmap);
            EndPaint(hWnd, &ps);
            break;
        }
Всё замечательно вышло!!! Получается, что когда я рисовал в Comp, изменялась и сама картинка bitmap. Но значит всё таки SelectObject(Comp, bitmap) не копирует содержимое битмапа в совместимый контекст, а выбирает картинку по адресу.

Я чувствую, что несу бред, но я постарался как можно лучше показать, что я не понимаю. Распутайте меня пожалуйста))
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.05.2014, 23:21
Ответы с готовыми решениями:

Зачем CreateCompatibleBitmap/CreateCompatibleDC
MFC Зачем CreateCompatibleBitmap/CreateCompatibleDC? Почему мы не можем рисовать, например, сразу в текущем контексте, почему мы должны...

Копирование GDI объектов
Речь скорее не о копировании самих объектов и их ресурсов для создания других объектов GDI. Есть функция GetObject, но она лишь...

Удаление объектов GDI
Почему нужно удалять созданные (например так: hRgn = CreateRectRgn(0, 0, 0, 0); ) объекты GDI? ну то есть зачем их удалять явно?...

2
 Аватар для BOGG ART
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
07.10.2016, 17:23
Цитата Сообщение от zer_ik Посмотреть сообщение
делаю вывод, что SelectObject(Comp, bitmap) скопировала bitmap в Сomp
Нет.
Цитата Сообщение от zer_ik Посмотреть сообщение
хэндл (это ведь, насколько я могу судить, указатель) на битмап
Нет. То есть это точно не известно и утверждать так нельзя. Это "идентификатор".
Цитата Сообщение от zer_ik Посмотреть сообщение
после DeleteObject(bitmap) пострадал бы и тот битмап
Нет. На самом деле эта функция "освобождает ресурс", а не конкретно "уничтожает" его.
Цитата Сообщение от zer_ik Посмотреть сообщение
SelectObject(Comp, bitmap) не копирует содержимое битмапа в совместимый контекст, а выбирает картинку по адресу
Да. Впрочем это видно и из её названия - "ВыбратьОбъект".
0
 Аватар для garry_neuznik
11 / 11 / 9
Регистрация: 04.09.2016
Сообщений: 41
08.10.2016, 03:16
Цитата Сообщение от zer_ik Посмотреть сообщение
SelectObject(Comp, bitmap) скопировала bitmap
ну да. вот например обои - выбираются также в контекст, а он их сохраняет. также сохраняются и кисти, это же тоже битовые образы.

Добавлено через 6 часов 5 минут
соврал. кисти явно не сохраняются
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.10.2016, 03:16
Помогаю со студенческими работами здесь

Редактирование объектов GDI+ (Перемещение, растягивание)
Доброго времени суток! Возникла проблема при написании графического редактора. Необходимо перетаскивать по форме (PictureBox или Panel)...

Последствия неудаления созданных объектов GDI
Собственно вопрос в шапке, а тут - пояснение: допустим я создал несколько объектов (кисть, перо, регион и др.), я не совсем понимаю зачем...

GDI+ , принцип перемещения графических объектов
Вообщем дано. GDIplus::Graphics созданный с memory device context. Рисую фигуры, обновляю окно посредством UpdateLayeredWindow. ...

Как корректно освобождать память (удалять) объектов GDI+?
Ну собственно вопрос в шапке. Например есть Image *img; Как его правильно удалить, чтоб избежать мемори ликсов?

Есть ли в WPF полноценная замена GDI+? Чтобы можно было всё, что можно в GDI+? Просто думаю углубляться в работу с изображениями в WPF или GDI.
Ну собственно весь вопрос в заголовке темы.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru