zoukankan      html  css  js  c++  java
  • [C++]用MFC做一个点击鼠标成十字形画线的程序

    这是进软协时,会长给我的一道测试题。

           但是其实啥都不会,学了这么久编程几乎没有用MFC做过东西,唯一的一次就是用按书上做了Hello world!其实啥技术含量也没有。这次虽然也没多少技术含量,但完成这个,的确花了两天时间。查资料,学MFC最基本的知识,跳过一些门槛,最后终于提前四天完成了。

           现在来侃侃做这个东西的过程。首先,那些建立MFC的步骤就不用说了吧。。。。balabala第一步:先把画线的功能实现。这个不难,我输入的工程名为Draw。

     现在CDrawView头文件里加上几个参数,

     class CDrawView : public CView
    {
    protected: // create from serialization only
     CDrawView();
     DECLARE_DYNCREATE(CDrawView)
     int m;                           //红色为我定义的几个变量
     CPoint p1, p2;            // m是用来判断鼠标是否按下,p1,p2是记录两个点,画线时从p1到p2
     HCURSOR m_hMyCursor
    ;   //定义光标类型

    public:

    。。。。

    }

    紧接着我在初始化函数CDrawView里初始化变量m = 0;表示鼠标没有按下。

    用这条语句来设置光标的形状,m_hMyCursor = AfxGetApp()->LoadStandardCursor (MAKEINTRESOURCE(IDC_CROSS));

    AfxGetApp->LoadStandardCursor();函数作用是引入一个光标。IDC_CROSS表示十字形。

    然后设置消息鼠标按下时,SetCapture();函数捕获光标,捕获以后当然要将他设置成十字形啦。

    void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
    {
     // TODO: Add your message handler code here and/or call default
     SetCapture();
     SetCursor(m_hMyCursor);     //m_hMyCursor 在初始化时已经将他设置成十字形了
     CClientDC dc(this);                   //至于dc(this)的形式,是为了传递一个句柄给dc。

                                             //既然有 dc,  所以你必然是定义的窗口类,

                                        // 因此this也可以说是你所定义的窗口类的指针 
    m = 1;  

    p1 = point;     
    }

    下一步:设置鼠标消息当鼠标弹起时,

    void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
    {
     // TODO: Add your message handler code here and/or call default
     p2 = point;
     CClientDC dc(this);
     OnPrepareDC(&dc);
     dc.MoveTo (p1);
     dc.LineTo (p2);
     m = 0;                将m赋0表示鼠标左键已放下
     ReleaseCapture();
    }

    下面也是最后一步了,添加设置鼠标移动的消息句柄

    void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
    {
     // TODO: Add your message handler code here and/or call default
     static int n = 0;
     switch(++n)
     {
     case 1:
      p2 = point;
      break;
     case 2:
      p1 = p2;
      p2 = point;
      n = 0;
      break;
     }
     CClientDC dc(this);
     OnPrepareDC(&dc);
     if(1 == m)                     //如果鼠标按下,则画线
     {
      dc.MoveTo (p1);
      dc.LineTo (p2);
     }
     CView::OnMouseMove(nFlags, point);
    }

    最后点运行就OK啦

    这个问题对于我这个NEW Learner的确有点难啦,花了好长时间才理解了,不过里面还是有些东西弄不懂,估计以后学到那份儿上才能知道吧

    其实偶刚做出来的并不标准,鼠标点下后变成十字固定在那儿,动一下才恢复;画线没问题,但是鼠标放下时,就是要动一下才能恢复原来的样子,其实是我设置m的时候多了个判读,最后会长找出来改正。他还简化了我的程序,直接用设置光标函数在初始化m_hCursor时就将之赋值。

    还用到了捕获光标函数,释放光标函数。

    当然我程序的基本功能都实现了,所以。。。。。。。还是可以进入软协啦,哈哈。

    希望在里面可以学到更多的东西。

  • 相关阅读:
    BZOJ3899 仙人掌树的同构(圆方树+哈希)
    BZOJ3590 SNOI2013Quare(状压dp)
    BZOJ2178 圆的面积并(simpson积分)
    BZOJ3724 PA2014Final Krolestwo(欧拉回路+构造)
    BZOJ3589 动态树(树链剖分+容斥原理)
    BZOJ3453 XLkxc(拉格朗日插值)
    BZOJ4650 NOI2016优秀的拆分(后缀数组)
    Luogu5058 ZJOI2004嗅探器(割点)
    shutil模块---文件,文件夹复制、删除、压缩等处理
    面向过程---通过查找字符串,找到相应的文件路径
  • 原文地址:https://www.cnblogs.com/xufeiyang/p/1758820.html
Copyright © 2011-2022 走看看