C++MFC笔记

 

CBrush是封装了Windows图形设备接口(GDI)中画刷的MFC类,用于构造CBrush对象,然后传给需要画刷的CDC成员函数。具体画刷可以由实线、阴影线或指定模式的位图线构成。可参阅CBitmap, CDC相关说明

请看下面的代码:

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);

deletepDc;

比较困惑的是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);恢复到初始状态。

www.99jianzhu.com/包含内容:建筑图纸、PDF/word/ppt 流程,表格,案例,最新,免费下载,施工方案、工程书籍、建筑论文、合同表格、标准规范、CAD图纸等内容。


TOP最近更新内容

    园林史名词解释
    长城小学关爱留守儿童工作制度
  • 上一篇:五绝 蓝天梦
  • 下一篇:巧虎、米卡成长天地早教诗词