2017.5.12MFC画线

来源:互联网 发布:印度最新人口数据 编辑:程序博客网 时间:2024/05/21 15:38

之前的学习都是对现有MFC程序的了解,对比之前窗口创建过程,在MFC中判断每一步的具体流程,现在有了比较清晰的认识,但具体的细节还要在之后的学习中不断完善。
现在知道了MFC创建后就有许多的代码,这些代码为我们的窗口创建提供了许多便利,我们不需要考虑太多关于窗口框架的问题。那么,我们如何在现有的MFC结构下编写自己的程序呢,接下来我们就学习一下如何在窗口中画线。
我们要实现的效果是,按下鼠标左键并拖动鼠标到另一点,屏幕显示两点之间的线段。
首先在VC6.0菜单中点击查看——建立类向导,即可增加响应函数,需要在CDrawView类下增加响应函数LButtonDown,并选择编辑就跳转到编译环境。
注:当增加一个消息响应函数时,实际上在3个地方进行了修改。第一个是在头文件中加入消息响应函数原型的声明,第二个是在源文件(.cpp)中加入消息响应函数的一个宏,通过这个宏把我们的消息和消息响应函数关联起来了。第三个是在源文件中增加了消息响应函数的定义(实现部分)。

然后在CDrawView类中创建一个私有成员变量,在结构体中进行初始化

private:    CPoint m_ptOrigin;
CDrawView::CDrawView(){    // TODO: add construction code here    m_ptOrigin = 0;}

在OnLButtonDown中保存当前鼠标左键按下的点

void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) {    // TODO: Add your message handler code here and/or call default    m_ptOrigin = point;    CView::OnLButtonDown(nFlags, point);}

接下来要确定线段的终点,需要另一个按键松开的响应,同前一个步骤类似

void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) {    // TODO: Add your message handler code here and/or call default        CView::OnLButtonUp(nFlags, point);}

接下来就利用4种方法创建了画线命令,同时介绍了线型和颜色的选择。

void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) {    // TODO: Add your message handler code here and/or call default    /****************wjl***********************    方法一:        这个是用平台SDK 来完成的划线功能        用的API函数(全局函数)来完成的        *********************************    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);    ******************wjl*********************/    /****************wjl***********************    方法二:        因为MFC具有高度的封装性,MFC中所有和窗口        相关的操作都封装到CWnd类中了,        所有和作图相关的操作都封装到CDC类中了。        接下来利用MFC里面的CDC类来进行划线的操作    CDC *pDC=GetDC();   // 这里的GetDC是CWnd类中的函数    pDC->MoveTo(m_ptOrigin);    pDC->LineTo(point);    ReleaseDC(pDC);    ***************wjl************************/    /****************wjl***********************    方法三:        介绍另外一个类 CClientDC,它在创建对象的时候        自动调用了GetDC,并且在结束的时候自动释放DC//  CClientDC dc(this);  // 这个是和View窗口相关的操作,    CClientDC dc(GetParent());  //这个时候框架窗口相关的操作    dc.MoveTo(m_ptOrigin);    dc.LineTo(point);    ***************wjl************************/    /****************wjl***********************    方法四:        另外一个类CWindowDC,和CClientDC类似,他们都自动        调用GetDC,并且在结束的时候自动释放DC。不同的是        CWindowDC可以访问整个窗口区域,包括客户区和非客户区    //CWindowDC dc(this);    //CWindowDC dc(GetParent());      CWindowDC dc(GetDesktopWindow()); // 划线到整个屏幕    dc.MoveTo(m_ptOrigin);    dc.LineTo(point);    ***************wjl************************/    /****************wjl***********************    <*如何改变线宽和颜色*>    1.  首先要创建画笔,利用MFC提供的CPen类        CPen pen(参数一,参数二,参数三);            第一个参数指画笔的类型 实线PS_SOLID、虚线PS_DASH、点线PS_DOT            第二个参数指的是画笔的宽度            第三个参数是笔的颜色RGB(0-255)    2.  当你创建完画笔之后并不会生效,你需要将这个笔        选择到设备描述表DC当中,这样当你调用DC的时候才能        使用你定义好的画笔。        利用SelectObject()把当前的画笔选择到DC中,同时保存先前的        画笔(SelectObject的返回值就是先前的画笔类型)    3.注意:虚线PS_DASH和点线PS_DOT 只有在线宽小于等于1的时候才会效果    CPen pen(PS_DOT,1,RGB(0,0,255));     CClientDC dc(this);    CPen *pOldPen = dc.SelectObject(&pen);  // 这里保存了先前画笔类型的指针    dc.MoveTo(m_ptOrigin);    dc.LineTo(point);    dc.SelectObject(pOldPen);               // 将之前的画笔类型还原    ***************wjl************************/    CView::OnLButtonUp(nFlags, point);}
0 2