在windows系统中,任何动作反映都是基于消息的,也就是说没有消息的触发(人为或自动)操作系统就永远处于一种等待状态,不会作出任何反映,比如一台电脑,打开后你不去理会它,那么它永远处于等待状态,直到断电..呵呵.

下图就是鄙人理解的Windows的消息机制的模型,如有不妥之处还请高手指点         

在Windows编程中,每个可视的部分都可以称为一个窗口(Window),例如:视图,框架,菜单,工具栏,状态栏,对话框,按纽控件,输入框,下拉列表等等,都是一个窗口对象,每个窗口都有自己的类,里面都有自己的属性和方法。方法里就有一个叫做窗口过程的,即DefWndProc(),这个就是此窗口类的消息处理过程,它是一直不断循环接收消息,发出动作,等待消息的。

消息的整个过程如图中编号:1,由用户对某个窗口发出命令消息(单击,双击,拖动,等等);2,此消息被操作系统捕捉,放到操作系统的消息队列中等待处理;3,操作系统经过分析把此消息放到相应的应用程序的消息队列;4,由应用程序对象对此消息分析,发送给相应的窗口对象;5,此窗口对象对此消息分析,调用相应的方法,做出反应,然后继续等待新的消息的到来。

其中在第5步时,所做出的反应可能就是发送一个消息(目的是引发其他窗口作出相应的动作反应),然后次消息被发送到操作系统,再按之前的分析进行循环,一直到最后的消息只能是操作系统自己处理,然后继续等待用户的命令.

    在理解了Windows的消息机制之后,我们就可以在编程中灵活多了

1,可以自定义消息

2,可以重写默认的窗口过程函数DefWndProc(),来实现自己消息分析方法

3,进而可以编写自己的消息处理函数

当然,如果细分消息类型的话又可以按消息触发,发送的方式分为队列消息和非队列消息,

其区别就是队列消息在触发是一定会被操作系统接收进操作系统的消息队列,然后进入应用程序消息队列,最后才进入窗口过程,也就是上面所说的那种机制,

而非队列消息就是,消息触发的时候直接送到相应的窗口过程,省去了送进操作系统消息队列,分析,再送入应用程序消息队列的过程.这种消息使程序运行异步性比较强,

系统默认触发,发送消息的方式多为队列消息

用户自己触发的消息如果用Post(userMSG)也属于队列消息,而用Send(userMSG)则属于非队列消息.

转自 http://hi.baidu.com/chenfalei/blog/item/9e75922597a8ac6335a80f4c.html

 

 

posted on 2009-02-23 12:02  叶秋  阅读(489)  评论(0编辑  收藏  举报