[]MFC对话框窗体显示背景图片的代码,是否有内存泄漏
[求助]MFC对话框窗体显示背景图片的代码,是否有内存泄漏?
------解决方案--------------------
最好再加上:
ReleaseDC(&MemDC);
Bitmap.DeleteObject();
------解决方案--------------------
------解决方案--------------------
OldBitmap->DeleteObject(); //恢复设备环境
============
这个不对,OldBitmap是不用删除的。
改成这样:
CDC *pDC = GetDC();
CBitmap Bitmap;
Bitmap.LoadBitmap(IDB_BITMAP1);//将资源中的位图装入内存
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);//创建内存设备环境
CBitmap *OldBitmap=MemDC.SelectObject(&Bitmap);
BITMAP bm; //创建BITMAP 结构变量
Bitmap.GetBitmap(&bm); //获取位图信息
//pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&MemDC,0,0,SRCCOPY); //显示位图
pDC->StretchBlt(0,0,bm.bmWidth+30,bm.bmHeight+40,&MemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
MemDC.SelectObject(OldBitmap);//恢复Mem,并将Bitmap从CDC中选出来,否则Bitmap无法释放
Bitmap.DeleteObject();
ReleaseDC(pDC);
另外,MemDC可以不用调用ReleaseDC的,MSDN上的例子中就没有调用。
------解决方案--------------------
memdc是create的,即使要释放也要用memdc.DeleteDc()。
你可以跟着看看CDC的实现,他在析构函数里已经调用了DeleteDC(),因此这个就不用自己做了
- C/C++ code
//加载背景图片 Begin CDC *pDC = GetDC(); CBitmap Bitmap; Bitmap.LoadBitmap(IDB_BITMAP1);//将资源中的位图装入内存 CDC MemDC; MemDC.CreateCompatibleDC(pDC);//创建内存设备环境 CBitmap *OldBitmap=MemDC.SelectObject(&Bitmap); BITMAP bm; //创建BITMAP 结构变量 Bitmap.GetBitmap(&bm); //获取位图信息 //pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&MemDC,0,0,SRCCOPY); //显示位图 pDC->StretchBlt(0,0,bm.bmWidth+30,bm.bmHeight+40,&MemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY); OldBitmap->DeleteObject(); //恢复设备环境 ReleaseDC(pDC); //加载背景图片 END
------解决方案--------------------
最好再加上:
ReleaseDC(&MemDC);
Bitmap.DeleteObject();
------解决方案--------------------
------解决方案--------------------
OldBitmap->DeleteObject(); //恢复设备环境
============
这个不对,OldBitmap是不用删除的。
改成这样:
CDC *pDC = GetDC();
CBitmap Bitmap;
Bitmap.LoadBitmap(IDB_BITMAP1);//将资源中的位图装入内存
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);//创建内存设备环境
CBitmap *OldBitmap=MemDC.SelectObject(&Bitmap);
BITMAP bm; //创建BITMAP 结构变量
Bitmap.GetBitmap(&bm); //获取位图信息
//pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&MemDC,0,0,SRCCOPY); //显示位图
pDC->StretchBlt(0,0,bm.bmWidth+30,bm.bmHeight+40,&MemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
MemDC.SelectObject(OldBitmap);//恢复Mem,并将Bitmap从CDC中选出来,否则Bitmap无法释放
Bitmap.DeleteObject();
ReleaseDC(pDC);
另外,MemDC可以不用调用ReleaseDC的,MSDN上的例子中就没有调用。
------解决方案--------------------
memdc是create的,即使要释放也要用memdc.DeleteDc()。
你可以跟着看看CDC的实现,他在析构函数里已经调用了DeleteDC(),因此这个就不用自己做了
- C/C++ code
HDC CDC::Detach() { HDC hDC = m_hDC; if (hDC != NULL) { CHandleMap* pMap = afxMapHDC(); // don't create if not exist if (pMap != NULL) pMap->RemoveHandle(m_hDC); } ReleaseAttribDC(); m_hDC = NULL; return hDC; } BOOL CDC::DeleteDC() { if (m_hDC == NULL) return FALSE; return ::DeleteDC(Detach()); } CDC::~CDC() { if (m_hDC != NULL) ::DeleteDC(Detach()); }
------解决方案--------------------
这段代码没有什么泄露
没有new而且都是用MFC的类
MFC会安全释放资源