2012-04-11 2 views
2

Я работаю над приложением Windows с C++. Я загружаю файл BMP в DC с использованием LoadImage, и он отображается правильно. Однако, когда я вызываю DeleteObject, память, похоже, не освобождается. (Я использую окна диспетчера задач для отслеживания использования памяти)Как правильно использовать LoadImage и DeleteObject?

В части WM_INITDIALOG я делаю это:

static HBITMAP hBitmap = 0; 
char* tempPath = "tabView.bmp"; 
hBitmap = (HBITMAP)LoadImage(NULL, 
          tempPath, // file containing bitmap 
          IMAGE_BITMAP, // type = bitmap 
          0, 0,  // original size 
          LR_LOADFROMFILE);  // get image from a file 
if(hBitmap) 
{ 
    SendMessage(GetDlgItem(hwndDlg, IDC_PICTURE), 
       STM_SETIMAGE,   // message to send 
       (WPARAM)IMAGE_BITMAP, // bitmap type 
       (LPARAM)hBitmap);  // bitmap handle 
} 

Так картина проявляется в DC, и увеличение памяти. А кнопки я:

int result = DeleteObject(hBitmap); 

Когда я нажимаю кнопку, я проверил результат, и это ненулевое значение, что это успех. Но IDC_PICTURE все равно покажет изображение, а память останется прежней. Мне интересно, может ли SendMessage() увеличить количество ссылок на hBitmap ...

Итак, мой вопрос: что такое правильный способ очистки?

+1

Диспетчер задач не подходит для проверки утечки. Поместите это в цикл, который работает вечно, и посмотрите, не закончилось ли вы или нет. –

ответ

1

Вы не указали, какую версию Windows вы используете. В любом случае, если вы прочтете «Важную» часть STM_SETIMAGE, вы увидите следующее:

В Windows XP, если битмап, переданный в сообщении STM_SETIMAGE, содержит пиксели с ненулевой альфа, статический элемент управления принимает копию растрового изображения. Это скопированное растровое изображение возвращается следующим сообщением STM_SETIMAGE. Клиентский код может независимо отслеживать битмапы, переданные статическому элементу управления, но если он не проверяет и не выводит растровые изображения, возвращаемые из сообщений STM_SETIMAGE, растровые изображения просачиваются.

Возможно, это относится не только к Windows XP, но и для более поздней версии Windows. Надеюсь, что это поможет вам.

+0

Спасибо! Это именно то, что происходит. Такой странный способ обработки ресурса, хотя ... «Это скопированное растровое изображение возвращается следующим сообщением STM_SETIMAGE». Что делать, если я не хочу отправлять еще один STM_SETIMAGE? – laishiekai

+0

Вы можете вспомнить исходное возвращаемое значение и отправить его обратно, когда будете готовы избавиться от изображения. –

Смежные вопросы