问题1:如何有效的降低GDI的使用数,用GDIPool?
问题2:
                CPen pen( PS_SOLID, 0, clrArrow );
                CBrush* pOldBrush = dc.SelectObject( &brush );
                CPen* pOldPen = dc.SelectObject( pen );
                dc.Polygon( arPoints, POINTS_COUNT );
                dc.SelectObject( pOldPen );
                dc.SelectObject( pOldBrush );这样写代码会增加程序中GDI(Pen和Brush)的个数吗?
问题3:我用了GDIPool来保存同样的CPen对象,当再有需要的地方,就去GDIPool中get,如果GDIPool中没有 再分配。
       结果我做了测试,每次都可以从GDIPool中得到,但CPen的使用数还是很多,各位帮我解决下啊!

解决方案 »

  1.   

    pen.DeleteObject();
    pOldBrush->DeleteObject();
    pOldPen->DeleteObject();只要不出错,尽可能多的DeleteObject
      

  2.   

    不要用GDIPool,用的时候创建或保存到类变量,注意删除就行了。建议看看msdn,都说的很清楚防止gdi对象泄露
      

  3.   

    这个类里边就在这里用了GDI,请问还要哪部分的代码?
    另外,我们要实现一个基础控件库,主要想解决GDI占用数量多的问题,如果创建200个同样的BUTTON,就必须要使用200个CPen吗?
    能不能给个创建后及时释放的实例代码?
      

  4.   

    如果200个BUTTON,且效果都是一样的话,那就把它做成一个BUTTON基类,不可能都在一个窗口的OnPaint里面处理这200个BUTTON的自绘吧
      

  5.   

    就是做成基类的形式,我要开发的是一个控件库,想让使用者创建很多同样控件时不用占用那么GDI
      

  6.   

    如果只建一个CPen 应该是不会增回GDI句柄数所,还有你那么肯定是 Pen和Brush 增加的,而不是其它?,
      

  7.   

    那你就在BUTTON基类的OnPaint里面处理,只需要用到一个CPaintDC,并在 OnPaint 执行完后,自动释放 CPaintDC 所占用的系统资源,不需要手动关闭。
      

  8.   

    把 经常用的CPen CBrush定义成类的成员函数 析构的时候再删除
    画笔画刷占用资源比较少 即便是经常用经常释放也没有什么问题 如果是
    位图CBitmap CDC* CDC等就需要好好考虑了 这些东西对资源占用比较大 
    而且多次创建 删除也同样会造成系统速度慢。
      

  9.   

    使用对象来封装
    class CSelPen  : public CGDIObject<CPen>
    {
    public:     
       CSelPen(CDC * pDC, COLORREF col, int sty=PS_SOLID, int wid=1)
       : CGDIObject<CPen>(pDC)
       {
          VERIFY(m_cNewObj.CreatePen(sty, wid, col));
      Select(&m_cNewObj);
       }   CSelPen(CDC * pDC, int nPenStyle, int nWidth, const LOGBRUSH* pLogBrush, int nStyleCount = 0, 
       const DWORD* lpStyle = NULL) : CGDIObject<CPen>(pDC)
       {
       VERIFY(m_cNewObj.CreatePen(nPenStyle, nWidth, pLogBrush, nStyleCount, lpStyle));
    Select(&m_cNewObj);
       }
    };
      

  10.   

    把GDI对象作为你的窗口对象的一个数据成员,在构造函数或者别的适当的地方初始化,在析构函数中释放。
      

  11.   

    你可能对控件绘制有误解:多个控件可以用同一CPEN和CBrush绘制,没有必要一个控件一个gdi对象;另外,就是创建了新的笔刷,使用后及时删除.
      

  12.   

    我想的就是用一个GDI对象绘制多个控件,这样就能在创建控件比较多时,减少GDI的使用,那我该如何做呢?请指点我一下
      

  13.   

    问题2中不会增加GDI,一般不是你create的不用delete。
    不过你的刷子brush是怎样生成的?记得要delete掉
      

  14.   

    有点明白了,还得再研究研究,如果我用GDI+中的Brush或者Pen,应该注意些什么呢?怎么使用才能保证不增加GDI数呢?
    各位给点资料或者代码什么的,谢谢啊