Top.Mail.Ru
Ответы
Аватар пользователя
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+4

Нужен ли вызов SelectObject()

Вот есть код:

12345678910
     HDC HDCMem = CreateCompatibleDC(Item->hDC); 
    HBITMAP hBitmap = CreateCompatibleBitmap(Item->hDC, Item->rcItem.right - Item->rcItem.left, Item->rcItem.bottom - Item->rcItem.top); 
    HGDIOBJ oldBitmap = SelectObject(HDCMem, hBitmap); 
 
    // Рисование

    SelectObject(HDCMem, oldBitmap); // Нужен ли вызов вот этой функции?
 
    DeleteObject(hBitmap); 
    DeleteDC(HDCMem); 

Как говорят на многих форумах, старый объект необходимо вернуть в контекст устройства, чтобы избежать утечки ресурсов. Но по сути никакой утечки ресурсов я не заметил, в диспетчере задач рядом с процессом можно посмотреть кол-во GDI объектов, при этом их количество у меня не меняется. Значит функция DeleteObject(hBitmap); срабатывает, хотя в MSDN написано: "Не удаляйте объект рисунка (перо или кисть), пока он все еще выбран в контроллере домена." Или утечка ресурсов подразумевает утечку оперативной памяти? Хотя наблюдая в диспетчере задач, оперативная память программы не становится больше, при каждой перерисовки окна

По дате
По рейтингу
Аватар пользователя
Мыслитель
11мес

Вызов SelectObject(HDCMem, oldBitmap); необходим. Это позволяет вернуть старый объект в контекст устройства, предотвращая утечки ресурсов. Без этого могут возникнуть проблемы, не сразу заметные в диспетчере задач. Утечка ресурсов может проявиться в более длительном использовании программы или в других системах с разной конфигурацией. Всегда следует возвращать старые объекты перед удалением, чтобы соблюсти правильное управление ресурсами GDI.