前言
在上一篇中,我们给最基本的窗体添加了一个按钮,有了按钮后,当然就需要发挥按钮的作用,大家都知道按钮最基本的功能就是通过用户的点击事件与计算机产生交互。如果你做过.net 的winform,wpf或者java的gui等开发,相信这样的操作你做过无数遍了,而且这样的操作也是非常方便的,借助vs这样强大的ide,很容易创建窗体,添加按钮,并给按钮添加点击事件,最后监听该事件,当该事件触发时候,回调事件处理函数,执行相应的操作。在现代的窗体应用程序开发中,你经常能看到event(事件)这样的东西,而看不到消息的处理,因为面向对象的语言对消息处理进行了封装,使得更方便的开发。那么go语言是否也能这样呢?答案是肯定的。但是,今天我们不做这样的事情,我们还是使用传统的处理消息的方式,来进行点击消息的处理,至于封装成类似c#中winform这样的,这个以后再玩。扯了那么一堆,无非就是想说,其实虽然各种新技术,新语言的不断出现,其实归根到底其本质还是没什么大的变化,至少目前是这样,无非就是对不方便的操作进行封装或者通过各种算法和数据机构得到更优的解决方案。那么就开始今天的按钮点击消息处理吧。
一、处理子窗体消息
当你给一个窗体添加了一个按钮后,按钮也就成了窗体的一个子窗体,当我们点击按钮的时候,按钮就产生了相应的消息,但是,我们之前就知道,父窗体取出消息队列中的各种消息,然后把消息传到消息处理函数中处理,那么子窗体的消息是否也能拿到呢?事实上是可以的。当按钮被点击后,子窗体就向父窗体发送了一个WM_COMMAND消息,所以我们需要在消息处理函数中添加WM_COMMAND类型消息的分支,最终的消息处理函数如下:
注意看,WM_COMMAND分支中,有一个if条件,它比较的是消息处理函数中参数wParam的低位与指定子窗体的id号是否相等。其实,wParam的低位就是产生消息的子窗体的id号,所以通过它便可以知道具体是那个子窗体产生的消息了。这里,产生消息后,弹出一个第一篇中就讲过的弹出消息窗口。
二、关于wParam参数与lParam参数的具体含义
1.LOWORD(wParam) ==> 子窗体ID
2.HIWORD(wParam) ==> 通知码
3.lParam ==> 子窗体句柄
三、添加按钮
那么这个子窗体id为什么和1比较?请看WM_CREATE中,addButton函数的最后一个参数就是1,因为我们创建了一个id为1的button。除了通过子窗体id来判断是哪个子窗体产生的消息外,我们也可以通过窗口句柄进行判断,如WM_COMMAND中注释所示。addButton函数如下:
上一篇已经讲过如何创建子窗体,所以这里就不讲了,关键是最后一个id参数,是本篇新加的子窗体id参数。
最后效果:
今天就到此,下次再继续~