【读书笔记】GDI对象 的跟踪与删除

【读书笔记】GDI对象 的跟踪与删除

    一直都不怎么注意 function 的返回类型,今天看到删除GDI对象一文时,对保存旧GDI对象的代码颇为不解,遂查之,无果。重读之,恍然大悟!
    先看看代码:

1 void  CMyView::OnDraw(CDC *  pDC)
2 {
3   CPen newPen(PS_DASHDOTDOT, 2, (COLOREF) 0);//2个像素宽的黑色Pen。
4   CPen* pOldPen = pDC->SelectObject(&newPen);//SelectObject返回的是上一个被选对象的指针,而不是当前的 &newPen。
5   pDC->MoveTo(1010);
6   pDC->Lineto(11010);
7   pDC->SelectObject(pOldPen);//newPen 落选
8}

9

   如第四行所示,原来SelectObject返回的是上一个被选对象的指针。当 newPen 落选之后,也就从设备环境中分离了,function 退出后,它就被自动销毁了。

   既然落选之后就可以被自动删除,那么选择其它GDI对象也能删除自己创建的GDI对象。为了不造成内存的浪费,我们可以选择库存的GDI对象,由于它们是系统的一部分,所以不用担心它们会造成浪费:

1 void  CMyView::OnDraw(CDC *  pDC)
2 {
3   CPen newPen(PS_DASHDOTDOT, 2, (COLOREF) 0);//2个像素宽的黑色Pen。
4   pDC->SelectObject(&newPen);   
5   pDC->MoveTo(1010);
6   pDC->Lineto(11010);
7   pDC->SelectStockObject(BLACK_PEN);//newPen 落选
8}

9 // function 退出,newPen 被销毁。

你可能感兴趣的:(【读书笔记】GDI对象 的跟踪与删除)