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单文档下为视图类添加按钮及其响应函数(手把手截图)的主要内容,如果未能解决你的问题,请参考以下文章

单文档工具栏按钮

如何解决MFC单文档滚动条拖动时的重影问题(高分)

猎豹MFC--画椭圆圆弧饼图多边形及其他形状

mfc 多文档中怎样动态添加菜单项?

C++MFC编程在工具栏中添加按钮,按下后没有反应,怎么回事

mfc 单文档 多文档 对话框 区别