召喚僞代碼:
代碼很簡單, 先在Wm_CREATE中創建一個Timer, 間隔2秒MessageBox,
WM_LBUTTONDOW會顯示一個DialogBox, IDD_ABOUTBOX.
當IDD_ABOUTBOX顯示時, 主窗口的WM_PAINT仍然響應重繪, 而MessageBox也會定時的蹦出來!
如果說主窗口的消息循環被暫時中斷, 那麼WM_PAINT和WM_TIMER就不會響應.
如果這兩個消息有響應, 主循環就沒有被凍結, 但點主窗口雜沒反應呢?
事情是這樣的:
我們知道modal dialog自帶消息循環, 當主窗口調用DialogBox時就進入了其內部的消息循環.
GetMessage的特點是從所屬線程的消息隊列裏拿消息並處理之, 而這個線程正是我們的主窗口所在的線程,
所以雖然我們的主窗口消息循環被實際凍結了但modal dialog爲我們代勞之, 主窗口的內部消息仍然有響應.
當然直接點它就沒反應拉
網上有很多說法雖然正確但感覺過於籠統不夠詳盡, 所以特發此帖希望對有相同困惑的朋友能有一些幫助.
高手就路過吧:P