透明画刷

用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并没有提供这个参数,因此先要把需要的画刷选入设备描述表中,然后再调用此函数来绘制矩形。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值