打开一个对话框,再关闭该对话框,用任务管理器观察GDI对象数,发现每次必增加4。
我检查了下代码,我所有创建的GDI对象,到最后我都DeleteObject了。部分代码如下:
CDC* pdc=GetDC();
CTreeCtrl* pTree=(CTreeCtrl*)GetDlgItem(IDC_SEL_GROUP_TREE);
if(!pTree)
return FALSE;
CRect rect;
pTree->GetWindowRect(&rect);
ScreenToClient(&rect);
rect.DeflateRect(-1,-1,-1,-1);
CBrush brush;
brush.CreateStockObject(NULL_BRUSH);
CBrush* OldBrush=pdc->SelectObject(&brush);
CPen pen(PS_SOLID,1,RGB(0,102,255));
CPen* OldPen=pdc->SelectObject(&pen); pdc->Rectangle(&rect); pdc->SelectObject(OldBrush);
brush.DeleteObject();
pdc->SelectObject(OldPen);
pen.DeleteObject();
ReleaseDC(pdc);HBITMAP hBitItemImg=(HBITMAP)::LoadImage(NULL,s+="TreeItemImg.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
CBitmap bitItemImg;
bitItemImg.Attach(hBitItemImg);
m_cTreeRecordList.Add(&bitItemImg,RGB(255,255,255));//图像列表
bitItemImg.DeleteObject();
s.Empty();
pTree->SetImageList (&m_cTreeRecordList, TVSIL_NORMAL);
不知道为什么,请大侠指点。

解决方案 »

  1.   

    CBrush* OldBrush=pdc->SelectObject(&brush);
    =========
    指针没有释放
      

  2.   

    1. CDC* pdc=GetDC();
       放在Return语句之后。
     第一段代码, 除此之外没看到其他问题应该是其他代码段的问题
      

  3.   

    LoadImage要对应一个DeleteObject
    Attach要对应Detach 
    另外,将getdc放到return 后!
      

  4.   

    CDC* pdc=GetDC();
        CTreeCtrl* pTree=(CTreeCtrl*)GetDlgItem(IDC_SEL_GROUP_TREE);
        if(!pTree)
            return FALSE;
    这部分代码是可能发生错误,但是,不一定会!主要看pTree是否能得到!但是,我觉的,可能不会,因为刷新的次数多的话,就不是固定的4个了!所以,我认为是下面的:HBITMAP hBitItemImg=(HBITMAP)::LoadImage(NULL,s+="TreeItemImg.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
        CBitmap bitItemImg;
        bitItemImg.Attach(hBitItemImg);
        m_cTreeRecordList.Add(&bitItemImg,RGB(255,255,255));//图像列表
        bitItemImg.DeleteObject();
        s.Empty();
        pTree->SetImageList (&m_cTreeRecordList, TVSIL_NORMAL);
    这部分代码会必然造成GDI资源泄露!LoadImage没有对应一个DeleteObject,Attach没有对应Detach!  
      

  5.   

    HBITMAP hBitItemImg=(HBITMAP)::LoadImage(NULL,s+="TreeItemImg.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
      CBitmap bitItemImg;
      bitItemImg.Attach(hBitItemImg);
      m_cTreeRecordList.Add(&bitItemImg,RGB(255,255,255));//图像列表
      //bitItemImg.DeleteObject();
      bitItemImg.Detach();
      s.Empty();
      ::DeleteObject(hBitItemImg);
      pTree->SetImageList (&m_cTreeRecordList, TVSIL_NORMAL);楼主这样试试!
      

  6.   

    你再看看,那儿用到GDI资源!这样的话,如果打开100次,岂不是增加400个?
      

  7.   

    检查一下其他的代码行,涉及GDI资源的代码行都需要测试一下
      

  8.   

    应该是找到问题了,看下http://blog.csdn.net/vvviippp/article/details/7046458
      

  9.   

    怎么解决的呢?我也遇到类似问题,但是GDI每次增加2,请大侠指点啊~~