[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时就将之赋值。
还用到了捕获光标函数,释放光标函数。
当然我程序的基本功能都实现了,所以。。。。。。。还是可以进入软协啦,哈哈。
希望在里面可以学到更多的东西。