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

2021-05-24 21:33:29 字數 2329 閱讀 9046

如果是模態的,那麼彈出後該程式的其它視窗就呈不可用的狀態,原來程式暫停執行,直到這個模態視窗關閉後才回到原來程式繼續。

非模態的就是直接顯示出來,然後原來的程式繼續執行下面的語句,而且其它視窗也呈可用狀態。

以下是具體的區別。

1:非模態對話方塊通常包含乙個標題列和乙個系統選單按鈕。當您在developer studio中建立對話方塊時,這些是內定選項。用於非模態對話方塊的對話方塊模板中的style敘述形如:style ws_popup | ws_caption | ws_sysmenu | ws_visible       

標題列和系統選單允許使用者,使用滑鼠或者鍵盤將非模態對話方塊移動到另乙個顯示區域。

對於模態對話方塊,您通常無須提供標題列和系統選單,因為使用者不能在其下面的視窗中做任何其它的事情。

2:注意,在我們的範例style敘述中包含有ws_visible樣式。在 developer studio中,從「dialog properties」對話方塊的「more styles」頁面卷標中選擇此選項。如果省略了ws_visible,那麼您必須在createdialog呼叫之後呼叫showwindow:hdlgmodeless = createdialog ( . . . ) ;            showwindow (hdlgmodeless, sw_show) ;       

如果您既沒有包含ws_visible樣式,又沒有呼叫showwindow,那麼非模態對話方塊將不會被顯示。如果忽略這個事實,那麼習慣於模態對話方塊的程式寫作者在第一次試圖建立非模態對話方塊時,經常會出現問題。

3:與模態對話方塊和訊息框的訊息不同,非模態對話方塊的訊息要經過程式式的訊息佇列。要將這些訊息傳送給對話方塊視窗訊息處理程式,則必須改變訊息佇列。方法如下:當您使用createdialog建立非模態對話方塊時,應該將從呼叫中傳回的對話方塊控制代碼儲存在乙個整體變數(如hdlgmodeless)中,並將訊息迴圈改變為:

while (getmessage (&msg, null, 0, 0))      

if (hdlgmodeless == 0 || !isdialogmessage (hdlgmodeless, &msg))           

translatemessage (&msg) ;                        

dispatchmessage (&msg) ;         

}       

如果訊息是傳送給非模態對話方塊的,那麼isdialogmessage將它傳送給對話方塊中視窗訊息處理程式,並傳回true(非0);否則,它將傳回false(0)。只有hdlgmodeless為0或者訊息不是該對話方塊的訊息時,才必須呼叫translatemessage和dispatchmessage函式。如果您將鍵盤快捷鍵用於您的程式視窗,那麼訊息迴圈將如下所示:

while (getmessage (&msg, null, 0, 0))    

if (hdlgmodeless == 0 || !isdialogmessage (hdlgmodeless, &msg))            

if (!translateaccelerator (hwnd, haccel, &msg))            

translatemessage (&msg) ;             

dispatchmessage (&msg) ;     

}        

由於整體變數被初始化為0,所以hdlgmodeless將為0,直到建立對話方塊為止,從而保證不會使用無效的視窗控制代碼來呼叫isdialogmessage。在清除非模態對話方塊時,您也必須注意這一點,正如最後一點所說明的。

hdlgmodeless變數也可以由程式的其它部分使用,以便對非模態對話方塊是否存在加以驗證。例如,程式中的其它視窗可以在hdlgmodeless不等於0時給對話方塊傳送訊息。

4:最後一項重要的區別:使用destroywindow而不是enddialog來結束非模態對話方塊。當您呼叫destroywindow後,將hdlgmodeless整體變數設定為0。

使用者習慣於從系統選單中選擇「close」來結束非模態對話方塊。儘管啟用了「close」選項,windows內的對話方塊視窗訊息處理程式並不處理wm_close訊息。您必須自己在對話方塊程式中處理它:

case        wm_close :           

destroywindow (hdlg) ;                 

hdlgmodeless = null ;               

break ;       

注意這兩個視窗控制代碼之間的區別:destroywindow的hdlg引數是傳遞給對話方塊程式的引數;hdlgmodeless是從createdialog傳回的整體變數,程式在訊息迴圈內檢驗它。

模態對話方塊和非模態對話方塊

模態對話方塊和非模態對話方塊的區別 在這裡我就說的比較通俗易懂了,就是當你開啟乙個模態對話方塊時,你的焦點不能轉移到程式的其他視窗上,也就是你只能先響應模態對話方塊,才能進行成下面的操作。而非模態對話方塊則相反,你可以不用管它,照常能夠將其他視窗啟用。建立模態對話方塊,主要是應用對話方塊的domod...

模態對話方塊和非模態對話方塊

模態對話方塊 關閉才能返回,非模態 不關閉就能返回 在資源裡新建立二個對話方塊 為新的對話方塊建立乙個類 在最原始的對話方塊函式的標頭檔案將上述兩個新新增的標頭檔案加進去,對模態按鈕進行程式設計 void cdemo11dlg onbnclickedbutton1 對非模態按鈕進行程式設計 void...

模態對話方塊和非模態對話方塊

模態對話方塊 modal dialogue box 是指在使用者想要對對話方塊以外的應用程式進行操作時,必須首先對該對話方塊進行響應。如單擊 確定 或者 取消 按鈕等將該對話方塊關閉,它和非模態對話方塊都是永遠置頂的,它們的區別在於當對話方塊開啟時,是否允許使用者進行其他物件的操作。開啟模態對話方塊...