在MFC中,我正在加载一个.PNG图像,然后,我用静态控件显示它,如下所示:
CImage Img;
Img.Load(_T(abc.png"));
CBitMap Bmp;
Bmp.Attach(Img.Detach());
CStatic dispImg;
dispImg.SetBitmap(Bmp);
通过这种方式,我有几个图像,我正在重复显示静态控件 这导致我的应用程序中出现大量内存泄漏。我通过谷歌搜索发现了一些线索,但我无法决定释放内存的最佳选择。有人可以用最好的方法指导我。
答案 0 :(得分:0)
答案 1 :(得分:0)
正如xMRi建议我释放CStatic :: SetBitmap返回的HBITMAP句柄。在我的测试应用程序中有一个CStatic控件成员m_pic,一个方法ChangePic,它设置一个位图和一个按钮控件,用于根据布尔变量SetBlueImg的值更改图像。 ChangePic的定义如下:
void CPNGTestDlg::ChangePic(Cstring img)
{
CImage Img;
Img.Load(img);
CBitmap Bmp;
Bmp.Attach(Img.Detach());
HBITMAP hBmp=m_pic.SEtBitmap(Bmp);
if(hBmp!=NULL) DeleteObject(hBmp);
}
按钮的点击事件定义如下:
void CPNGTest::OnBnClickedChngPic()
{
if(SetBlueImg)
{
ChangePic(_T("Blue.png"));
SetBlueImg=false;
}
else
{
ChangePic(_T("Red.png"));
SetBlueImg=true;
}
}
SetBlueImg = true的初始值,在OnInitDialog()中我调用了ChangePic(_T(“Red.png”));
我运行应用程序并不断点击按钮来更改当前图像,但我仍然可以通过Windows任务管理器看到内存泄漏。单击按钮40/50次或有时无法预测后,内存的远足量为4KB。请指出我遗漏了导致泄漏的地方。
答案 2 :(得分:0)
为了在将静态控件上的一个图像替换为另一个图像时摆脱重叠的图像,我最初遵循以下步骤:
但我不知道这是否是解决图像重叠的正确方法。我通过谷歌搜索了一下,发现了以下方式:
答案 3 :(得分:0)
对话框销毁时,必须删除HBITMAP对象。
void CMFCAppDlg::OnDestroy()
{
CDialogEx::OnDestroy();
DeleteObject(m_pic.GetBitmap());
}