+ -
当前位置:首页 → 问答吧 → 各位大侠进来帮我看看GDI泄漏问题

各位大侠进来帮我看看GDI泄漏问题

时间:2011-12-23

来源:互联网

这是我写的浏览器的选项卡区域绘制代码,运行后GDI对象飙升,已经确定是这段出了问题,请各位大侠指出错误在哪里:
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);

这句去掉试试

不是的,这个按钮绘制没有出现泄漏。

作者: zgszft   发布时间: 2011-12-23

热门下载

更多