WTL/ATL Window 關閉時所收到的 4 種 Message

1. WM_CLOSE -> OnClose

情境: 外部的關閉請求(當右上角的 X 按下,或是 ALT+F4 按下。)

  • 處理第一線的關閉請求,決定是否要執行關閉。
  • 通常會將 Handler 取名叫 OnClose,但是沒有硬性規定。
  • DefWinProc 的 default 行為即是關閉視窗,並送出 WM_DESTROY

2. WM_DESTROY -> OnDestory

情境: 視窗準備要被關閉。

  • 你沒辦法阻止即將發生的關閉行為,你只能做關閉前的資源清理。
  • 通常會將 Handler 取名叫 OnDestory,但是沒有硬性規定。

3.1 WM_NC_DESTROY

情境: 視窗已經被關閉。

3.2 OnFinalMessage

  • ATL 在做 Message Routing 時,提供一個 virtual OnFinalMessage。它在收到 WM_NC_DESTROY 時,有再特別處理。保證最後一則 Message 都有被處理之後,才呼叫 OnFinalMessage
  • 做一些關閉之後的資源清理。比較常做的是做 delete this,將被 new 的自己給自我了結。

WM_DESTROYWM_NC_DESTROY 是成對的訊息,分別表示關閉前後的時間點。做關閉時,Parent 與 Child 收到的關閉訊息以 Stack-like 的方式收到。

Parent - WM_DESTROY
    Child - WM_DESTROY
           ...
    Child - WM_NC_DESTROY
    ...
Parent - WM_NC_DESTROY

4. WM_QUIT

情境: 一切視窗皆已關閉。

終止 Message Loop。此 Message 會使得 GetMessage() 得到 0,而離開 Loop。
沒有 Loop 來派送 Message,所以基本上也不會有所謂的 Handler 來處理。

Reference

comments powered by Disqus