VC----MFC对话框(3)【“逃跑”按钮的实现】
2016-08-24 19:57
549 查看
原本应该昨天来写的,今天虽然是周末,但是还是来补上吧!今天主要学习如何设计对话框程序上的“逃跑”按钮,即每当鼠标移动到Btn上面的时候就会自动跑到另外一个地方,看上去鼠标好像永远无法点中。其实今天我们使用一个有些讨巧的方法:设置鼠标WM_MOUSEMOVE的响应函数用于捕获鼠标移动操作,每当鼠标移动到btn上就修改属性隐藏,同时修改另一个btn的属性为显示,造成btn自动“逃跑”的假象。方法不难,但是我觉得学习MFC各种问题都有规范化的教程,关键是要从设计的过程中体会MFC的作用机制。下面将基本按照设计实现的步骤来进行描述,这里使用的IDE是VS2008:
1. 新建MFC-对话框项目RunBtn,设计基本界面
这步大家一般都会,新建-MFC项目-选择“基于对话框”就可以了,然后就会得到含有“OK”和“Cancel”默认按钮的对话框,删掉默认按钮,然后从右侧弹出的工具栏中拖动button控件放置到对话框中,设置caption;如果想修改字体则要选中对话框整体,在属性最下面有font选项,设计完成之后直接复制控件得到IDC_BUTTON2,如图:
2. 为控件添加类CBtn,绑定变量
这里需要特别说明一下,VS2008同VS6.0是很不同的,你直接右键控件时无法添加CButton的派生类的,如果想添加的话,只能选中项目根,右键添加类,MFC类-->MFC类向导-->选择继承CButton。
随后为两个空间分别绑定变量m_btn_1和m_btn_2,类型均为CBtn
3. 设置按钮初始化,添加WM_MOUSEMOVE响应代码
为了实现鼠标移动到某个按钮上时,自动实现自身的隐藏,同时显示另一个控件,我们在类CBtn中添加一个成员变量CBtn* m_pBtn用来保存另一个控件的地址,这样在一个控件的响应过程中就可以操控另一个控件。这里需要注意的是,只能为类添加消息响应函数,因此m_pBtn应该设置为类CBtn的成员。
在对话框对象创建完毕要进行显示时,可以在CRunBtnDlg类的OnInitDialog函数中添加初始化代码:
点击(此处)折叠或打开
// TODO: 在此添加额外的初始化代码
m_btn_1.m_pBtn = &m_btn_2;
m_btn_2.m_pBtn = &m_btn_1;
然后在类CBtn的属性中选择“消息”页面,选中添加响应WM_MOUSEMOVE:
添加代码为:
点击(此处)折叠或打开
void CBtn::OnMouseMove(UINT
nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
ShowWindow(SW_HIDE);
m_pBtn->ShowWindow(SW_SHOW);
CButton::OnMouseMove(nFlags, point);
}
4. 运行测试
然后就可以生成我们的程序了:
初始时两个按钮都会显示,但是鼠标移动之后:
再次移动:
5. 小结
是不是很简单?其实一个设计的实现关键是”算法“,也就是实现的思路,这个直接决定了实现的难易程度。通过这次个小程序,自己进一步熟悉了MFC对话框的操作,简单梳理一:
5.1 MFC中的控件作为资源必须绑定特定的类量和变量才能够实现,我们通过变量来操作控件的行为和和属性;
5.2 事件响应可以为类和变量添加,但是消息响应必须为类添加,控件IDC_BUTTON1是不能设置WM_MOUSEMOVE的响应的;
5.3 对话框MFC中的控件变量m_btn_1/2是直接作为CRunBtnDlg的成员而存在,但是可以通过设置其为CBtn类型指定只有按钮空间响应鼠标移动,只需要指定成员变量的类型就可以区分出消息响应的范围;
5.4 如果直接在类CRunBtnDlg中设置WM_MOUSEMOVE的响应,会导致鼠标移动到对话框范围即会响应,如在该类中添加MessageBox代码,结果会导致始终弹出MSG消息框:
1. 新建MFC-对话框项目RunBtn,设计基本界面
这步大家一般都会,新建-MFC项目-选择“基于对话框”就可以了,然后就会得到含有“OK”和“Cancel”默认按钮的对话框,删掉默认按钮,然后从右侧弹出的工具栏中拖动button控件放置到对话框中,设置caption;如果想修改字体则要选中对话框整体,在属性最下面有font选项,设计完成之后直接复制控件得到IDC_BUTTON2,如图:
2. 为控件添加类CBtn,绑定变量
这里需要特别说明一下,VS2008同VS6.0是很不同的,你直接右键控件时无法添加CButton的派生类的,如果想添加的话,只能选中项目根,右键添加类,MFC类-->MFC类向导-->选择继承CButton。
随后为两个空间分别绑定变量m_btn_1和m_btn_2,类型均为CBtn
3. 设置按钮初始化,添加WM_MOUSEMOVE响应代码
为了实现鼠标移动到某个按钮上时,自动实现自身的隐藏,同时显示另一个控件,我们在类CBtn中添加一个成员变量CBtn* m_pBtn用来保存另一个控件的地址,这样在一个控件的响应过程中就可以操控另一个控件。这里需要注意的是,只能为类添加消息响应函数,因此m_pBtn应该设置为类CBtn的成员。
在对话框对象创建完毕要进行显示时,可以在CRunBtnDlg类的OnInitDialog函数中添加初始化代码:
点击(此处)折叠或打开
// TODO: 在此添加额外的初始化代码
m_btn_1.m_pBtn = &m_btn_2;
m_btn_2.m_pBtn = &m_btn_1;
然后在类CBtn的属性中选择“消息”页面,选中添加响应WM_MOUSEMOVE:
添加代码为:
点击(此处)折叠或打开
void CBtn::OnMouseMove(UINT
nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
ShowWindow(SW_HIDE);
m_pBtn->ShowWindow(SW_SHOW);
CButton::OnMouseMove(nFlags, point);
}
4. 运行测试
然后就可以生成我们的程序了:
初始时两个按钮都会显示,但是鼠标移动之后:
再次移动:
5. 小结
是不是很简单?其实一个设计的实现关键是”算法“,也就是实现的思路,这个直接决定了实现的难易程度。通过这次个小程序,自己进一步熟悉了MFC对话框的操作,简单梳理一:
5.1 MFC中的控件作为资源必须绑定特定的类量和变量才能够实现,我们通过变量来操作控件的行为和和属性;
5.2 事件响应可以为类和变量添加,但是消息响应必须为类添加,控件IDC_BUTTON1是不能设置WM_MOUSEMOVE的响应的;
5.3 对话框MFC中的控件变量m_btn_1/2是直接作为CRunBtnDlg的成员而存在,但是可以通过设置其为CBtn类型指定只有按钮空间响应鼠标移动,只需要指定成员变量的类型就可以区分出消息响应的范围;
5.4 如果直接在类CRunBtnDlg中设置WM_MOUSEMOVE的响应,会导致鼠标移动到对话框范围即会响应,如在该类中添加MessageBox代码,结果会导致始终弹出MSG消息框:
相关文章推荐
- 孙鑫VC学习笔记:第八讲 逃跑按钮的巧妙实现和MFC中指针的获取
- 孙鑫VC学习笔记:第八讲 逃跑按钮的巧妙实现和MFC中指针的获取
- VC中实现按钮提示,使用CToolTipCtrl2007年01月23日 星期二 20:09如果你需要对对话框上的一个按钮进行鼠标停靠提示,那么这么做:
- VC++, MFC中实现选择文件夹,选择文件对话框,确定当前工作目录(转载)
- VC MFC对话框中按钮背景色以及大小设置
- (VS2013)MFC对话框中用多个按钮创建多个子对话框实现选项卡效果(自己有修改)
- VC自绘按钮的实现(NO MFC)
- MFC功能实现单选按钮通道切换对话框有记忆功能
- (VS2013)MFC对话框中用多个按钮创建多个子对话框实现选项卡效果
- MFC功能实现单选按钮通道切换对话框有记忆功能
- VC逃跑按钮SetWindowPos实现——看孙鑫老师教程的启发
- MFC中界面按钮调用(显示)对话框功能实现
- VC MFC 对话框,如何实现鼠标拖动显示一个框,松开鼠标框就消失
- VC2005逃跑按钮实现
- 孙鑫vc++ 8 对话框(2) 逃跑按钮的实现
- MFC学习日记十一:Mfc基于对话框编程之逃跑按钮(第八课)
- 在VC++中的MFC利用一个dialoge对话框中按钮调用另一个dialoge对话框
- (孙鑫)VC++深入讲解 第八章 VS2010实现逃跑按钮
- VC++MFC对话框应用程序实现程序最小化到系统托盘
- MFC中实现单击按钮弹出对话框的方法