MFC画线

来源:互联网 发布:mac导入照片不清晰 编辑:程序博客网 时间:2024/05/17 21:55

转载自: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);