最近没事在看孙鑫的VC视频教程,也想学学VC了,虽说自己是学嵌入式的,但嵌入式这条路没个少说5年的学习恐怕是不行的,再加上自己喜欢走软件道路,所以想学学VC呢,感觉挺有趣的。
在第八课中有一个逃跑按钮的实现,不过在视频中是用两个按钮,依次一个显示,一个隐藏来实现的,后面孙鑫也提到了可以用SetWindowPos函数来实现一个坐标随机的逃跑按钮,但视频中没有给出实现过程,这里,我们来实现一下。
1.建议一个基于Dialog的MFC程序,并在资源视图中删除原有的控件,再添加一个Button控件,并修改Caption属性为“你能抓到我吗?”,如图所示。
2.如图所示,添加一个新的MFC类,基类选择CButton。
3.在CBtnDlg类中为IDC_BUTTON1添加一个控件变量m_btn,如图所示。
注:这里不明白为什么变量类型中不能选择我们刚刚创建的CPhBtn类,按理说这个类继承与CButton类,是可以选择的,不解,还请高人指点。
因为无法直接选择CPhBtn类,但也可以在CBtnDlg类的代码中手动修改一下。
在BtnDlg.h头文件中头部添加#include "PhBtn.h",且修改类成员CButton m_btn为CPhBtn m_btn,至此修改完毕。
4.在CPhBtn类中添加WM_MOUSEMOVE消息响应函数捕捉鼠标移动的消息,并添加代码。
- void CPhBtn::OnMouseMove(UINT nFlags, CPoint point)
- {
- // TODO: 在此添加消息处理程序代码和/或调用默认值
- CRect rectBtn;
- CRect rectDialog;
- //获取按钮和对话框的尺寸坐标
- GetWindowRect(&rectBtn);
- GetParent()->GetWindowRect(&rectDialog);
- //将相对于屏幕的尺寸大小转换为相对于对话框窗口的
- ScreenToClient(rectBtn);
- ScreenToClient(rectDialog);
- //获取一个相对于对话框大小的一个随机坐标
- int x = rand() % rectDialog.right;
- //保证整个按钮完整的显示在对话框内部
- if(x > rectDialog.right - rectBtn.right) x -= rectBtn.right;
- int y = rand() % rectDialog.bottom;
- if(y > rectDialog.right - rectBtn.bottom) y -= rectBtn.bottom;
- //不改变尺寸,不改变Z次序
- SetWindowPos(NULL, x, y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
- CButton::OnMouseMove(nFlags, point);
- }
OK,一个真正的逃跑按钮完成了。
----------------------------------------------------------------------------------
转载我博客文章郑重声明:技术性网站著名原创作者即可转载,商业性网站必须经过我的同意才能转载,否则追究责任——
pang123hui的博客: