随笔-14  评论-8  文章-0  trackbacks-0

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

1void 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对象,由于它们是系统的一部分,所以不用担心它们会造成浪费:

1void 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 被销毁。
posted on 2008-10-16 13:11 崇文 阅读(600) 评论(1)  编辑 收藏 引用

评论:
# re: 【读书笔记】GDI对象 的跟踪与删除 2016-04-22 15:45 | 崇文
2016年4月22日:回头看自己写的东西,有趣,尴尬。
newPen之所以被销毁,是因为被CPen这个类包装了,CPen的析构函数应该做了这个事,当然,手动解除newPen的占用是必要的。
说明当年我对c++的构造、析构等函数只有肤浅的理解。
作为一个审计人,重拾当初的梦想,我想我应该回来了。不为什么,就为了一颗程序猿的心。  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理