模式對話框和非模式對話框的區(qū)別
一、 創(chuàng)建的區(qū)別
在WIN32中,模式對話框的創(chuàng)建一般是使用DialogBox來進(jìn)行創(chuàng)建的。而非模式對話框則是利用CreateWindow來創(chuàng)建的。在MFC或是WTL中,模式對話框一般是使用DoModal,而非模式對話框的創(chuàng)建則是使用Create。
模式對話框創(chuàng)建后,程序的其他窗口便不能進(jìn)行操作,必須將該窗口關(guān)閉后,其他窗口才能進(jìn)行操作。而非模式對話框則無需這樣,它不強(qiáng)制要求用戶立即反應(yīng),而是與其他窗口同時(shí)接受用戶操作。
二、 消息響應(yīng)的區(qū)別
在消息響應(yīng)方面,模式對話框和非模式對話框之間又有著很大的區(qū)別。模式對話框工作的時(shí)候,它有內(nèi)部的消息泵機(jī)制,控件之間的交互不用我們?nèi)藶榈娜タ刂疲到y(tǒng)會幫助我們?nèi)ヌ幚怼7悄J綄υ捒騽t像普通窗口一樣,則由WinMain中書寫的消息循環(huán)驅(qū)動。但由于是對話框,它對一些消息有特殊的處理。因此,在消息循環(huán)中,需要先對對話框提供截獲消息的機(jī)會。
While (GetMessage(&msg, NULL, 0, 0))
{
if (hDlgModeless == 0 || !IsDialogMessage(hDlgModeless, &msg))
{
TranslateMessage(&msg);
DispatchMessage( &msg);
}
}
如果當(dāng)前取得的消息是對話框的消息,IsDialogMessage 將它交由對話消息處理函數(shù)處理,并返回TRUE。不需要再派發(fā)了。
注意:這個(gè)方法并不是很好用,因?yàn)楫?dāng)對話框過多的時(shí)候,處理起來就比較麻煩了。另一種處理的方法是利用子類化控件的方法,來處理控件間的交互。
三、 銷毀的區(qū)別
模式對話框的銷毀是使用EndDialog,而非模式對話框的銷毀是使用DestroyWindow.。所以我們在銷毀對話框的時(shí)候,也要對其進(jìn)行區(qū)別。
非模式對話框,用戶關(guān)閉對話框時(shí),對話框消息處理函數(shù)將收到WM_CLOSE消息,接到后調(diào)用DestroyWindow以銷毀非模式對話框。
模式對話框,則一般響應(yīng)IDOK和IDCANCEL。在PPC上,我們對于OK鍵和X鍵的處理要注意這點(diǎn)。
四、 其他
非模態(tài)對話框的模板必須具有Visible風(fēng)格,否則對話框?qū)⒉豢梢姡B(tài)對話框則無需設(shè)置該項(xiàng)風(fēng)格。更保險(xiǎn)的辦法是調(diào)用ShowWindow(hDialog, SW_SHOW)來顯示對話框,而不管對話框是否具有Visible風(fēng)格。
非模態(tài)對話框?qū)ο笫怯?/span>new操作符在堆中動態(tài)創(chuàng)建的,而不是以成員變量的形式嵌入到別的對象中或以局部變量的形式構(gòu)建在堆棧上。通常應(yīng)在對話框的擁有者窗口類內(nèi)聲明一個(gè)指向?qū)υ捒蝾惖闹羔槼蓡T變量,通過該指針可訪問對話框?qū)ο蟆?/span>
通過調(diào)用Create函數(shù)來啟動對話框,而不是DoModal,這是模態(tài)對話框的關(guān)鍵所在。由于Create函數(shù)不會啟動新的消息循環(huán),對話框與應(yīng)用程序共用同一個(gè)消息循環(huán),這樣對話框就不會壟斷用戶的輸入。Create在顯示了對話框后就立即返回,而DoModal是在對話框被關(guān)閉后才返回的。眾所周知,在MFC程序中,窗口對象的生存期應(yīng)長于對應(yīng)的窗口,也就是說,不能在未關(guān)閉屏幕上窗口的情況下先把對應(yīng)的窗口對象刪除掉。由于在Create返回后,不能確定對話框是否已關(guān)閉,這樣也就無法確定對話框?qū)ο蟮纳嫫冢虼酥缓迷诙阎袠?gòu)建對話框?qū)ο螅荒芤跃植孔兞康男问絹順?gòu)建之。
因?yàn)槭怯?/span>new操作符構(gòu)建非模態(tài)對話框?qū)ο螅虼吮仨氃趯υ捒蜿P(guān)閉后,用delete操作符刪除對話框?qū)ο蟆?/span>
必須有一個(gè)標(biāo)志表明非模態(tài)對話框是否是打開的。這樣做的原因是用戶有可能在打開一個(gè)模態(tài)對話框的情況下,又一次選擇打開命令。程序根據(jù)標(biāo)志來決定是打開一個(gè)新的對話框,還是僅僅把原來打開的對話框激活。通常可以用擁有者窗口中的指向?qū)υ捒驅(qū)ο蟮闹羔樧鳛檫@種標(biāo)志,當(dāng)對話框關(guān)閉時(shí),給該指針賦NULL值,以表明對話框?qū)ο笠巡淮嬖诹恕?/span>
注意:在C++編程中,判斷一個(gè)位于堆中的對象是否存在的常用方法是判斷指向該對象的指針是否為空。這種機(jī)制要求程序員將指向該對象的指針初始化為NULL值,在創(chuàng)建對象時(shí)將返回的地址賦給該指針,而在刪除對象時(shí)將該指針置成NULL值。
posted on 2008-10-26 21:47
Sandy 閱讀(1392)
評論(1) 編輯 收藏 引用 所屬分類:
windows學(xué)習(xí)