[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时就将之赋值。

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

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

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

posted @ 2010-06-15 22:48  Velx  阅读(3590)  评论(0编辑  收藏  举报