1. 绘制线条
主要实现一个利用鼠标来绘制线条的功能,第一次鼠标左键按下时的鼠标坐标作为线段起点,按住鼠标左键不放并拖动鼠标,放开左键时的鼠标坐标作为线段终点
1.1 使用SDK全局函数实现绘制线条
- 在视图类中添加一个类型为
CPoint
名为m_ptOrigin
的私有数据成员 - 利用ClassWizard添加对
WM_LBUTTONDOWN
和WM_LBUTTONUP
的处理程序。 - 实现
OnLButtonDown
函数,当鼠标左键按下时,记录当前鼠标坐标 - 实现
OnLButtonUp
函数,当鼠标左键放开时,获取窗口的设备描述表,利用MoveToEx
函数移动到线段的起点,然后利用LineTo
函数绘制一条线段。
void CMFCApplication1View::OnLButtonUp(UINT nFlags, CPoint point)
{
//获取窗口的设备描述表
HDC hdc;
hdc = ::GetDC(m_hWnd);
//移动到线段的起点
MoveToEx(hdc, m_ptOrigin.x, m_ptOrigin.y, NULL);
//画线
LineTo(hdc, point.x, point.y);
//释放设备描述表
::ReleaseDC(m_hWnd, hdc);
CView::OnLButtonUp(nFlags, point);
}
- 利用:域操作符直接调用函数是表明该函数应该调用的是全局函数版本
- 运行,可以在视图窗口中绘制线段
1.2 使用MFC的CDC类实现绘制线条
- 基本步骤与1.1中相同,不同之处在于该方法使用
CDC
类来获取设备描述表,并调用该类的成员函数来实现画线功能
void CMFCApplication1View::OnLButtonUp(UINT nFlags, CPoint point)
{
//获取窗口的设备描述表
CDC *pDC = GetDC();
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
ReleaseDC(pDC);
CView::OnLButtonUp(nFlags, point);
}
1.3 使用MFC的CClient类实现绘制线条
- 该方法使用
CClientDC
类来获取设备描述表,CClientDC
类派生于CDC
类,并且在构造时就调用了GetDC
函数来获取设备描述表
void CMFCApplication1View::OnLButtonUp(UINT nFlags, CPoint point)
{
CClientDC dc(this);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
CView::OnLButtonUp(nFlags, point);
}
1.4 使用MFC的CWindowDC类实现绘制线条
- 该方法使用
CWindowDC
类来获取设备描述表,该类跟CClientDC
类差不多,同样是从CDC
类派生出来的,并且不需要显示调用GetDC
函数和ReleaseDC
函数。该类与CClientDC
类不同的地方就在于利用CWindowDC
可以接收整个窗口区域的鼠标事件,从而使画图区域不再局限于视图窗口。
void CMFCApplication1View::OnLButtonUp(UINT nFlags, CPoint point)
{
CWindowDC dc(this);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
CView::OnLButtonUp(nFlags, point);
}