各位大侠进来帮我看看GDI泄漏问题
时间:2011-12-23
来源:互联网
这是我写的浏览器的选项卡区域绘制代码,运行后GDI对象飙升,已经确定是这段出了问题,请各位大侠指出错误在哪里:
C/C++ code
C/C++ code
CMainFrame* pMainWnd = (CMainFrame*) AfxGetMainWnd(); CHappyInternet70View* pCurrentView=NULL; if(!pMainWnd->IsIconic()) { CPaintDC dc(this); // device context for painting // TODO: 在此处添加消息处理程序代码 // 不为绘图消息调用 CTabCtrl::OnPaint() CDC *pDC=this->GetDC(); CDC memDC; memDC.CreateCompatibleDC(pDC); CBitmap bmp; CRect rcClient; GetClientRect(rcClient); bmp.CreateCompatibleBitmap(pDC,rcClient.Width(),rcClient.Height()); CBitmap *pOldBitmap=memDC.SelectObject(&bmp); CMainFrame* pMainWnd = (CMainFrame*) AfxGetMainWnd(); int pitemvalue; CBrush Brush; Brush.CreateSolidBrush(RGB(pMainWnd->m_wndReBar.m_r,pMainWnd->m_wndReBar.m_g,pMainWnd->m_wndReBar.m_b)); CBrush Brush2; Brush2.CreateSolidBrush(RGB(240,240,240)); CBrush Brush3; Brush3.CreateSolidBrush(RGB(210,210,210)); CPen pen(PS_SOLID,1,RGB(148,175,203)); CPen pen2(PS_SOLID,1,RGB(pMainWnd->m_wndReBar.m_r,pMainWnd->m_wndReBar.m_g,pMainWnd->m_wndReBar.m_b)); CPen *pOldPen=memDC.SelectObject(&pen); memDC.MoveTo(rcClient.left+2,rcClient.top); memDC.LineTo(rcClient.right,rcClient.top); CRect yrect(rcClient.left,rcClient.top,rcClient.left+2,rcClient.bottom); CRect zrect; GetItemRect(pMainWnd->m_childvalue-1,&zrect); memDC.FillRect(&yrect,&Brush); memDC.FillRect(CRect(zrect.right,rcClient.top,rcClient.right,rcClient.bottom),&Brush); CView *pview; CFont font; font.CreatePointFont(90, _T("宋体 ")); CFont *pOldFont=memDC.SelectObject(&font); for(pitemvalue=0;pitemvalue<pMainWnd->m_childvalue;pitemvalue++) { CRect xrect; GetItemRect(pitemvalue,&xrect); CRect rect(xrect.left,xrect.top-1,xrect.right,xrect.bottom); CString m_itemtext; TCITEM pTabCtrlItem; GetItem(pitemvalue,&pTabCtrlItem); pview = (CView*)pTabCtrlItem.lParam; pview->GetParentFrame()->GetWindowTextW(m_itemtext); if(GetCurSel()==pitemvalue){ memDC.SetBkColor(RGB(240,240,240)); memDC.FillRect(&rect,&Brush2); } else { memDC.FillRect(&rect,&Brush3); } CSize size=memDC.GetTextExtent(m_itemtext,m_itemtext.GetLength()); int a=0; for(;size.cx>rect.Width()-40;m_itemtext=m_itemtext.Left(m_itemtext.GetLength()-1)) { a++; size=memDC.GetTextExtent(m_itemtext,m_itemtext.GetLength()); } if(a>1) { m_itemtext=m_itemtext.Left(m_itemtext.GetLength()-1); m_itemtext.Append(_T("...")); } if(GetCurSel()==pitemvalue){ memDC.SetBkColor(RGB(240,240,240)); } else { memDC.SetBkColor(RGB(210,210,210)); } TextOut(memDC,rect.left+25,(rect.Height()/3)*1,m_itemtext,m_itemtext.GetLength()); pCurrentView=(CHappyInternet70View*)pview; if(pCurrentView->IsIcon) { HICON ico= (HICON)LoadImage(NULL,pCurrentView->m_url_Icon,IMAGE_ICON,32,32,LR_LOADFROMFILE | LR_DEFAULTSIZE); memDC.SelectObject(&ico); DrawIconEx(memDC.m_hDC,rect.left+5,(rect.Height()/3)-2,ico,16,16,NULL,NULL,DI_NORMAL); } else { HICON ico= (HICON)LoadImage(NULL,_T(".//Happy Internet 7.0.ico"),IMAGE_ICON,32,32,LR_LOADFROMFILE |LR_DEFAULTSIZE); memDC.SelectObject(&ico); DrawIconEx(memDC.m_hDC,rect.left+5,(rect.Height()/3)-2,ico,16,16,NULL,NULL,DI_NORMAL); } int reduce=2; memDC.SelectObject(&pen); memDC.MoveTo(rect.left,rect.top-reduce); memDC.LineTo(rect.left,rect.bottom); memDC.MoveTo(rect.right,rect.top-reduce); memDC.LineTo(rect.right,rect.bottom); memDC.MoveTo(rect.left,rect.top-reduce+4); memDC.LineTo(rect.left+4,rect.top-reduce); memDC.MoveTo(rect.right,rect.top-reduce+4); memDC.LineTo(rect.right-3,rect.top-reduce); memDC.SelectObject(&pen2); memDC.MoveTo(rect.left,rect.top-reduce); memDC.LineTo(rect.left,rect.top-reduce); memDC.MoveTo(rect.left,rect.top-reduce+1); memDC.LineTo(rect.left+1,rect.top-reduce); memDC.MoveTo(rect.left,rect.top-reduce+2); memDC.LineTo(rect.left+2,rect.top-reduce); memDC.MoveTo(rect.left,rect.top-reduce+3); memDC.LineTo(rect.left+3,rect.top-reduce); memDC.MoveTo(rect.right,rect.top-reduce); memDC.LineTo(rect.right,rect.bottom); memDC.MoveTo(rect.right,rect.top-reduce); memDC.LineTo(rect.right,rect.top-reduce); memDC.MoveTo(rect.right,rect.top-reduce+1); memDC.LineTo(rect.right-1,rect.top-reduce); memDC.MoveTo(rect.right,rect.top-reduce+2); memDC.LineTo(rect.right-2,rect.top-reduce); memDC.MoveTo(rect.right,rect.top-reduce+3); memDC.LineTo(rect.right-3,rect.top-reduce); } pDC->BitBlt(0,0,rcClient.Width(),rcClient.Height(),&memDC,0,0,SRCCOPY); memDC.SelectObject(pOldBitmap); memDC.SelectObject(pOldPen); memDC.SelectObject(pOldFont); pOldBitmap->DeleteObject(); pOldPen->DeleteObject(); pOldFont->DeleteObject(); memDC.DeleteDC(); bmp.DeleteObject(); Brush.DeleteObject(); pen.DeleteObject(); pen2.DeleteObject(); Brush2.DeleteObject(); Brush3.DeleteObject(); ReleaseDC(pDC); if(m_itemclose.GetSafeHwnd()) { m_itemclose.Invalidate(true); } }
作者: zgszft 发布时间: 2011-12-23
一段段注释掉调试
作者: Kaile 发布时间: 2011-12-23
m_itemclose.Invalidate(true);
这句去掉试试
这句去掉试试
作者: chinatcp 发布时间: 2011-12-23
引用 2 楼 chinatcp 的回复:
m_itemclose.Invalidate(true);
这句去掉试试
m_itemclose.Invalidate(true);
这句去掉试试
不是的,这个按钮绘制没有出现泄漏。
作者: zgszft 发布时间: 2011-12-23
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28