WM_CLOSE、WM_DESTROY、WM_QUIT的區別(詢問,銷毀窗口,退出進程,都不是一回事)


1、發送消息SendMessage、PostMessage

PostMessage將消息放入消息隊列后馬上返回,而SendMessage直到窗口過程處理完消息后才返回

2、三個消息的區別

WM_CLOSE:

  在系統菜單里選擇了“關閉”或者點擊了窗口右上角的“X”按鈕,你的窗口過程就會收到WM_CLOSE。DefWindowProc對 WM_CLOSE的處理是調用DestroyWindow。當然,你可以不讓DefWindowProc處理,而是自己處理,例如詢問用戶是否保存更改等。如果用戶選擇“取消”,你忽略此消息,那么程序照常運行;如果用戶確認要退出,你就調用DestroyWindow。


WM_DESTROY:

  接下來,DestroyWindow完成窗口的清理工作,最后像窗口過程發送WM_DESTROY。對於 WM_DESTROY,DefWindowProc不會處理。也就是說,你如果不處理這個消息,雖然你的窗口已經銷毀,但進程並不會結束。一般處理 WM_DESTROY時都是釋放資源(例如申請的內存等),然后調用PostQuitMessage。

 

WM_QUIT:

  PostQuitMessage會發送WM_QUIT給消息隊列。注意,WM_QUIT永遠不會到達窗口過程,因為GetMessage得到WM_QUIT后就會返回FALSE,從而結束消息循環,最后進程結束,程序退出。

 

 

假設使用者執行HELLOWIN,並且使用者最終單擊了 Close按鈕,或者假設用鍵盤或鼠標從系統菜單中選擇了Close, DefWindowProc處理這一鍵盤或者鼠標輸入,在檢測到使用者選擇了Close選項之后,它給窗口消息處理程序發送一條WM_SYSCOMMAND消息。WndProc將這個消息傳給DefWindowProc。 DefWindowProc給窗口消息處理程序發送一條WM_CLOSE消息來響應之。WndProc再次將它傳給DefWindowProc。 DestroyWindow呼叫DestroyWindow來響應這條WM_CLOSE消息。DestroyWindow導致Windows給窗口消息處理程序發送一條WM_DESTROY消息。WndProc再呼叫PostQuitMessage,將一條WM_QUIT消息放入消息隊列中,以此來響應此消息。這個消息導致WinMain中的消息循環終止,然后程序結束。

3、退出程序語句

exit(0);

postquitmessage(0);

onok();oncancel();

sendmessage(wm_close,0,0);

exitprocess(0);

其中以exit(0)最為迅速,在實踐方面

 

 

Ps:

原文:SendMessage sends the specified message to a window or windows. SendMessage calls the window procedure for the specified window and does not return until the window procedure has processed the message. The PostMessage function, in contrast, posts a message to a thread's message queue and returns immediately.

譯文:SendMessage將指定的消息發送到一個窗口或多個窗口。SendMessage為這個指定的消息調用窗口處理程序,直到窗口處理完這個程序后才會返回。和SendMessage函數相比,PostMessage函數發送一個消息到線程消息對列中,並立即返回。

辨析:shuishi32 在給出翻譯的還給對ddlddy的問題:“我用SendMessage(hWnd,WM_QUIT,NULL,NULL)和PostMessage(hWnd,WM_QUIT,NULL,NULL)去關閉一指定窗口,SendMessage的不能實現,可以解釋一下嗎?我主要的就是想知道這個!”給出了解答:WM_QUIT是通知系統關閉,這個消息只有系統通過GetMessage來返回0達到線程關閉的。而SendMessage發送的消息不會到系統對列中,它只是處理,而PostMessage就會發送到系統隊列中。 另外可以用SendMessage(hWnd, WM_CLOSE, 0, 0);來關閉對話框。

這是一個很多朋友曾經問過的問題,我推薦大家看win32消息機制方面的書籍,比如《Windows 程序設計》、《Windows 環境下32位匯編程序設計》(不是非要用到匯編才需要看這本書,^-^)。

http://blog.csdn.net/yiruirui0507/article/details/6062991


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM