MFC 模拟消息发送,自定义以及系统消息
在 MFC 框架下,有很多系统已经定义好的消息,例如 ON_WM_LBUTTONDOWN()、ON_WM_MBUTTONDOWN()等等。我们在使用的时候只需要声明并调用就可以了,最简单的用法。
提升了一点难度的用法就是自己设置自定义消息,再提升一点难度的就是如何模拟系统消息了,一般情况下只是做普通的项目开发功能是用不到的。
在这里,我首先讲解下如何实现自定义消息,再深层次的讲述如何模拟系统消息,有需要的可以了解下哟~
自定义消息
在有些时候系统定义的消息不能完全满足程序的应用,这时候就需要进行消息自定义了,那么该如何实现自定义消息呢?
第一步:定义自定义消息名称以及 ID
在 MFC 框架下,分配了 WM_USER 之后的消息都是开发人员可以自定义的消息 ID。
假设,定义一个选中触发消息:
这种写法就代表了定义了一个自定义消息,消息名称叫做:WM_USER_CLICKED,消息 ID 号是:WM_USER+1
在这里,温馨提示一句:在做大型的绘图开发程序当中,为了方便管理自定义消息,一般都不会直接使用 WM_USER 进行编号自增,而是使用自定义宏代替 WM_USER,为了后续方便管理,格式如下:
如果要是你的程序中只存在了一两个自定义消息,就没有必要写成上面的格式了。
这种格式的好处:
可以根据功能划分自定义消息区域。假设你目前正在开发一个仅供公司内部使用的基础框架类,在自定义消息的时候,需要区分哪些是自己开发使用的,哪些是对外开发者调用的。分工明确,不容易消息错乱。
第二步:发送自定义消息
想要在哪里触发自定义消息,就需要在哪里发送消息。
在 MFC 框架中,有两种发送消息机制:SendMessage、PostMessage。
只是举例子说明,具体的根据实际功能来确定~
第三步:自定义消息映射
参数一:定义的自定义消息
参数二:实际窗口中响应的映射消息
第四步:自定义消息实现
具体的操作应用可以在 OnCustomClicked1 中编写了,这要根据实际的需求应用了,这里不再做过多的说明,到这里,应该都知道该如何应用了吧~
模拟系统消息
简单的自定义消息方法已经在自定义消息中讲述了,下面来一个更深层次的提高吧!如何模拟系统消息,为了通俗易懂的讲解,这里我们模拟 ComboBox 控件 CBN_SELCHANGE 消息。
使用过 MFC 框架下控件开发的人都知道,该消息是由系统发送的,平时我们只是应用下就可以了,要是让自己写一个这样的触发消息,该如何实现呢?
前提条件:继承 CWnd 类模拟 ComboBox 控件,这时候,所有的控件消息都需要自己内部模拟,那么,想要让外部开发人员调用起来与系统的 ComboBox 中的消息一致,该怎么实现呢?
假设我们应用 SendMessage 进行消息发送,此时也是需要发送消息,但是需要发送命令消息:WM_COMMAND
WM_COMMAND 在什么时候被触发呢?
1:当用户从菜单中选择命令项时
2:当控件向其父窗口发送消息时
3:当加速键击被翻译时
其实,在 WINDOW9X 以上都是在发送 WM_NOTIFY,但是为了做成兼容基类,所以,依旧采用的是 WM_COMMAND 消息。
一旦指定了使用 WM_COMMAND 来进行消息发送,这时候 wParam 以及 lParam 该发送什么数据呢?
wParam 参数
在发送自定义消息中,wParam 参数是分成了高字节与低字节之分的,需要采用 MAKEWPARAM 宏进行发送。
该宏创建了一个 32 位的无符号值,用作消息中的 wParam 参数,该宏连接两个指定的 16 位值。
在传递参数时,高位是当前模拟发送的 ID 号,每个窗口甚至是每个控件都有属于自己的编号,不难获取到。
低位是需要触发的系统消息,前面说到了模拟的是 CBN_SELCHANGE 消息,所以 wParam 参数的写法,如下:
LPARAM 参数
对于这个参数,就当对来说简单了,只需要传递当前窗口的 HWND,转换成 LPARAM 参数就可以了。
整体的模拟系统发送格式:
对于模拟系统发送消息来说,最重要的就是 SendMessage 的第二个参数以及第三个参数了。同样的道理,也可以使用 PostMessage 的方式发送。
消息发送出去之后,在外界的使用方式是如何呢?
既然我们模拟的是系统消息,在外部窗口调用的地方与 MFC 自带的控件消息方法是一致的
消息映射:
看着这个方法是不是很熟悉?与自带的 ComboBox 方式是不是一模一样?后续的使用方式都是一致的啦!
我是中国好公民 st,一名 C++程序猿~
版权声明: 本文为 InfoQ 作者【中国好公民st】的原创文章。
原文链接:【http://xie.infoq.cn/article/f843e336884ef18aafcc3a2c3】。文章转载请联系作者。
评论