MFC单文档下为视图类添加按钮及其响应函数(手把手截图)
Posted yaked19
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC单文档下为视图类添加按钮及其响应函数(手把手截图)相关的知识,希望对你有一定的参考价值。
MFC接触也是比较久了,最开始看的是孙鑫的《VC++深入详解》,看了前面几章。后来又看了侯捷的那本《深入浅出MFC》,看的时候居然常常想起孙鑫的那本书,感觉还是侯捷更厉害,从头自己编写,最后整本书实际就是深挖了MFC的原理,然后写出了一个类似Windows画图程序的MFC软件。抱歉我也只看了十来章没有坚持下去。最后,想对各位说的是,入门还是孙鑫的那本书好,开头特别是第一章和第三章对着视频看,弄懂MFC的启动流程,消息路由,回调函数等,一步步来,你会收获很多的。相比而言,侯捷那本书原理讲的比较深。
跟我们比较相关的就是Document/View 还有Document Template,深入浅出这本书讲的透彻,明白一些。侯捷把这相容是三位一体,Document就是数据,view就是取景窗,可大可小,直接跟用户打交道的就是View,最后的Document Template就是用来统一这两者的。好了,下面就直奔主题:MFC单文档下为视图类添加按钮及其响应事件。
1. 利用MFC Wizard新建一个工程,在这里,我的工程名称是:Btn
后面一路Next下去,选用默认配置就好
2. 为我们自己的CBtnView类添加OnCreate函数,用以显示即将创建的Button
2.1 在CBtnView类上,鼠标右键-----》选择Add windows message handler添加WM_CREATE消息的处理函数
2.2 为了在On_CREATE消息处理函数的时候显示出按钮,我们首先要构造这个按钮,我们将构造一个CButton对象
和刚刚一样在CBtnView类上,鼠标右键———》选择Add Member Variable
2.3 接着就可以在刚刚创建的On_Create函数中初始化并显示按钮了(注意这里的最后一个变量)
在CSDN中查阅的Button::create函数原型为
Create( LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
他的实例是
CButton myButton1, myButton2, myButton3, myButton4;// Create a push button.
myButton1.Create(_T("My button"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, CRect(10,10,100,30), pParentWnd, 1);
最后一个变量是他的ID号,待会儿下面要用,这里我们设为1,倒数第二个为父窗口指针,这里我们用this,代表是指向的是CbtnView对象,因为button的父窗口就是view窗口
输入完毕后,Ctrl + F5运行一下,是不是就可以看到按钮了。O(∩_∩)O~
3. 为按钮添加消息处理程序
3.1 创建处理函数
这里就是MFC的核心了,基于消息然后响应相应的动作。当我们这里的按钮按下时,什么都没有发生,那是因为我们并没有为它创建并连接上处理函数(也叫回调函数)。
下面在CBtnView类中添加一个处理函数,
在CButtonView类上右键————》选择:Add member function添加一个名为OnBtnDown的消息处理函数
3.2 连接消息与其处理函数
MFC之所以能够依据不用消息产生动作,就是因为创建了一个Message Map,消息路由表,建立起消息与特定处理函数的连接,要是在Message Map中没有找到,那他最终就会调用系统默认的消息处理函数:DefWndProc()。
我们将要做的就是在Message map中添加对按钮按下消息与其处理函数的连接工作。
看到上图中的带红字部分,上面有一个ON_WM_CREATE消息的处理,还记得最开始吗?我们添加了一个WM_CREATE消息的响应函数:OnCreate(),在其中我们创建了按钮。
这里我们传入了button的ID号,及其处理函数,这样就将消息与动作连接起来了。
3.3 实现回调函数
我们将在button的处理函数中添加动作,这里就显示一个Message Box了
最终的效果就是,按下按钮,产生一个message box。
小结:
1. 其实这里创建button的消息响应函数的时候,对于函数的那个type我有点犹豫,因为之前添加button按钮的成员变量也是通过这种方式实现的,当时的type是:CButton类
在上面的截图上(3.3的图),我们用的是void,其实你会发现,这里的函数的type是其返回值的type。
2. 这里留个小疑问给大家,MFC怎么就凭一个button的ID就能知道是什么消息呢,然后调用OnBtnDown( )来处理?欢迎留言讨论。:)
以上是关于MFC单文档下为视图类添加按钮及其响应函数(手把手截图)的主要内容,如果未能解决你的问题,请参考以下文章