打开一个对话框,再关闭该对话框,用任务管理器观察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);
不知道为什么,请大侠指点。
我检查了下代码,我所有创建的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);
不知道为什么,请大侠指点。
解决方案 »
- 图像赋值
- MFC中文件读写问题
- 问个简单的问题!!!!!!!
- 关于辅助线程的问题(江湖救急)
- 在线等待:在dll中封装无模式对话框?
- 那位大虾知道使计算机进入睡眠状态的函数
- 如果用access数据库,是否对使用的操作系统有限制(就是说是否是win95,98,me,nt,2000,xp都可用?),是否要安装office?
- 一个送分提:如何在程序中重新调用OnInitDialog()函数?
- 一个简单的问题无人能答
- 我用import引用了一个dll,请问vc应该怎样响应接口里面的消息呢
- 用VC使用MSChart组件的时候Y轴标题老实显示不完整!急死了!
- VC 在MFC里如何捕获全局异常 要不那个入口相当main中能使用__try __except
=========
指针没有释放
放在Return语句之后。
第一段代码, 除此之外没看到其他问题应该是其他代码段的问题
Attach要对应Detach
另外,将getdc放到return 后!
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!
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);楼主这样试试!