首先,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参数,并对相应消息进行处理即可。