MFC学习——“逃跑”按钮的实现

如何设计对话框程序上的“逃跑”按钮,即每当鼠标移动到Btn上面的时候就会自动跑到另外一个地方,看上去鼠标好像永远无法点中?

讨巧:设置鼠标WM_MOUSEMOVE的响应函数用于捕获鼠标移动操作,每当鼠标移动到btn上就修改属性隐藏,同时修改另一个btn的属性为显示,造成btn自动“逃跑”的假象。

步骤:

1、创建基于对话框的应用程序

新建-MFC项目-选择“基于对话框”就可以了,然后就会得到含有“OK”和“Cancel”默认按钮的对话框,删掉默认按钮,然后从右侧弹出的工具栏中拖动button控件放置到对话框中,设置caption;如果想修改字体则要选中对话框整体,在属性最下面有font选项,设计完成之后直接复制控件得到IDC_BUTTON2,如图:

2、为控件添加类CBtn,绑定变量

利用类向导添加CButton的派生类的CBtn如下图

分别右键两个按钮,为按钮增加CBtn类型的变量如图:

随后为两个空间分别绑定变量m_btn_1和m_btn_2,类型均为CBtn

3、设置按钮初始化,添加WM_MOUSEMOVE响应代码

为了实现鼠标移动到某个按钮上时,自动实现自身的隐藏,同时显示另一个控件,在类CBtn中添加一个成员变量CBtn* m_pBtn用来保存另一个控件的地址,这样在一个控件的响应过程中就可以操控另一个控件。这里需要注意的是,只能为类添加消息响应函数,因此m_pBtn应该设置为类CBtn的成员。

在对话框对象创建完毕要进行显示时,可以在CRunBtnDlg类的OnInitDialog函数中添加初始化代码:

	// TODO: Add extra initialization here

	m_btn_1.m_pBtn = &m_btn_2;
	m_btn_2.m_pBtn = &m_btn_1;

添加CBtn的WM_MOUSEMOVE消息响应函数:

// CBtn message handlers

void CBtn::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: Add your message handler code here and/or call default
	ShowWindow(SW_HIDE);
	m_pBtn->ShowWindow(SW_SHOW);
	CButton::OnMouseMove(nFlags, point);
}

4、运行测试

初始界面显示两个按钮,需要设置一个为隐藏,在按钮的属性页面设置visible为false即可

最终结果:

总结:

  • MFC中的控件作为资源必须绑定特定的类量和变量才能够实现,我们通过变量来操作控件的行为和和属性;
  • 事件响应可以为类和变量添加,但是消息响应必须为类添加,控件IDC_BUTTON1是不能设置WM_MOUSEMOVE的响应的;
  • 对话框MFC中的控件变量m_btn_1/2是直接作为CRunBtnDlg的成员而存在,但是可以通过设置其为CBtn类型指定只有按钮空间响应鼠标移动,只需要指定成员变量的类型就可以区分出消息响应的范围;
  • 如果直接在类CRunBtnDlg中设置WM_MOUSEMOVE的响应,会导致鼠标移动到对话框范围即会响应。
时间: 2024-11-21 04:40:50

MFC学习——“逃跑”按钮的实现的相关文章

对话框捕获鼠标移动消息,实现“逃跑按钮”

在弹出的对话框上显示逃跑按钮,当鼠标移动到该按钮上时,该按钮隐藏,而在别的位置上显示一个一模一样的按钮,鼠标再次置于新按钮上时,该按钮再次隐藏而在另一位置显示,用户感觉按钮好像在自动逃跑移动: 1.新建一个基于对话框的MFC工程,将其资源窗口的对话框中的自带控件删除,在不同位置添加两个一模一样的按钮控件 2.此处需要让按钮来捕获鼠标移动的消息,但是该对话框中有两个一样的按钮,故需要创建一个派生于CButton类的新的类CNewButton,为两个按钮控件分别添加成员变量并与CNewButton类

MFC学习计划启动

对于C++的基础课程已经学习了不少时间,但一直未有机会.时间去深入.很早之前我就知道了MFC.QT等C++开发框架,由于QT可跨平台的优点,我在那时就意识到要将精力投入到QT的学习中,可后面接触了QT,才意识到QT学习的难度,虽然QT各方面都非常卓越,但由于是新鲜事物,在国内,对于QT的资料实在稀少,相对来说学习难度会大很多,这也是我不得不暂时放弃他的原因.所以,现在的MFC学习计划也由此而来! 不管怎么说吧,现在我是一心想着学习MFC,希望能早日入得编程大门!

