孙鑫C++教程中留下来的作业--利用SetWindowPos创建“逃跑按钮”

--第一次写随笔,见证着本菜鸟向大神进军吧!

--不想当大神的程序员都不是好程序员!

--只是简单地介绍下我目前认为重要的地方。

BEGIN----------------------------------------------------------

1.我们对控件的操作都是通过类来完成的,这也是我们这里先要创建一个按钮类的原因:

1 class CEscapeBtn :
2     public CButton

  创建了类之后,就可以添加鼠标移动的响应函数了!

 1 void CEscapeBtn::OnMouseMove(UINT nFlags, CPoint point)
 2 {
 3     static int i=0;       //通过static避免重复初始化
 4     if(0==i)
 5     {
 6        GetWindowRect(&rect);    
 7        GetParent()->ScreenToClient(&rect);//重要
 8     }
 9     if(i%2==0)
10     {
11         SetWindowPos(GetDlgItem(IDC_BUTTON1),300,300,0,0,SWP_NOSIZE);
12         i++;
13     }
14     else
15     {
16         
17         SetWindowPos(GetDlgItem(IDC_BUTTON1),rect.left,rect.top,0,0,SWP_NOSIZE);
18         i++;
19     }
20     CButton::OnMouseMove(nFlags, point);
21 }

上面的变量rect我们设置成类的私有函数--延长它的生命周期。

1 private:
2     CRect rect;

上面第七行一定要GetParent(),否则转换的rect会不准确,原因是ScreenToClient()默认调用当前的窗口即按钮,而不是我们想要的对话框窗口。

PS:rect的四个坐标我的记忆方法:左(left)上(top)角,右(right)下(bottom)角。

接下来我们回想:程序是如何调用这个响应函数的呢?--这里,我们需要建立一个与对话框联系的纽带--在CxxDlg类中添加的与按钮关联的变量! 

在这个类的头文件中我们需要添加这些代码:

#include "EscapeBtn.h"
public:
    CEscapeBtn m_btn;

于是,消息就可以通过这个变量在对话框和按钮之间相互传递了,当然,负责消息传递的函数是DoDataExchange(),我们可以看看这几行代码:

1 void C逃跑按钮Dlg::DoDataExchange(CDataExchange* pDX)
2 {
3     CDialogEx::DoDataExchange(pDX);
4 
5 
6     DDX_Control(pDX, IDC_BUTTON1, m_btn);
7 }

这是系统自动生成的代码,通过DDX_Control()进行控件、窗口之间的相互关联。

END-------------------------------------------------------------

posted @ 2013-06-12 22:29  輪迴之間  阅读(451)  评论(0)    收藏  举报