CDC *DC =GDC();
CPen Pen;
Pen.CreatePen(PS_SOLID,1,RGB(255,0,0));
CPen  *pOldPen=pDC->SelectObject(&Pen);
....
....
pDC->SelectObject(pOldPen);
Pen.DeleteObject();请问一下,(1)pDC->SelectObject(pOldPen); Pen.DeleteObject();  既然是pDC选中了pOldPen所指向的PEN对象,为什么时候不是pDC来释放这个PEN对象,  却由Pen来释放,既然是由Pen来释放的话,那应该是由Pen来选中这个pOldPen所指向的PEN对象,而后由Pen来释放呀。(2)Pen.CreatePen(PS_SOLID,1,RGB(255,0,0));  建立了对象之后,这个Pen一直就是操作自己的,用完之后,直接Pen.DeleteObject();就行了,干么还要多CPen  *pOldPen=pDC->SelectObject(&Pen);pDC->SelectObject(pOldPen);这两步,这两步不纯粹多余吗?

解决方案 »

  1.   

    CPen *pOldPen=pDC->SelectObject(&Pen);pDC->SelectObject(pOldPen);
    用来恢复系统默认使用的画笔
      

  2.   

      这整段代码的意思是你现在要绘一段红色的线条,但是现在DC当前的画笔不是红色,所以你创建了一个红色的画笔。
      然后通过SelectObject设置到DC,当你在这里绘制完成后,可能其他地方也要接着绘图,不想用红色,所以你应该把你改变的画笔还原,pDC->SelectObject(pOldPen)。
      这种情况类似你使用了一个公共的资源,使用完成后,你应该要还原现场,因为其他人也会来用,不然会被职责没有公德心。
      同时为了防止GDI对象泄漏,所以你要DeleteObject掉,就像new一个指针后,然后delete掉
      

  3.   

    如果不SelectObject加载旧的,而直接pen.DeleteObject();你Debug下会发现DeleteObject会失败,必须从DC中释放出来才可以删除
      

  4.   


    Pen.CreatePen(PS_SOLID,1,RGB(255,0,0));
    CPen *pOldPen=pDC->SelectObject(&Pen);显然这两句选中的新建的PEN的指针,而不是选中的DC中原来的指针呀。这个&Pen应该是刚刚Pen.CreatePen(PS_SOLID,1,RGB(255,0,0));  产生的PEN对象的指针呀。
      

  5.   

    pDC->SelectObject(pOldPen);
    Pen.DeleteObject();这里的
      

  6.   

    CPen *pOldPen=pDC->SelectObject(&Pen);pDC->SelectObject(pOldPen);
    用来恢复系统默认使用的画笔 
      

  7.   


    照你这种说法的话,那应该是

    CPen *pOldPen=pDC->SelectObject(&Pen);

    Pen.CreatePen(PS_SOLID,1,RGB(255,0,0));而不是

    Pen.CreatePen(PS_SOLID,1,RGB(255,0,0));

    CPen *pOldPen=pDC->SelectObject(&Pen);
    这又怎么理解呢