所謂模態窗口(modal window),也稱為模態窗口,壹般指那些在應用程序中具有更多關鍵任務的窗口。只要它們存在,它們就會阻止用戶訪問其他窗口(或其祖先的窗口)。在windows中,用DialogBoxParam顯示的對話框是模式對話框。盡管模態對話框在windows中非常常見,但沒有SDK級別的API將窗口轉換為模態顯示。但是在微軟提供的MFC/WTL框架中,有這樣壹個API——Domodal(),使用的代碼基本上是這樣的:
cxx dialog DLG(some window);
int nRet = dlg。domodal();
if(nRet = = IDOK)
{
//從dlg獲取所需數據
}
其他
{
//用戶取消了窗口。
}
這種方法非常有用,但是如果您只是使用win32 api呢?或者,如果您希望窗口(而不是對話框)以模態顯示,該怎麽辦?這時候就需要我們自己去實現模態機制。
我們知道windows系統依賴於windows消息分發和響應來驅動UI交互。在單線程UI中,如果壹條消息的處理功能占用了大量時間,則其他消息無法及時處理(因為它是單線程的)。如果我們的Domodal()不做特殊處理,整個UI線程就會被卡住(因為代碼的執行會在Domodal()內部停止,從而阻塞線程的消息分發),這顯然不符合我們的要求。如果代碼停留在Domodal()中而不阻塞Windows消息分發過程,可以做什麽?答案是接管消息循環,即在DoModal()內接管線程的消息循環並自行維護,直到外部通知結束模態循環。