1、从_twinmain内,程序进入主消息循环;
2、消息循环从消息队列(message queue)中取得一个消息(透过调用getmessage())。每个执行中的程序都有一个属于自己的消息队列;
3、消息循环根据消息内容来决定消息应该送给哪个windows procedure(wndproc),.. 这就称为消息分发(message dispatch)。通常“每一种”窗口或控件(control)都有一个windows procedure,来处理该种窗口/控件的行为;
4、windows procedure根据消息内容来决定应该调用哪个函数(利用switch/case语法);..
5、windows procedure处理完,控制权回到消息循环。继续进行2、3、4、5的动作;
6、当消息队列为空的时候,getmessage()无法取得任何消息,就会进入idle(空闲)状态,进入睡眠状态(而不是busy waiting)。当消息队列不再为空的时候,程序会自动醒过来,继续进行2、3、4、5的动作;
7、当取得的消息是wm_quit,getmessage()就会得到0的返回值,因而离开消息循环,程序结束。程序会利用调用postquitmessage()来将wm_quit放置进消息队列中,来造成稍后结束,而不会直接贸然跳离开循环来结束。
虽名为队列(queue),.. 但是消息队列中的消息并非总是先进先出(first in first out,fifo),有一些特例:
. 只要消息队列中有wm_quit ,就会先取出wm_quit,导致程序结束。
. 只有在没有其它消息的时候,wm_paint 和wm_timer才会被取出。且多个wm_paint可能会被合并成一个,wm_timer也是如此。
. 利用translatemessage()来处理消息,可能会造成新消息的产生。例如:translatemessage()可以辨识出wm_keydown(按键按下)加上wm_keyup(按键放开)就产生wm_char(字符输入)。
何谓消息
鼠标移动、按键被按下、窗口被关闭.,这些都会产生消息。在windows操作系统中,消息是以下面的数据结构存在的(定义在winuser.h档案中):..
新闻热点
疑难解答
图片精选