MFC画图详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiao3404/article/details/52542346
                                        <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-e2445db1a8.css">
                    <div class="htmledit_views">

前言


MFC提供了一个CBrush类,可以用来创建画刷对象,通过MSDN我们知道CBrush类的构造函数有以下三种:


  
  
  1. CBrush(COLORREF crColor);             // CreateSolidBrush
  2. CBrush( int nIndex, COLORREF crColor); // CreateHatchBrush
  3. explicit CBrush(CBitmap* pBitmap);           // CreatePatternBrush
从入参来看,CBrush画图可以采用RGB颜色填充和位图填充两个方式,下面讨论以画刷填充一个矩形区域为例进行介绍。


背景知识:

     一个矩形可以由左上角和右下角两个点确定,我们在鼠标左键按下和弹起的两个事件中就有了这两个点位置消息,从而确定一个矩形区域,我们在OnLButtonUp和OnLBttonDown两个消息响应函数完成绘图。


在MFC中利用Crect类来构造矩形区域,其构造函数有以下几种:


  
  
  1. CRect() throw();
  2. // from left, top, right, and bottom
  3. CRect( int l, int t, int r, int b) throw();
  4. // copy constructor
  5. CRect( const RECT& srcRect) throw();
  6. // from a pointer to another rect
  7. CRect(LPCRECT lpSrcRect) throw();
  8. // from a point and size
  9. CRect(POINT point, SIZE size) throw();
  10. // from two points
  11. CRect(POINT topLeft, POINT bottomRight) throw();

RGB颜色画图


RGB颜色画图代码如下:


  
  
  1. //nFlags:Indicates whether the user pressed modifier keys(Alt,Shift,Ctrl..)
  2. //point: specify current cursor the position when left button down
  3. void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
  4. {
  5. // TODO: 在此添加消息处理程序代码和/或调用默认值
  6. //保存起点位置
  7. m_ptOrigin = point;
  8. CView::OnLButtonDown(nFlags, point);
  9. }
  10. //nFlags:Indicates whether the user pressed modifier keys(Alt,Shift,Ctrl..)
  11. //point: specify current cursor the position when left button up
  12. void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
  13. {
  14. //红色画刷
  15. CBrush brush(RGB(255,0,0));
  16. //创建DC
  17. CClientDC dc(this);
  18. //直接用画笔填充矩形区域,不用将画笔选入DC
  19. dc.FillRect(CRect(m_ptOrigin, point), &brush);
  20. CView::OnLButtonUp(nFlags, point);
  21. }
运行效果:



透明画刷


下面利用CDC类的Rectangle函数绘制一个矩形,Rectangle函数是利用当前的画刷完成矩形绘制,而默认的画刷是白色。因此利用Rectangle函数绘图也会存在相同的问题,即矩形交叠部分存在被覆盖的情况。

如果矩形区域内部是透明的,就可以解决这个问题,但是在CBrush类中不存在这个接口,可以利用GetStockObjec函数,这个函数可以获得一个黑色或白色等画刷句柄。从MSDN发现fnObject可以是NULL_BRUSH,该值就是空画刷的意思。


  
  
  1. Draws a rectangle using the current pen.
  2. //GDI对象句柄,可以是pens, brushes, fonts, or palettes.
  3. HGDIOBJ GetStockObject(int fnObject// stock object type);
具体代码实现如下:


  
  
  1. //nFlags:Indicates whether the user pressed modifier keys(Alt,Shift,Ctrl..)
  2. //point: specify current cursor the position when left button up
  3. void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
  4. {
  5. CClientDC dc(this);
  6. //获得空画刷指针,利用FromHandle函数完成句柄和指针的转换
  7. CBrush *pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
  8. //空画刷载入设备描述表
  9. CBrush* pOldBrush = dc.SelectObject(pBrush);
  10. //虚线画笔
  11. CPen pen(PS_DASH,1,RGB(255,0,0));
  12. CPen* pOldPen = dc.SelectObject(&pen);
  13. //绘制矩形
  14. dc.Rectangle(CRect(m_ptOrigin, point));
  15. //还原画笔和画刷
  16. dc.SelectObject(pOldBrush);
  17. dc.SelectObject(pOldPen);
  18. CView::OnLButtonUp(nFlags, point);
  19. }

运行效果:



位图画刷


在CBrush的的构造函数中,我们可以传入CBitmap指针参数,完成画刷的构造,其函数声明如下:

explicit CBrush(CBitmap* pBitmap);    // CreatePatternBrush

  
  
该构造函数要求传入一个CBitmap指针,我们可以定义一个CBitmap对象,来完成CBrush的创建。然而,我们在创建一个CBitmap对象时,还需要完成位图的初始化,才能生成有效的CBitmap对象,CBitmap对象的初始化函数有CreateCompatibleBitmap、LoadBitmap、LoadMappedBitmap等,

这里利用LoadBitmap对象完成初始化工作,函数声明如下:


  
  
  1. BOOL LoadBitmap(LPCTSTR lpszResourceName);
  2. BOOL LoadBitmap(UINT nIDResource);

在VS2008中Bitmap位图创建步骤:

        资源文件->右键添加->资源->Bitmap->新建,这创建一个”中“字的位图效果如下。


有了以上的内容,我们就可以完成位图绘图功能,具体代码如下:


  
  
  1. //nFlags:Indicates whether the user pressed modifier keys(Alt,Shift,Ctrl..)
  2. //point: specify current cursor the position when left button up
  3. void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
  4. {
  5. //创建位图对象
  6. CBitmap bitmap;
  7. //加载位图资源
  8. bitmap.LoadBitmap(IDB_BITMAP2);
  9. //创建位图画刷
  10. CBrush brush(&bitmap);
  11. //创建DC并得到DC
  12. CClientDC dc(this);
  13. //位图填充区域
  14. dc.FillRect(CRect(m_ptOrigin, point), &brush);
  15. CView::OnLButtonUp(nFlags, point);
  16. }

运行效果:



        </div>
            </div>
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值