2011-03-01 87 views
1

我想了解WTL的工作方式,現在消息循環令我困惑。Windows消息循環和WTL

例如此代碼段:link

首次創建和該消息泵啓動後的窗口。它是如何工作的?是不是CreateEx,UpdateWindow等應該發送像WM_CREATE/WM_PAINT/WM_NCPAINT自己的不可見消息?如果消息泵沒有初始化,它們在哪裏拋出?如果您創建窗口,啓動消息循環,然後關閉窗口,但想要在其中創建一個新窗口,會發生什麼? PostQuit退出循環,你必須創建一個新的?

回答

3

瞭解發佈消息(PostMessage)和發送消息(SendMessage)之間的區別在這裏很重要。 Windows直接爲發送的消息調用窗口過程,它們不由消息循環調度。在消息循環啓動之前,可以如何處理WM_CREATE和WM_SHOWWINDOW。 WM_QUIT,WM_PAINT,WM_KEYDOWN和WM_MOUSEMOVE是已發佈消息的示例。

+0

那麼基本上所有貼出的信息都會在這種情況下丟失?你最好從消息循環中創建窗口? – Coder 2011-03-01 15:56:16

+3

不,它們存儲在消息隊列中。您不能在消息循環中創建主窗口,雞肉和雞蛋。如果您想進行這種編程,Petzold需要閱讀。 – 2011-03-01 16:06:17

+1

好的,我今天訂購這本書。但是,主窗口如此特別的原因是什麼?您可以啓動循環,並將「singleton」初始化消息發佈到線程以創建窗口,這可以做到這一點,不是嗎? – Coder 2011-03-01 16:24:45

2

關於消息發送,CreateWindow直接發送消息,好像SendMessage被使用。如果你已經完成了很多Windows編程,你可能會直接以這種方式向消息發送消息,並且不需要消息泵即可立即執行; Windows也會自己做到這一點。

至於PostQuitMessage問題,通常的策略是在消息循環中進行一些其他檢查以查看應用程序是否應該退出。例如,不是在窗口關閉並在消息循環中等待WM_QUIT發佈退出消息,而是可以維護打開窗口的計數器,然後在打開窗口打開時打開窗口,然後退出。

沒有什麼神奇的約WM_QUIT,除了可以用PostQuitMessage發佈,並很容易地檢查它與GetMessage(等)功能的便捷方式。你可以自由地不使用它,並決定退出你的程序出於某種其他原因。