zoukankan      html  css  js  c++  java
  • 【MFC学习笔记-作业7-小型画图软件】【】

    作业要求:

    按下鼠标右键画圆。

    按下鼠标左键移动曲线。


    丝毫没有思路。。网上教程又比这个程序复杂100倍...

    好吧 总算找到一个合适的了...


    转载至:http://blog.chinaunix.net/uid-26275986-id-3868272.html 红色字部分是我自己的注解


         学习MFC就像玩魔术,着实有趣,从传统的黑白命令行跳到熟悉的窗口界面,感觉还是很新鲜的。尽管MFC的知识更多是应用性的,但是自己还是想尽快掌握起来独立地写出图形接口的程序。今天学习的是如何绘制简单的图形,比如直线;当然后面还有高级绘图,但是那些部分对于自己现在就没有多少必要了:自己需要的是GUI,而非全部的MFC。所以接下来自己会挑几个感觉重要的、需要的部分来学习,目标就是看完这些之后自己可以写出一个图形小程序。
         言归正传,如果想在窗口上绘制直线的话,我们需要捕捉两个点:线段的起点和终点。二者可以分别通过WM_LBUTTONDOWN和WM_LBUTTONUP来实现。类似于上节课讲述的添加消息函数的方法,在类视图的CDrawView右键属性,选择“消息”菜单,找到对应的消息即可。进入二者的消息函数的实现之前,需要定义一个变量表示线段的起点CPoint m_ptOrigin,同样是右键View类添加变量即可:

    void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
    {
        // TODO: 在此添加消息处理程序代码和/或调用默认值
    
        //MessageBox(L"View Clicked!");     //用于单击窗口客户区时的测试
        m_ptOrigin = point;
    
        CView::OnLButtonDown(nFlags, point);
    }
    
    void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
    {
        // TODO: 在此添加消息处理程序代码和/或调用默认值
        //使用CDC类实现
        CDC *pDC = GetDC();
        pDC->MoveTo(m_ptOrigin);
        pDC->LineTo(point);
        ReleaseDC(pDC);
        CView::OnLButtonUp(nFlags, point);
    }
    
    1.
    m_ptOrigin = point;
    简单明了..估计的意义就是point形参读取了当前的鼠标位置,将其复制给全局变量m_ptOrigin

    2.

        CDC *pDC = GetDC();
        pDC->MoveTo(m_ptOrigin);
        pDC->LineTo(point);
        ReleaseDC(pDC);
    利用GetDC()得到一个封装类CDC (虽然并不懂CDC是什么东西),估计就是当前绘画的操作把;

    MoveTo LineTo在上一篇中介绍过啦~~~

    ReleaseDC();释放掉,防止溢出..




          上面的代码使用了设备描述表(DC)来实现绘制直线。MS为程序猿提供了应用程序与设备交互的数据结构DC(Device Context)以实现程序的平台无关性。可以使用直接的DC,也可以使用DC的封装类CDC实现,上面都给出了示例。当然,更加简便地是使用CDC的派生类CClientDC,可以不用自己却写GetDC和ReleaseDC函数。运行测试结果如下:


         细心的童鞋会发现上面的程序只能绘制直线,那如何绘制连续线呢?其实这里的关键在于实现的想法,如果我们把曲线看作许多小线段的组合,那么每次更新起点连续绘制小线段不就可以了么?但是这里需要注意的是我们需要一个Bool m_bDraw来判断鼠标是否点下是否应当一直绘制。我们需要使用WM_MOUSEMOVE来捕捉鼠标的不断移动:

    void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
    {
        // TODO: 在此添加消息处理程序代码和/或调用默认值
    
        //MessageBox(L"View Clicked!");
        m_ptOrigin = point;
        m_bDraw = true;
    
        CView::OnLButtonDown(nFlags, point);
    }
    
    void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
    {
        // TODO: 在此添加消息处理程序代码和/或调用默认值
    
        m_bDraw = false;
    
        CView::OnLButtonUp(nFlags, point);
    }
    
    void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
    {
        // TODO: 在此添加消息处理程序代码和/或调用默认值
    
        CClientDC dc(this);
        //创建一个画笔
        CPen pen(PS_SOLID, 1, RGB(255, 0,0));
        //将创建的画笔选入设备描述表
        CPen *pOldPen = dc.SelectObject(&pen);
        if (m_bDraw == true)
        {
            dc.MoveTo(m_ptOrigin);
            dc.LineTo(point);
            m_ptOrigin = point ;  //每次都更新起点
        }
    
    
        CView::OnMouseMove(nFlags, point);
    }
    

          这样我们就可以绘制曲线了:)

            1.

    m_bDraw = true;
    <pre name="code" class="cpp" style="font-size: 13.3333339691162px;">m_bDraw = false;

    
    

    判断鼠标是否保持点击状态..

    2.

        CClientDC dc(this);
        //创建一个画笔
        CPen pen(PS_SOLID, 1, RGB(255, 0,0));
        //将创建的画笔选入设备描述表
        CPen *pOldPen = dc.SelectObject(&pen);
    
    CClientDC 据百度百科说,是继承与CDC的..等下用CDC 试试..

        if (m_bDraw == true)
        {
            dc.MoveTo(m_ptOrigin);
            dc.LineTo(point);
            m_ptOrigin = point ;  //每次都更新起点
        }

    然后画画就好啦`


    亲测用CDC也是一样的..只是省略的GetDC,和ReleaseDC;

     CDC *pDC=GetDC();
        //创建一个画笔
        CPen pen(PS_SOLID, 1, RGB(255, 0,0));
        //将创建的画笔选入设备描述表
        pDC->SelectObject(&pen);
        if (m_bDraw == true)
        {
            pDC->MoveTo(m_ptOrigin);
            pDC->LineTo(point);
            m_ptOrigin = point ;  //每次都更新起点
        }
    	ReleaseDC(pDC);
    	CView::OnMouseMove(nFlags, point);

    恩 文章结束!我也类比用右键做个圆!

    类似上面的写法 ,创建一个WM_RButtonDown,WM_RButtonUp;

    然后读起点读终点画圆就好啦!。

    代码就懒得放了 ,so easy ,我果然还是有点小天赋~



  • 相关阅读:
    平凡的世界
    MySql启动,提示:Plugin 'FEDERATED' is disabled....Cannot allocate memory for the buffer pool
    MySql开启慢查询报错:Could not open /var/log/slow_query.log for logging (error 13).
    ie浏览器,背景色兼容解决方法
    基于Bootstrap、Jquery的自适应导航栏
    chmod、chown、chgrp的意思
    Can't connect to MySQL server on localhost (0)
    mysql-bin引起mysql不能启动
    文件类型检测
    从数据库中查询规则
  • 原文地址:https://www.cnblogs.com/zy691357966/p/5480354.html
Copyright © 2011-2022 走看看