MFC对windows三类消息映射机制的理解

首先,windows消息分为三种,标准消息、命令消息和通告消息。

标准消息就是常见的鼠标、键盘啊等等这些的消息,除WM_COMMAND外,所以以WM开头的消息都是标准消息。

命令消息来自菜单、加速键或工具栏按钮。以WM_COMMAND宏形式,在MFC中通过菜单项ID区分不同命令消息,在SDK中用wParam参数表示。

通告消息来自控件,比如按钮单击,列表框选择等。也是以WM_COMMAND宏表示。

CWnd派生类可以接受三种消息,而CCmdTagget派生类(例如文档类,应用程序类)智能接受命令消息和通告消息。


消息映射过程:MFC中所有窗口过程函数换成AfxWndProc,通过逐级调用,最后都会进入到所熟知的WindowProc函数中。它又将调用OnWndMsg函数。在这个函数中有众多的if条件判断。如果是WM_COMMAND消息,就交给OnCommand函数,如果是WM_NOTIFY,就交给OnNotify函数。剩下的都归到标准消息。接下来进行消息映射,OnWndMsg会搜索消息宏映像,从而找到消息处理函数,这么说本质上三者是一样的,只是入口不一样,命令和通告消息走的是WM_COMMAND入口。对于那些找不到消息处理函数的,函数将返回交给DefWindowPro进行默认处理,在windows.h中有定义。


它们最大的区别在于,标准消息和通告消息主要由窗口类处理,而命令消息处理对象范围较广,有窗口类、文档类、应用类等等,所以对于命令消息而言需要路由的过程确定响应顺序。


消息映射一般包括三部分:消息响应函数原型,消息映射宏以及消息响应函数的定义。知道这三部分组成,我们在项目中也能自己定义消息、发送消息和响应消息。发送消息可以用SendMesage或PostMessage函数,前者将消息直接发送给窗口,在窗口过程对消息处理完毕后才返回,不进队。后者将消息放入与窗口线程相关联的消息队列后立即返回。只需在响应函数中用switch-case判断wParam参数,并对相应消息进行处理即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值