这段代码是双缓冲的一部份,用作窗体大小改变时,重新根据窗体的尺寸画一下背景图片.图片是要求满屏显示.
在测试的时候,当我频繁地改变窗口的大小之后,内存占用增长狂快. 可能什么对象未释放.请大家帮我看看.谢谢.
void CXxxView::InitialDBBBackground()
{
CDC *pDC= GetDC();//= GetDC()
CRect rt;
this->GetClientRect(&rt); //TempDC.CreateCompatibleDC(NULL);
ReleaseDC(&TempDC); if(!TempDC.CreateCompatibleDC(NULL))
{
::PostQuitMessage(0);
}
CBitmap TemPBitmap;
TemPBitmap.CreateCompatibleBitmap(pDC, rt.Width(), rt.Height());
::SelectObject(TempDC.GetSafeHdc(), TemPBitmap); Graphics imgraphics(TempDC.m_hDC);
//Image image(L"images\\img8.jpg");
imgraphics.DrawImage(pImage,0,0, rt.Width(), rt.Height()); imgraphics.ReleaseHDC(TempDC.GetSafeHdc());
//TemPBitmap.DeleteObject();
ReleaseDC(pDC);}
在测试的时候,当我频繁地改变窗口的大小之后,内存占用增长狂快. 可能什么对象未释放.请大家帮我看看.谢谢.
void CXxxView::InitialDBBBackground()
{
CDC *pDC= GetDC();//= GetDC()
CRect rt;
this->GetClientRect(&rt); //TempDC.CreateCompatibleDC(NULL);
ReleaseDC(&TempDC); if(!TempDC.CreateCompatibleDC(NULL))
{
::PostQuitMessage(0);
}
CBitmap TemPBitmap;
TemPBitmap.CreateCompatibleBitmap(pDC, rt.Width(), rt.Height());
::SelectObject(TempDC.GetSafeHdc(), TemPBitmap); Graphics imgraphics(TempDC.m_hDC);
//Image image(L"images\\img8.jpg");
imgraphics.DrawImage(pImage,0,0, rt.Width(), rt.Height()); imgraphics.ReleaseHDC(TempDC.GetSafeHdc());
//TemPBitmap.DeleteObject();
ReleaseDC(pDC);}
解决方案 »
- SetMenu//之后窗口的标题没出现---无标题//怎么去掉?
- 求一个在windows xp 或 win7 下能对NTFS磁盘扇区直接写的方法
- Win32编程问题,如果将_tWinMain入口点函数放到头文件里边呢?而且程序可以运行。人家是怎么样实现的?
- SetWindowsHookEx内部是怎么实现的?
- 一个超难的问题???
- 给在下推荐几本值得看的com书!!!谢谢各位!
- 如何让编译后的程序脱离VC也能运行?
- Access数据库救命啊~~~~~~!!!
- 路过的兄弟姐妹,帮帮忙!
- 如何让一个窗口不可以移动?而且总在最前(象oicq)?(用api)答对一个就给分!!!!!!!!!!!!
- 我想在CReBarCtrl中添加一个CToolBar,并在低部显示,现在出错了
- 请教这个引起这个问题的原因!谢谢!
{
CDC *pDC= GetDC();//= GetDC()
CRect rt;
this-> GetClientRect(&rt);
//TempDC.CreateCompatibleDC(NULL);
ReleaseDC(&TempDC);
if(!TempDC.CreateCompatibleDC(NULL))
{
::PostQuitMessage(0);
}
CBitmap TemPBitmap;
TemPBitmap.CreateCompatibleBitmap(pDC, rt.Width(), rt.Height());
HBITMAP hOldBitmap = ::SelectObject(TempDC.GetSafeHdc(), TemPBitmap); Graphics imgraphics(TempDC.m_hDC);
//Image image(L"images\\img8.jpg");
imgraphics.DrawImage(pImage,0,0, rt.Width(), rt.Height()); ::SelectObject(TempDC.GetSafeHdc(), hOldBitmap);
imgraphics.ReleaseHDC(TempDC.GetSafeHdc()); //TemPBitmap.DeleteObject();
ReleaseDC(pDC); }
或把
::SelectObject(TempDC.GetSafeHdc(), hOldBitmap);
imgraphics.ReleaseHDC(TempDC.GetSafeHdc());
位置互换
还有,GDI的释放有些乱,一定要匹配。
看起来有点乱,不就只有imgraphics.DrawImage(pImage,0,0, rt.Width(), rt.Height());这个是画图操作吗?
Image image(L"images\\img8.jpg");image的构造要用完整的路径吧?
{
if(isDBBInitialed)
return; CRect rt;
this->GetClientRect(&rt); CDC *pDC= GetDC(); //= GetDC()
ReleaseDC(&MemDC);
MemBitmap.DeleteObject(); // 为屏幕DC创建兼容的内存DC
if(!MemDC.CreateCompatibleDC(NULL))
{
::PostQuitMessage(0);
}
// 创建位图 //CreateCompatibleBitmap
MemBitmap.CreateCompatibleBitmap(pDC, rt.Width(), rt.Height());
// 相当于选择画布
::SelectObject(MemDC.GetSafeHdc(), MemBitmap);
MemBitmap.DeleteObject(); ReleaseDC(pDC);
isDBBInitialed = TRUE;
//AfxMessageBox("yes");
}
你更改了设备描述表,在完成你的绘制后要恢复原有的设备描述表,否则后面都一直在用你的MemBitmap在绘图
楼主不妨调试看看,是调用了哪句后内存开始狂涨的
你新建一个和Bitmap对象,然后SelectObject选进DC,那之前的Bitmap呢?你删除了么?你每次调用它都不断新建Bitmap,然后不断选入设备,但是之前选入设备的那些Bitmap没有得到删除,就留在内存中了。
这样做同时也改进了性能,又没有内在溢出的问题.最后谢谢各位的答复.给分结帖