前言
對於視窗運作有基本了解,才能夠在對的場景用對的對話框來呈現。這篇文章會帶出 Modal (模態) 與 non-Modal (非模態) 視窗的基本運作機制!
Modal 視窗的運作機制
由 DialogBox
家族 (例如 DialogBox
、DialogBoxIndirect
、DialogBoxParam
和 DialogBoxIndirectParam
) 創建的對話框是 Modal 視窗。
在創建之前,系統將禁用其父視窗,並在這些 API 函數中為其創建一個新的消息循環 (Message loop),這些函數還需要回調函數 (例如 DialogProc
) 來處理消息。換句話說,Modal 對話框視窗具有其自己的消息循環和不同於主線程的視窗過程,在用戶單擊 確定
、取消
或 關閉
之類的按鈕之前,它們始終處於 Modal 視窗消息循環中。單擊按鈕後,使用 EndDialog
返回至主線程中的主消息循環,父視窗可以再次響應。
non-Modal 視窗的運作機制
由 CreateDialog
家族 (例如 CreateDialog
、CreateDialogIndirect
、CreateDialogParam
和 CreateDialogIndirectParam
) 創建的對話框是 non-Modal 視窗。它們將在創建後返回,而不是創建新的消息循環,該對話框使用在主線程中的消息循環。因此,父視窗也可以響應。
參考原始碼:DialogBoxParam 使用範例