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檔案中):..
新聞熱點
疑難解答
圖片精選