回覆列表
  • 1 # 風紫子

    模式對話方塊和非模式對話方塊的區別

    一、 建立的區別

    在WIN32中,模式對話方塊的建立一般是使用DialogBox來進行建立的。而非模式對話方塊則是利用CreateWindow來建立的。在MFC或是WTL中,模式對話方塊一般是使用DoModal,而非模式對話方塊的建立則是使用Create。

    模式對話方塊建立後,程式的其他視窗便不能進行操作,必須將該視窗關閉後,其他窗口才能進行操作。而非模式對話方塊則無需這樣,它不強制要求使用者立即反應,而是與其他視窗同時接受使用者操作。

    二、 訊息響應的區別

    在訊息響應方面,模式對話方塊和非模式對話方塊之間又有著很大的區別。模式對話方塊工作的時候,它有內部的訊息泵機制,控制元件之間的互動不用我們人為的去控制,系統會幫助我們去處理。非模式對話方塊則像普通視窗一樣,則由WinMain中書寫的訊息迴圈驅動。但由於是對話方塊,它對一些訊息有特殊的處理。因此,在訊息迴圈中,需要先對對話方塊提供截獲訊息的機會。

    While (GetMessage(&msg, NULL, 0, 0))

    {

    if (hDlgModeless == 0 || !IsDialogMessage(hDlgModeless, &msg))

    {

    TranslateMessage(&msg);

    DispatchMessage( &msg);

    }

    }

    如果當前取得的訊息是對話方塊的訊息,IsDialogMessage 將它交由對話訊息處理函式處理,並返回TRUE。不需要再派發了。

    注意:這個方法並不是很好用,因為當對話方塊過多的時候,處理起來就比較麻煩了。另一種處理的方法是利用子類化控制元件的方法,來處理控制元件間的互動。

    三、 銷燬的區別

    模式對話方塊的銷燬是使用EndDialog,而非模式對話方塊的銷燬是使用DestroyWindow.。所以我們在銷燬對話方塊的時候,也要對其進行區別。

    非模式對話方塊,使用者關閉對話方塊時,對話方塊訊息處理函式將收到WM_CLOSE訊息,接到後呼叫DestroyWindow以銷燬非模式對話方塊。

    模式對話方塊,則一般響應IDOK和IDCANCEL。在PPC上,我們對於OK鍵和X鍵的處理要注意這點。

    四、 其他

    非模態對話方塊的模板必須具有Visible風格,否則對話方塊將不可見,而模態對話方塊則無需設定該項風格。更保險的辦法是呼叫ShowWindow(hDialog, SW_SHOW)來顯示對話方塊,而不管對話方塊是否具有Visible風格。 

    非模態對話方塊物件是用new運算子在堆中動態建立的,而不是以成員變數的形式嵌入到別的物件中或以區域性變數的形式構建在堆疊上。通常應在對話方塊的擁有者視窗類內宣告一個指向對話方塊類的指標成員變數,透過該指標可訪問對話方塊物件。

    透過呼叫Create函式來啟動對話方塊,而不是DoModal,這是非模態對話方塊的關鍵所在。由於Create函式不會啟動新的訊息迴圈,對話方塊與應用程式共用同一個訊息迴圈,這樣對話方塊就不會壟斷使用者的輸入。Create在顯示了對話方塊後就立即返回,而DoModal是在對話方塊被關閉後才返回的。眾所周知,在MFC程式中,視窗物件的生存期應長於對應的視窗,也就是說,不能在未關閉螢幕上視窗的情況下先把對應的視窗物件刪除掉。由於在Create返回後,不能確定對話方塊是否已關閉,這樣也就無法確定對話方塊物件的生存期,因此只好在堆中構建對話方塊物件,而不能以區域性變數的形式來構建之。

    因為是用new運算子構建非模態對話方塊物件,因此必須在對話方塊關閉後,用delete運算子刪除對話方塊物件。

    必須有一個標誌表明非模態對話方塊是否是開啟的。這樣做的原因是使用者有可能在開啟一個非模態對話方塊的情況下,又一次選擇開啟命令。程式根據標誌來決定是開啟一個新的對話方塊,還是僅僅把原來開啟的對話方塊啟用。通常可以用擁有者視窗中的指向對話方塊物件的指標作為這種標誌,當對話方塊關閉時,給該指標賦NULL值,以表明對話方塊物件已不存在了。

  • 中秋節和大豐收的關聯?
  • 訂婚的意思和含義?