mfc学习---文档视图架构

MFC的AppWizard可以生成三种类型的应用程序:基于对话框的应用.单文档应用(SDI)和多文档应用(MDI). 一般情况下,采用文档/视结构的应用程序至少应由以下对象组成:       1.应用程序是一个CwinApp派生对象,它充当全部应用程序的容器.应用程序沿消息映射网络分配消息给它的所有子程序.       2.框架窗口是一CfrmeWnd派生对象.       3.文档是一个CDocument派生对象,它存储应用程序的数据,并把这些信息提供给应用程序的其余部分.       4.视

MFC学习之窗口基础

WinMain函数 1.句柄(HANDLE):{ 1. 定义:资源的标识 2. 句柄的作用: 操作系统通过句柄来找到对应的资源,从而对这些资源进行管理和操作. 3句柄的分类:(按资源){ 1.图标句柄(HICON) , 2.光标句柄(HCURSOR) , 3. 窗口句柄(HWND) , 4.应用程序实列句柄(HINSTANCE). } } 2.Windows应用程序,操作系统,计算机硬件之间的相互关系 Windows程序的入口函数: 窗口应用程序入口: Int WINAPI WinMain( H

MFC学习中遇到的小问题和解决方案

1 清除combox里面的内容((CComboBox*)GetDlgItem(IDC_COMBO_CF))->ResetContent();//消除现有所有内容2 如何获取鼠标指针的位置GetWindowRect 详情见657面 超市管理系统 3 如何获取combox下拉列表的索引:int selgetcursel;getlbtext; 4 选中某行某列值并修改SetItemText 5 单击选中listcontrol控件某行右键 添加一个菜单 并触发事件 (见该网页第15条记录) http:/

MFC学习单选框Radio使用

创建单选框Radio ,ID号IDC_RADIO_NAME 1.获取单选框内容 int RadioState = ((CButton *)GetDlgItem(IDC_RADIO_NAME))->GetCheck();//返回1表示选上,0表示没选上 2.默认值设置 在初始化中添加 ((CButton *)GetDlgItem(IDC_RADIO_NAME))->SetCheck(TRUE);//选上 ((CButton *)GetDlgItem(IDC_RADIO_NAME))->Se

再谈MFC学习——模态对话框的数据传递

学习c++的目的就是为了使用封装好的类,而最最经典的封装类当然是微软的MFC窗口程序类.学习MFC编程之前要学习c++的主要知识,掌握c++的基本编程思想.下面就看下我学习的MFC模态对话框的数据传递. 首先,什么叫做模态对话框呢?模态对话框指的是当弹出这样的对话框的时候,程序不能相应除了此对话框外其他的窗口的响应,直到关闭了这个对话框,程序才能响应其他的对话框的响应.非模态对话框即使弹出也能响应程序其他的窗口而不需要等到此窗口的关闭.那么MFC中怎么才能弹出模态对话框呢?其实很简单,首先创建这

MFC学习笔记1---准备工作

什么是MFC MFC,全称Microsoft Foundation Classes,微软基础类库,顾名思义,是微软的攻城狮们将一些常用的基础的Windows API 函数用C++的形式封装成类,简化程序猿的工作,将C++面向对象这一特点很好的表现出来. 用MFC可以用鼠标来编辑界面,管理各种控件,以及简化一些操作如字符串操作.文件操作.时间日期操作.网络操作.Windows系统操作.数据库操作…… 既然MFC是类库,那么她必然会用到类的特性:模板类.类的封装继承.虚继承.多态性等等. 然而就我的

MFC学习随笔(1)

最近在学习用MFC编写一个简单的界面.其实MFC并不是十分复杂的,经过一段时间的熟悉就可以实现许多基础功能.但是在编写的过程中,经常会遇到林林总总的bug,让人摸不到头脑.今天记录一个过去没有注意过的bug. 在主对话框的一个函数中,我需要对一个List Control控件进行操作.理所当然的,我想要直接传递句柄,于是这样声明以及调用函数: void void DisplaySubMax(int sub_id,CListCtrl m_cur_max); DisplaySubMax(0,m_sub