如何正确使用LoadImage和DeleteObject?

我正在使用C的Windows应用程序 . 我使用LoadImage将bmp文件加载到DC,并且它正确显示 . 但是,当我调用DeleteObject时,内存似乎没有被释放 . (我使用Windows任务管理器来跟踪内存使用情况)

在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)

2 years ago

您没有提到您正在使用的Windows版本 . 无论如何,如果您阅读STM_SETIMAGE的"Important"部分,您会看到下一个:

对于Windows XP,如果STM_SETIMAGE消息中传递的位图包含具有非零alpha的像素,则静态控件将获取位图的副本 . 这个复制的位图由下一个STM_SETIMAGE消息返回 . 客户端代码可以独立跟踪传递给静态控件的位图,但如果它不检查并释放从STM_SETIMAGE消息返回的位图,则位图将泄露 .

也许这不仅适用于Windows XP,也适用于Windows的更高版本 . 希望这会帮助你 .