逃跑按钮的实现

       最近没事在看孙鑫的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消息响应函数捕捉鼠标移动的消息,并添加代码。
 
  1. void CPhBtn::OnMouseMove(UINT nFlags, CPoint point) 
  2.         // TODO: 在此添加消息处理程序代码和/或调用默认值        
  3.     CRect rectBtn; 
  4.         CRect rectDialog; 
  5.          
  6.         //获取按钮和对话框的尺寸坐标        
  7.         GetWindowRect(&rectBtn); 
  8.         GetParent()->GetWindowRect(&rectDialog); 
  9.         //将相对于屏幕的尺寸大小转换为相对于对话框窗口的        
  10.         ScreenToClient(rectBtn); 
  11.         ScreenToClient(rectDialog); 
  12.  
  13.         //获取一个相对于对话框大小的一个随机坐标        
  14.         int x = rand() % rectDialog.right; 
  15.         //保证整个按钮完整的显示在对话框内部        
  16.         if(x > rectDialog.right - rectBtn.right)     x -= rectBtn.right; 
  17.         int y = rand() % rectDialog.bottom; 
  18.         if(y > rectDialog.right - rectBtn.bottom)        y -= rectBtn.bottom; 
  19.  
  20.         //不改变尺寸,不改变Z次序        
  21.         SetWindowPos(NULL, x, y, 0, 0, SWP_NOSIZE | SWP_NOZORDER); 
  22.          
  23.         CButton::OnMouseMove(nFlags, point); 
  24. }  
 
OK,一个真正的逃跑按钮完成了。
 
---------------------------------------------------------------------------------- 
转载我博客文章郑重声明:技术性网站著名原创作者即可转载,商业性网站必须经过我的同意才能转载,否则追究责任——
pang123hui的博客:
posted @ 2011-01-29 11:33  云说风轻  阅读(2720)  评论(0编辑  收藏  举报