首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确使用LoadImage和DeleteObject?

如何正确使用LoadImage和DeleteObject?
EN

Stack Overflow用户
提问于 2012-04-12 03:18:44
回答 1查看 2.7K关注 0票数 2

我正在使用C++开发一个windows应用程序。我使用LoadImage将bmp文件加载到DC,它可以正常显示。但是,当我调用DeleteObject时,内存似乎没有被释放。(我使用windows任务管理器来跟踪内存使用情况)

在WM_INITDIALOG部分中,我这样做:

代码语言:javascript
复制
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中,并且内存增加。在一个按钮中,我做到了:

代码语言:javascript
复制
int result = DeleteObject(hBitmap);

当我按下按钮时,我检查了结果,它是一个非零值,这是成功。但是IDC_PICTURE仍然会显示图片,内存保持不变。我想知道SendMessage()是否会增加hBitmap上的引用计数...

所以我的问题是:什么是正确的清理方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-12 04:02:12

您没有提到您使用的是什么版本的Windows。无论如何,如果你阅读了STM_SETIMAGE的“重要”部分,你会看到下面的内容:

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

也许这不仅适用于Windows XP,也适用于更高版本的Windows。希望这能对你有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10112470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档