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图纸等内容。