[視窗] 模態與非模態視窗運作原理

對於模態與非模態視窗有基本了解,才能夠在對的場景用對的對話框來呈現。這篇文章會帶出模態與非模態視窗的基本運作機制!

  1. 模態視窗與非模態視窗的差異
    模態視窗創建之後,其父視窗在它關掉之前,無法做任何響應;而非模態視窗則是相反,在創建之後且未關閉之前,可以繼續對父視窗操作。

  2. 模態視窗的運作機制
    由「DialogBox」家族(例如DialogBox、DialogBoxIndirect、DialogBoxParam和DialogBoxIndirectParam)創建的對話框是模態視窗,在創建之前,系統將禁用其父視窗,並在這些API函數中為其創建一個新的消息循環,這些函數還需要回調函數(例如DialogProc)來處理消息。換句話說,模態對話框視窗具有其自己的消息循環和不同於主線程的視窗過程,在用戶單擊「確定」、「取消」或「關閉」之類的按鈕之前,它們始終處於模態視窗消息循環中。單擊按鈕後,使用「EndDialog」返回主線程中的主消息循環,父視窗可以再次響應。

  3. 非模態視窗的運作機制
    由「CreateDialog」家族(如CreateDialog、CreateDialogIndirect、CreateDialogParam和CreateDialogIndirectParam)創建的對話框是非模態視窗。它們將在創建後返回,而不是創建新的消息循環,該對話框使用在主線程中的消息循環。因此,父視窗也可以響應。
參考:DialogBoxParam 使用範例

留言

這個網誌中的熱門文章

[Hyper-V] 讓 Windows 可以吃到超過 16TB 的硬碟!