为类添加消息处理函数与成员变量,因为要对控件添加WM_MOUSEMOVE消息处理函数,而控件变量本身

不能加消息处理函数,只有类才能添加,所以要创建CNewButton类,然后使按钮控件属于这个类,当鼠标

指针移动到这个类的按钮控件上时,就能响应这个函数。

原本应该昨天来写的,今天虽然是周末,但是还是来补上吧!今天主要学习如何设计对话框程序上的“逃跑”按钮,即每当鼠标移动到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函数中添加初始化代码:

点击(此处)折叠或打开

  1. // TODO: 在此添加额外的初始化代码
  2. m_btn_1.m_pBtn = &m_btn_2;
  3. m_btn_2.m_pBtn = &m_btn_1;

然后在类CBtn的属性中选择“消息”页面,选中添加响应WM_MOUSEMOVE:

     添加代码为:

点击(此处)折叠或打开

  1. void CBtn::OnMouseMove(UINT nFlags, CPoint point)
  2. {
  3. // TODO: 在此添加消息处理程序代码和/或调用默认值
  4. ShowWindow(SW_HIDE);
  5. m_pBtn->ShowWindow(SW_SHOW);
  6. CButton::OnMouseMove(nFlags, point);
  7. }

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. php创建数组教程,PHP中使用array函数新建一个数组

    PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合 ...

  2. 孙鑫对话框二中为什么要对按钮控件新建一个类(小结,5.2给出了结论)

    为类添加消息处理函数与成员变量,因为要对控件添加WM_MOUSEMOVE消息处理函数,而控件变量本身 不能加消息处理函数,只有类才能添加,所以要创建CNewButton类,然后使按钮控件属于这个类,当 ...

  3. DSP学习二:CCES平台的安装与新建一个工程

    CCES,全称CrossCore Embedded Studio,是ADI公司推出的一个DSP开发平台,安装完软件后注册license,如果没有注册license,其可支持的器件是有限的. 新建工程一 ...

  4. MFC(文档和串行化,孙鑫C++第十三讲笔记整理) .

    转自:http://blog.csdn.net/zh634455283/article/details/7882897 1.CArchive在菜单打开保存时的代码  CFile file(" ...

  5. Creo/Proe 二次开发中使用 QT 编程流程

    本文过期, 可以查看 http://blog.csdn.net/STPrinceT/article/details/71535694 或者 http://blog.csdn.net/stprincet ...

  6. 原生JS去除二维数组中重复了的一维数组

    <!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8" ...

  7. 删除二维列表中的dominated元素

    删除二维列表中的dominated元素 实现一个简单的二列表中的一维列表占优情况(即去掉superset) 下面是一个简单的例子: import copyc = [[1,2,3],[1,2,3,4], ...

  8. [unreal4入门系列之十二] 在UE4中创建非玩家角色(NPC)

    现在我们来创建一些NPC(non-playable characters,非玩家角色).在这个游戏中,当我们靠近NPC时,它们会做出相应的反应. 创建C++类 1) 在UE编辑器中,打开文件-新建C+ ...

  9. 第一次使用Android Studio时你应该知道的一切配置(二):新建一个属于自己的工程并安装Genymotio...

    一.新建工程: 1.新建一个Project: 打开Android Studio,新建一个Project,界面如下: 上图中,设置好工程名和路径之后,接下来可以一路next: 二.Android Stu ...

最新文章

  1. Postgresql:INSERT INTO ON CONSTRAINT pk_key_id do nothing
  2. 用MPLAB IDE编程时,软件总是弹出一个窗口提示: “the extended cpu mode configuration bit is enabled,but the program that
  3. 虚幻引擎学习之路:粒子系统篇(二)
  4. 怎么解决web service circular reference 问题
  5. [转载]程序员如何写出杀手级简历
  6. L1-046 整除光棍
  7. 监控IIS的运行状态
  8. python之调用科大讯飞的在线语音识别
  9. TongWeb7本地部署(Windows)
  10. C# 在PowerPoint中给图片添加超链接和获取图片的超链接
  11. EverNote 极致的免费笔记资料管理软件 (数据网络同步、支持PC、Mac与手机多平台) 转自:http://www.iplaysoft.com/evernote.html
  12. MQL5中的错误处理和日志记录
  13. 使用MusicTools下载全网音乐
  14. 【Mark】计算机科学导论
  15. linux通过无线网卡上网,Linux使用4G/5G无线网卡模块上网
  16. 计算机芯片维修论文,中职院校计算机硬件芯片检测及维修的论文
  17. 项目一 认识Linux操作系统
  18. python有哪些细节描写_细节描写的句子有哪些
  19. F2FS源码分析-2.2 [F2FS 读写部分] F2FS的一般文件写流程分析
  20. call,apply,bind的用法和区别

热门文章

  1. 油溶性乳化消泡剂闪亮登场,但是现场没出息一点泡沫!
  2. 非支配排序遗传算法NSGA-II学习笔记
  3. 潘凯:C++对象布局及多态实现的探索(十一)
  4. java8 Stream流
  5. lr背景虚化_怎样拍出背景模糊的照片
  6. ELKStack入门篇(一)之ELK部署和使用
  7. cortex-m4启动代码解读
  8. 神经网络:高深莫测又妙趣横生的完整历史!
  9. word 文档不显示图片解决办法
  10. 词嵌入(WORD2VEC)