这个代码是我实现输入背景填充代码.
HBRUSH CTab4::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
 HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if(pWnd->GetDlgCtrlID()== IDC_EDIT1 )
{
pDC->SetBkColor(d_bkColor);
m_brush.CreateSolidBrush(d_bkColor);
hbr= m_brush;
  }
DeleteObject(m_brush) ; //这里不删除引起GDI增加的.但是删除了就实现不了背景填充的
pDC->DeleteDC();
return hbr;
}我改如何修改才能解决?
DeleteObject(m_brush),//如果不删除m_brush很快就引起内存泄漏关闭软件的.

解决方案 »

  1.   

    HBRUSH   CTab4::OnCtlColor(CDC*   pDC,   CWnd*   pWnd,   UINT   nCtlColor)   

        HBRUSH hbr;
        if(pWnd-> GetDlgCtrlID()==   IDC_EDIT1) 
        { 
            pDC->SetBkColor(d_bkColor);
            if (!m_brush.GetSafeHandle())
                m_brush.CreateSolidBrush(d_bkColor); 
            hbr = m_brush; 
        }
        else
            hbr   =   CDialog::OnCtlColor(pDC,   pWnd,   nCtlColor);    return   hbr; 
    } //m_brush应该是CTab4的一个类变量,记得在CTab4的OnDestroy里面对m_brush进行清理。
      

  2.   

    谢谢.能解释一下这句话作用吗
    if   (!m_brush.GetSafeHandle()) 
    我加了这个判断.跟这个就可以
    void CTab4::OnDestroy() 
    {
    CDialog::OnDestroy();
    DeleteObject(m_brush);
    // TODO: Add your message handler code here

    }
      

  3.   

    if       (!m_brush.GetSafeHandle())   
    保证m_brush只创建一次,注意,如果d_bkColor更改后,要记得m_brush.DeleteObject();这样,当再次运行到OnCtlColor时,会再次创建m_brush。
      

  4.   

    谢谢.为什么我加入pDC->DeleteDC(); //加入这个没显示背景跳动
    HBRUSH       CTab4::OnCtlColor(CDC*       pDC,       CWnd*       pWnd,       UINT       nCtlColor)       
    {   
            HBRUSH   hbr; 
            if(pWnd->   GetDlgCtrlID()==       IDC_EDIT1)   
            {   
                    pDC-> SetBkColor(d_bkColor); 
                    if   (!m_brush.GetSafeHandle()) 
                            m_brush.CreateSolidBrush(d_bkColor);   
                    hbr   =   m_brush;   
            } 
            else 
                    hbr       =       CDialog::OnCtlColor(pDC,       pWnd,       nCtlColor); 
     //pDC->DeleteDC(); //加入这个没显示背景跳动
            return       hbr;   
    }