• MFC画线功能总结


    本文仅用于学习交流,商业用途请支持正版!转载请注明:http://www.cnblogs.com/mxbs/p/6216464.html 

    MFC画线功能要点有二:其一,鼠标按下时记录初始位置为线的起始端点,其二,利用不同的方法实现画线。下面着重学习总结画线功能实现方法。

      在OnLButtonDown函数中记录起始端点,CPoint m_ptOrigin = point;

      在OnLButtonUp函数中实现画线。方法如下:

      画线方法一:利用SDK全局函数实现视图窗口画线功能

    //获取设备描述表
    HDC hdc;
    //调用全局函数获得当前窗口的设备描述表,CWnd::m_hWnd根据继承原理,CDrawView继承了CWnd类的数据成员
    hdc = ::GetDC(m_hWnd);
    //移动到线条的起点
    MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);//第四个参数用于保存鼠标移动前的位置,此处不需要,设为NULL
    //画线
    LineTo(hdc,point.x,point.y);
    //释放设备描述表
    ::ReleaseDC(m_hWnd,hdc);

    画线方法二:利用MFC的CDC类实现画线功能

    //说明:CDC类封装了所有与绘图相关的操作
    CDC* pDC = GetDC();//定义CDC类型的指针,利用CWnd类的成员函数GetDC获得当前窗口的设备描述表对象的指针
    pDC -> MoveTo(m_ptOrigin);//利用CDC类的成员函数MoveTo和LineTo完成画线功能
    pDC -> LineTo(point);
    ReleaseDC(pDC);

      画线方法三:利用CClientDC类

    //说明:此类派生于CDC类,在构造时调用GetDC()函数,在析构时调用ReleaseDC()函数,因此无需显示调用这两个函数。
    //CClientDC dc(this);//在当前视图窗口画线方法
    CClientDC dc(GetParent());//获取当前视图窗口的父窗口,可以在父窗口画线
    dc.MoveTo(m_ptOrigin);
    dc.LineTo(point);

    画线方法四:利用CWindowDC类
    //CWindowDC dc(this);//只能在视类中画线
    CWindowDC dc(GetParent());//可以在父窗口中画线
    dc.MoveTo(m_ptOrigin);
    dc.LineTo(point);

    如果我们要更多功能的绘制方法,可以利用更多的资源和方法,如:

    更多方法之:绘制彩色线条(设备描述表中默认有一个黑色画笔)

    CPen pen(PS_SOLID,5,RGB(255,255,0));//创建画笔对象
    CClientDC dc(this);
    CPen* pOldPen = dc.SelectObject(&pen);
    dc.MoveTo(m_ptOrigin);
    dc.LineTo(point);
    dc.SelectObject(pOldPen);

    更多方法之:绘制连续线条

    //* 此时需要添加鼠标移动消息响应函数OnMouseMove,当鼠标移动时记录位置并绘制短线,然后需要将此时鼠标位置设置为下一次绘制的起点坐标,     

    //* 这样便可以绘制连续线条了。为此,添加一个判断是否在画线的布尔变量m_bTrue,在视类构造函数中初始化为true,在OnLButtonDown中初始化为true,  

    //* 在OnLButtonUp中初始化为false,OnMouseMove函数如下:                                                   

    // TODO: Add your message handler code here and/or call default
    CClientDC dc(this);
    //创建一个红色的、宽度为1的实线画笔
    CPen pen(PS_SOLID,1,RGB(255,0,0));
    //把创建的画笔选入设备描述表
    CPen *pOldPen = dc.SelectObject(&pen);
    if(m_bTrue == true)
    {
      dc.MoveTo(m_ptOrigin);
      dc.LineTo(point);

      m_ptOrigin = point;//如果不修改起点 坐标,画线效果是扇形
    }
    //恢复设备描述表
    dc.SelectObject(pOldPen);

    这样就可以绘制连续线条了。

    更多方法之:使用画刷绘图
    //创建一个红色画刷
    CBrush brush(RGB(255,0,0));
    //创建并获得设备描述表
    CClientDC dc(this);
    //用红色画刷填充鼠标拖动过程形成的矩形区域
    dc.FillRect(CRect(m_ptOrigin,point),&brush);

    更多方法之:位图画刷

    //注:需要先添加一个位图资源,ID为IDB_BITMAP1

    //创建位图对象
    CBitmap bitmap;
    //加载位图资源
    bitmap.LoadBitmapW(IDB_BITMAP1);
    //创建位图画刷
    CBrush brush(&bitmap);
    //创建并获得设备描述表
    CClientDC dc(this);
    //用位图画刷填充鼠标拖动过程形成的矩形区域
    dc.FillRect(CRect(m_ptOrigin,point),&brush);

    先介绍这么多吧,这些都是我的学习总结,

    如果有疑问,可以联系giserdev@163.com,更多内容请参考:http://www.cnblogs.com/mxbs/,技术交流请加QQ群:586571286。

  • 相关阅读:
    使用MacPorts配置PHP开发环境(PHP54+PHP FPM+NGINX+MYSQL55)
    freebsd make 常用命令(非原创)
    可以通过以下步骤生成一个简单的证书:
    Javascript相关的一些碎裂的记忆
    中兴EBG2100路由器固件
    一些javascript内容
    freebsd 记事之PHP环境搭建
    vue3 中使用 vite 时的报错
    Vite2.0 按需引入Element Plus
    移动端横屏
  • 原文地址:https://www.cnblogs.com/mxbs/p/6216464.html
Copyright © 2020-2023  润新知