模态对话框与非模态对话框的区别
特點:?
模式對話框(modal?dialog?box模態(tài)對話框):在關(guān)閉模式對話框之前,程序不能進行其他工作(如一般的“打開文件”對話框) 阻塞
無模式對話框(modeless?dialog?box?非模態(tài)對話框):模式對話框打開后,程序仍然能夠進行其他工作(如一般的“查找與替換”對話框) 非阻塞
區(qū)別:?
一.?非模態(tài)對話框的模板必須具有Visible風格(Visible=True),否則對話框?qū)⒉豢梢?#xff0c;而模態(tài)對話框則無需設(shè)置該項風格。在實際編程中更加保險的辦法是調(diào)用CWnd::ShowWindow(SW_SHOW)來顯示對話框,而不管對話框是否具有Visible風格。?
二.?非模態(tài)對話框?qū)ο笫怯胣ew操作符來動態(tài)創(chuàng)建的,而不是以成員變量的形式嵌入到別的對象中或以局部變量的形式構(gòu)建的。通常應(yīng)在對話框的擁有者窗口類內(nèi)聲明一個指向?qū)υ捒蝾惖闹羔槼蓡T變量,通過該指針可訪問對話框?qū)ο蟆?
三.?通過調(diào)用CDialog::Create函數(shù)來啟動對話框,而不是CDialog::DoModal,這是兩者之間區(qū)別的關(guān)鍵所在。由于Create函數(shù)不會啟動新的消息循環(huán),對話框與應(yīng)用程序共用同一個消息循環(huán),這樣對話框就不會壟斷用戶輸入。Create在顯示了對話框后就立即返回,而DoModal是在對話框被關(guān)閉后才返回的。由于在Create返回后,不能確定對話框是否已關(guān)閉,這樣也就無法確定對話框?qū)ο蟮纳嫫?#xff0c;因此只好在堆棧中構(gòu)建對話框?qū)ο?#xff0c;而不能以局部變量的形式來構(gòu)建之。?
四.?必須調(diào)用CWnd::DestroyWindow而不是CDialog::EndDialog來關(guān)閉非模態(tài)對話框。調(diào)用CWnd::DestroyWindow是直接刪除窗口的一般方法。由于缺省的CDialog::OnOK和CDialog::OnCancel函數(shù)均調(diào)用EndDialog,故程序員必須編寫自己的OnOK和OnCancel函數(shù)并且在函數(shù)中調(diào)用DestroyWindow來關(guān)閉對話框。?
五.?因為是用new操作符構(gòu)建非模態(tài)對話框?qū)ο?#xff0c;因此必須在對話框關(guān)閉后,用delete操作符刪除對話框?qū)ο蟆T谄聊簧弦粋€窗口被刪除后,框架會調(diào)用CWnd::PostNcDestroy,這是一個虛擬函數(shù),程序可以在該函數(shù)中完成刪除窗口對象的工作,具體代碼如下 ,清理非模態(tài)對話框的內(nèi)存
?
這樣,在刪除屏幕上的對話框后,對話框?qū)ο髮⒈蛔詣觿h除。擁有者就不必顯式地調(diào)用delete來刪除對話框?qū)ο罅恕?
六.?必須有一個標志表明非模態(tài)對話框是否打開的。這樣做的原因是用戶有可能在打開一個模態(tài)對話框的情況下,又一次選擇打開命令。程序根據(jù)標志來決定是打開一個新的對話框,還是僅僅把原來打開的對話框激活。通常可以用擁有者窗口中的指向?qū)υ捒驅(qū)ο蟮闹羔樧鳛檫@種標志,當對話框關(guān)閉時,給該指針賦NULL值,以表明對話框?qū)ο笠巡淮嬖诹恕?
在WIN32中,模式對話框的創(chuàng)建一般是使用DialogBox來進行創(chuàng)建的。而非模式對話框則是利用CreateWindow來創(chuàng)建的。在MFC或是WTL中,模式對話框一般是使用DoModal,而非模式對話框的創(chuàng)建則是使用Create。模式對話框創(chuàng)建后,程序的其他窗口便不能進行操作,必須將該窗口關(guān)閉后,其他窗口才能進行操作。而非模式對話框則無需這樣,它不強制要求用戶立即反應(yīng),而是與其他窗口同時接受用戶操作。
總結(jié)
以上是生活随笔為你收集整理的模态对话框与非模态对话框的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js动态生成html
- 下一篇: 智源社区AI周刊No.98:Adept发