zoukankan      html  css  js  c++  java
  • 【转】pDc->SelectObject(pOldBrush)恢复画刷

    请看下面的代码:
     CDC *pDc=new CClientDC(this);
    CBrush brush;
    brush.CreateSolidBrush(RGB(0,255,0));
    CBrush *pOldBrush = pDc->SelectObject(&brush);
    pDc->Rectangle(50,50,200,200);
    pDc->SelectObject(pOldBrush);
    delete pDc;
    比较困惑的是pDc->SelectObject(&brush);将刷子选入dc中,返回了一个CBrush类型的指针pOldBrush ,为什么在画完矩形之后,还要有pDc->SelectObject(pOldBrush);这么一条语句呢?怎么还要把pOldBrush 指针也选入dc中呢?书上解释说是恢复原来的画刷,晕~我这画刷也没改变啊,恢复个什么呢?
    .................
    CBrush *pOldBrush = pDc->SelectObject(&brush);  
    将brush自己定义的brush画刷选入dc中,此时dc就可以使用我们自己定义的brush画刷进行作业。
    同时pDc->SelectObject(&brush)方法返回一个指针,该指针实际上是未引入brush之前dc中的缺省指针,这里我们将这个缺省指针返回了,并将之赋值为CBrush类型的,也就是pOldBrush 指针就是这个缺省指针。
    在我们作业完成后,不能将dc中的brush消除掉,如果我们使用delete方法直接删除掉brush对象的话,也就是说brush对象没有了 但dc中仍保留了原先brush对象的句柄,这是不正确的,也是容易出问题的,因此我们要将dc中的brush的句柄给消除掉,怎么消除掉呢?我们知道 句柄实际上应该是个指针,我们只需要将dc中原先的brush指针替换掉就好了,就好比,只有一个位置,我要进来,你必须离开。那么现在就是brush的句柄要走,谁接替之呢?恰好是刚才被pDc->SelectObject(&brush)这个语句返回的默认指针,也就是pOldBrush ,还是由它来回归正统的好~所以,理所当然的要再将之选入到dc中了,也就有了语句pDc->SelectObject(pOldBrush); 这样以来dc中的brush句柄被冲刷掉了,如果delete brush的话 也不会在有句柄未被释放掉这样的烦恼了,因此,也就不会造成内存泄露的问题了。
     
    CBrush *pOldBrush = pDc->SelectObject(&brush);中pOldBrush指向的是select之前的系统画刷或者其它画刷,并不是当前使用的brush,因此使用完画刷使用pDc->SelectObject(pOldBrush);恢复到初始状态。
     
    转载自:http://blog.sina.com.cn/s/blog_a2aa00d7010190zd.html
  • 相关阅读:
    Python3安装和虚拟环境配置
    CentOS中nginx安装部署
    CRM项目的整理---第一篇
    软件代码的发布
    ansible的roles使用
    ansible中的playbook脚本的介绍与使用
    ansible模块的介绍与使用
    Ansible的参数介绍
    ansible的介绍与安装
    linux网络配置,查看IP地址
  • 原文地址:https://www.cnblogs.com/zhanjxcom/p/4442443.html
Copyright © 2011-2022 走看看