登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

面包会有的

... ...

 
 
 

日志

 
 

透明画刷  

2011-11-22 03:49:54|  分类: VC++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
用CDC的Rectangle函数绘制一个矩形,代码为
  m_downPoint为CDrawView类的CPoint类型的私有成员,在OnLButtonDown函数中保存了鼠标左键按下的位置
  void CDrawView::OnLButtonUp(UINT nFlags,CPoint point)
  {
   //创建并获得设备描述表
   CClientDC dc(this);
   //绘制矩形
   dc.Rectangle(CRect(m_downPoint,point));
  
   CView::OnLButtonUp(nFlags,point);
  }
  
  运行Draw程序,在程序窗口中绘制矩形,但是当绘制两个相互重叠的矩形时,后绘制的矩形遮盖住了先绘制的矩形。原因在于设备描述表中有一个默认的白色画刷,在绘图时会利用这个画刷填充矩形内部。
  
  GetStockObject函数可以获取一个透明画刷。但是这个函数获取的是一个画刷句柄,而我们在进行绘制操作时需要的是一个画刷对象。如何从画刷句柄转化为一个画刷对象?利用CBrush类提供的FromeHandle函数可以实现这个功能。
  void CDrawView::OnLButtonUp(UINT nFlags,CPoint point)
  {
   //创建并获得设备描述表
   CClientDC dc(this);
   //得到透明画刷句柄
   HBRUSH hb = (HBRUSH) GetStockObject(NULL_BRUSH);
   //把画刷句柄转化为画刷对象
   CBrush* brush = CBrush::FromHandle(hb);
   //将透明画刷选入设备描述表
   CBrush *pOldBrush = dc.SelectObject(brush);
   //绘制矩形
   dc.Rectangle(CRect(m_downPoint,point));
   //回复先前的画刷
   dc.SelectObject(pOldBrush);
  
   CView::OnLButtonUp(nFlags,point);
  }
  
  注意:
  1.FromeHandle函数原型为 static CBrush* PASCAL FromHandle( HBRUSH hBrush );是一个静态函数,所以用CBrush::FromHandle(hb)调用方式!
  2.GetStockObject函数原型为HGDIOBJ GetStockObject( int fnObject ),返回类型为HGDIOBj,所以需要一个强制类型转换,将其转换为HBRUSH类型的
  3.FileRect和Rectangle函数都能绘制矩形,但是FileRect函数在参数中提供了绘制使用的画刷,因此他就直接利用此画刷填充矩形,并不需要先把需要的画刷选入设备描述表中。而Rectangle并没有提供这个参数,因此先要把需要的画刷选入设备描述表中,然后再调用此函数来绘制矩形。
  评论这张
 
阅读(1278)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018