2017.5.12MFC画线

之前的学习都是对现有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
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangxiaobei2017

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值