孙鑫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-------------------------------------------------------------

浙公网安备 33010602011771号