本帖最后由 VisualEleven 于 2014-01-18 20:10:55 编辑

解决方案 »

  1.   

    需要SelectObject()旧的画刷,否则你下面的DeleteObject()操作不成功,自己Debug下调试一下看看就清除了
      

  2.   

      
      如果不调用selectObject 也不调用DeleteObject会有什么影响?
      

  3.   

    void xxx::OnPain()
    {
      CPaintDC dc(this);
    CBrush br;
    br.CreateSolidBrush(RGB(0,0,0));//黑色刷子
     CBrush  *poldBr = dc.selectObject(&br);
      ....dc.selectObject(poldBr);
    br.delectObject();//这个不是必须的,因为br对象释构的时候会自动调用删除
    }
      

  4.   

      
      如果不调用selectObject 也不调用DeleteObject会有什么影响?
     如果你不调用SelectObject载入旧的,就会出现GDI泄露,长时间运行你的程序,多操作一下UI界面,看看任务管理器中GDI的变化情况
      

  5.   

    使用GDI时,经常需要将Pen、Brush等GDI对象选入DC,并保存旧的GDI对象,然后进行一些绘图操作。此时调用的绘图函数都是使用这些新选入的Pen、Brush,绘图完成之后再把旧的GDI对象重新选回DC,避免影响后面的其它绘图程序,这称之为“状态模式”。把它当成一种编程惯用法或者一种好的习惯吧,我觉得不用过于纠结。
      

  6.   

    纯API调用时,屏蔽SelectObject,直接DeleteObject不会报错不过作为一种好的编程习惯,还是按规矩办事好,Create后一般都要Delete,不然会有内存泄漏,至于Create和Delete是否成功,大多时候都没去检查,默认是OK的