这段代码是双缓冲的一部份,用作窗体大小改变时,重新根据窗体的尺寸画一下背景图片.图片是要求满屏显示.
在测试的时候,当我频繁地改变窗口的大小之后,内存占用增长狂快. 可能什么对象未释放.请大家帮我看看.谢谢.
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);}

解决方案 »

  1.   

    imgraphics.ReleaseHDC(TempDC.GetSafeHdc()); 做了什么?至少也应该好像下面这样: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()); 
    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); }
      

  2.   

    补充:
    或把
        ::SelectObject(TempDC.GetSafeHdc(),   hOldBitmap);
        imgraphics.ReleaseHDC(TempDC.GetSafeHdc()); 
    位置互换
      

  3.   

    TempDC.CreateCompatibleDC(NULL)? NULL表示你获取的是屏幕DC,不是你的view的DC,要设置你的VIEW的HDC才行。
    还有,GDI的释放有些乱,一定要匹配。
      

  4.   

    上面的代码一定编译通不过吧,贴出可以编译通过的完整代码啊.
    看起来有点乱,不就只有imgraphics.DrawImage(pImage,0,0,   rt.Width(),   rt.Height());这个是画图操作吗?
    Image   image(L"images\\img8.jpg");image的构造要用完整的路径吧?
      

  5.   

    4楼的,image我已经在另的地方加载了.问题还没能解决.请再帮我看看下面这段代码. 解决之后立即给分.void CXxxView::InitialDBB()
    {
    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");
    }
      

  6.   

    别的没看出来,至少SelectObject要成对出现才是
    你更改了设备描述表,在完成你的绘制后要恢复原有的设备描述表,否则后面都一直在用你的MemBitmap在绘图
    楼主不妨调试看看,是调用了哪句后内存开始狂涨的
      

  7.   


    你新建一个和Bitmap对象,然后SelectObject选进DC,那之前的Bitmap呢?你删除了么?你每次调用它都不断新建Bitmap,然后不断选入设备,但是之前选入设备的那些Bitmap没有得到删除,就留在内存中了。
      

  8.   

     ReleaseDC(&MemDC);你是创建的dc 要用DeleteDC();MemDC 是CDC 对像? MemDC.DeleteDC();
      

  9.   

    MemDC是一个全局变量,我在程序中一直要用的,所以不能释放掉.最终我想其它办法解决了这个问题. 把以前每次都执行这段代码,改为程序启动的时候只执行一次.
    这样做同时也改进了性能,又没有内在溢出的问题.最后谢谢各位的答复.给分结帖