事件和消息
一、消息就是用于描述某个事件发生的信息,而事件是对于Windows的某种操作。
二、事件和消息密切相关,事件是因,消息是果,事件产生消息,消息对应事件。所谓消息的响应,其实质就是事件的响应。
三、消息驱动是Windows应用程序的核心,所有的外部响应(如键盘、鼠标和计时器等)都被Windows先拦截,转换成消息后再发送到应用程序中的目标对象,应用程序根据消息的具体内容进行处理。
四、消息不仅可由Windows发出,它也可由应用程序本身或其它程序产生。Windows为每一个应用程序都维护一个或多个消息队列,发送到每个程序窗口的消息都排成一个队列。
消息分类
一、从消息的发送途径上看,可以分为队列消息和非队列消息。
A、队列消息大都是用户输入的结果,如WM_KEYDOWN和WM_KEYUP、WM_CHAR、 WM_MOUSEMOVE、WM_LBUTTONDOWN和WM_LBUTTONUP。队列消息还包括时 钟消息(WM_TIMER)、重画消息(WM_PAINT)和退出消息(WM_QUIT)等
B、非队列消息大部分来自特定的Windows函数,如当调用UpdateWindow时,Windows 将给调用此函数窗口的窗口过程发送WM_PAINT;当调用DestroyWindow时,Windows 将给调用此函数窗口的窗口过程发送WM_DESTROY等
二、从消息的来源来看,可以分为系统消息和自定义消息。
A、Windows消息是预定义的一些UINT常量值,它对系统本身用到的消息进行了定义
B、为了实现额外的消息,系统为开发人员预留了消息定义的接口
三、系统消息ID的范围是从0~WM_USER-1,或0X80000~0XBFFFF;应用程序消息从WM_USER(0X0400)~0X7FFF,或0XC000~0XFFFF;WM_USER~0X7FFF范围的消息由应用程序自己使用;0XC000~0XFFFF范围的消息用来和其他应用程序通信,为了保证ID的唯一性,使用::RegisterWindowMessage来获取该范围的消息ID
四、从对消息的处理上看,可以分为窗口消息、命令消息和控件通知。
A、窗口消息(WindowMessage)是由操作系统和控制其他窗口的窗口所使用的消息, 它一般与窗口的内部运作有关,如创建窗口、绘制窗口和销毁窗口等
B、命令消息是一种特殊的窗口消息,它从一个窗口发送到另一个窗口,以处理来自用 户的请求。当用户单击一个菜单项、工具栏或者使用加速键时,将会产生命令消息,并 被发送到能处理该请求的类对象
C、控件通知类似于命令消息,当用户与控件窗口交互时,这一类消息就从控件窗口发 送到其主窗口
消息发送
一、发送消息到一个窗口可以采用传送(Send)或寄送(Post)方式,这两种方式之间的主要区别是消息被接收对象收到后是否立即被处理。
二、Windows提供了三个API函数用于消息的发送
A、SendMessage函数用于向一个或多个窗口传送消息,该函数将调用目标窗口的窗口 函数,直到目标窗口处理完收到的消息,该函数才返回。
B、PostMessage函数用于向一个或多个窗口寄送消息,它把消息放在指定窗口创建的 线程的消息队列中,然后不等消息处理完就返回。
C、SendDlgItemMessage函数函数用于向对话框中指定的控件发送消息,直到目标控件 处理完收到的消息,该函数才返回。
三、三个函数拥有相同的参数:
HWNDhWnd, // handle to destinationwindow
UINTMsg, // message
WPARAMwParam, // first message parameter
LPARAMlParam // second message parameter
四、MFC将这三个函数封装为CWnd窗口类的成员函数,封装了目标窗口句柄(不需要hWnd这个参数),它们将向调用它的窗口对象发送或寄送消息,
五、与用户输入相关的消息(如鼠标消息和键盘消息)通常是以寄送(Post)的方式发送,以便这些用户输