• MFC画图


    http://blog.csdn.net/muzi9_17/article/details/6376922


    绘制任意线条:

    1、创建基于单文档工程:Draw

    CDrawView类中添加成员变量:

    CPoint m_ptOrigin;

    BOOL m_bDraw;

    2、CDrawView()中初始化:

    m_ptOrigin = point;

    m_bDraw = false;

    3、添加消息响应函数:

    WM_LBUTTONDOWN    WM_LBUTTONUP  WM_MOUSEMOVE

    4、左键按下时:

    m_ptOrigin = point;

    m_bDraw = true;

    5、左键抬起:

    m_bDraw = false;

    6、鼠标移动时:

        //画连续线条

    CClientDC dc(this);

    if(m_bDraw)

        {

           dc.MoveTo(m_ptOrigin);

           dc.LineTo(point);

           m_ptOrigin = point;

        }

        //画扇形线条

    CClientDC dc(this);

        if(m_bDraw)

        {

           dc.MoveTo(m_ptOrigin);

           dc.LineTo(point);

        }

        //画带外包线的扇形线条

    析:画带外包线的扇形线条,不光记录初始位置,还要记录鼠标移动上一位置。

    添加成员变量:

    CPoint m_ptOld;

    在鼠标左键按下时初始化:

    m_ptOld = point;

    在鼠标移动时进行改变:

    CClientDC dc(this);

        if(m_bDraw)

        {

           dc.MoveTo(m_ptOrigin);

           dc.LineTo(m_ptOld);

           dc.MoveTo(m_ptOld);

           dc.LineTo(point);

           m_ptOld = point;

        }

    画矩形:

    画无边框的矩形

    方法说明:利用FillRect函数填充矩形。填充内容为画刷的内容,即画刷对象的指针。

         CBrush brush(RGB(5,255,255));

         CClientDC dc(this);

         dc.FillRect(CRect(m_ptOrigin,point),&brush);

    以位图作为画刷的资源

         CBitmap bitmap;

         bitmap.LoadBitmap(IDB_BITMAP1); 

         CBrush brush(&bitmap);

         CClientDC dc(this);

         dc.FillRect(CRect(m_ptOrigin,point),&brush);

    画有边框的矩形

    方法说明:利用Rectangle方法来画矩形。其中CBrush与CPen类分别负责矩形内部和矩形边框的属性

         //画中心为白色的矩形

         CClientDC dc(this);

         dc.Rectangle(CRect(m_ptOrigin,point));

         //画中心为透明的矩形

         CClientDC dc(this);

    CBrush *pBrush=CBrush::FromHandle((HBRUSH)

    GetStockObject(NULL_BRUSH));

         CBrush *pOldBrush=dc.SelectObject(pBrush);

         dc.Rectangle(CRect(m_ptOrigin,point));

         pOldBrush=pBrush;

    //画中心为透明边为任意颜色的矩形

         CClientDC dc(this);

         CPen pen(PS_SOLID,1,RGB(234,23,53));

         CPen *pOldPen=dc.SelectObject(&pen);

         CBrush *pBrush=CBrush::FromHandle((HBRUSH)

    GetStockObject(NULL_BRUSH))

         CBrush *pOldBrush=dc.SelectObject(pBrush);

         dc.Rectangle(CRect(m_ptOrigin,point));

         dc.SelectObject(pOldPen);

         dc.SelectObject(pOldBrush);

    使用画笔、画刷

    在OnLButtonUp函数中:

    /////////////////////////////////////////////////////////////////

    CPen pen(PS_SOLID,1,RGB(234,23,53));

    //定义一个CPen类对象,并利用RGB宏改变其颜色

    CClientDC dc(this);

    CPen *pOldPen=dc.SelectObject(&pen); //将其选入设备表

    dc.MoveTo(m_ptOrigin);

    dc.LineTo(point);

    dc.SelectObject(pOldPen); 

    /////////////////////////////////////////////////////////////////

    CBrush brush(RGB(0,255,0)); 

    CClientDC dc(this); 

    CRect rect(m_ptOrigin,point); 

    dc.FillRect(&rect,&brush); 

    /////////////////////////////////////////////////////////////////

    使用位图创建画刷:

    插入->资源->位图->引入,可以引入位图,初始一般命名为:IDB_BITMAP1

    CBitmap bitmap; 

    bitmap.LoadBitmap(IDB_BITMAP1); 

    CBrush brush(&bitmap); 

    CClientDC dc(this); 

    CRect rect(m_ptOrigin,point); 

    dc.FillRect(&rect,&brush);

    /////////////////////////////////////////////////////////////////

    CBrush *brush; 

    brush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));

    CClientDC dc(this); 

    CBrush *pOldBrush =dc.SelectObject(brush) ;  

    dc.Rectangle(CRect(m_ptOrigin,point)); 

    dc.SelectObject(pOldBrush) ; 

    注:

    常用的绘图设备类对象的创建和将其引入到设备环境中的方法

    在选择绘图设备类对象(GDI对象)进行绘图时,一般可按下列步骤进行:

    (1)定义一个GDI对象,然后调用相应的函数(如CreatePen、CreateSolidBrush等)创建此GDI对象。

    (2)将已构造出的GDI对象利用设备环境类对象的成员函数SelectObject选入到当前环境中,并同时将原来的GDI对象保存起

    来。

    (3)绘图结束后,恢复当前设备环境中原来的GDI对象。

    注意:在Windows系统中包含了一些库存的GDI对象,在第(3)步中可直接利用设备环境类(CDC)的成员函数

    SelectStockObject将一个Windows库存的GDI对象选入,系统可自动将原来选入的GDI对象从设备环境中分离出来。
  • 相关阅读:
    转:桩模块 stub 和驱动模块 driver
    音频中PCM的概念
    pthread_exit
    为什么匿名内部类参数必须为final类型
    原创:同步与异步、阻塞与非阻塞
    (转)C语言中长度为0的数组
    编码问题
    查看Android程序使用内存
    C++中class与struct的区别(struct的类型名同时可以作为变量名)
    asn1c
  • 原文地址:https://www.cnblogs.com/silyvin/p/9106871.html
Copyright © 2020-2023  润新知