在windows中將對話框分為兩類:模態(tài)對話框和非模態(tài)對話框。模態(tài)對話框打開后,始終占據(jù)著當(dāng)前程序的焦點,如果不關(guān)掉對話框的話,當(dāng)前程序?qū)o法做其他工作。例如在Word里,選擇“文件|打開”命令,彈出打開對話框,此時的對話框就是一個模態(tài)對話框。非模態(tài)對話框打開時,程序可以繼續(xù)做其他工作。例如在Word里,選擇“編輯|查找”命令,彈出“查找”對話框就是非模態(tài)的。 對于模態(tài)對話框的顯示是利用對話框類的DoModal()函數(shù)實現(xiàn)的,調(diào)用了該函數(shù)時,就創(chuàng)建了一個對話框并顯示。一旦模態(tài)對話框被創(chuàng)建并顯示出來,它就進(jìn)入一個 消息循環(huán)。此時模態(tài)對話框會將接收到的消息分發(fā)給需要接收此類消息并進(jìn)行處理。 而非模態(tài)對話框使用對話框類的ShowWindow(SW_SHOW)來顯示對話框,而不是使用DoModal()函數(shù),一般情況下,非模態(tài)對話框的對象需要利用new操作符進(jìn)行動態(tài)的創(chuàng)建對話框?qū)ο蟆.?dāng)然C++語言中,對于利用new操作符創(chuàng)建的內(nèi)容需要使用delete操作符進(jìn)行銷毀。對于動態(tài)創(chuàng)建的對話框?qū)ο笸瑯有枰陉P(guān)閉對話框時利用delete進(jìn)行銷毀。
說了這么多了,相信大家已經(jīng)懂了模態(tài)和非模態(tài)對話框的基本情況,那么在VC中是如何實現(xiàn)的呢,下面就來細(xì)細(xì)說明 (1)、模態(tài)對話框的實現(xiàn) 新建一個基于對話框的應(yīng)用程序Test,在資源視圖中右鍵點擊Dialog,在彈出菜單中選擇“Inert Dialog”,然后根據(jù)類向?qū)陆ㄒ粋€對話框相關(guān)的類dlg1 添加主對話框上與確定鍵相對應(yīng)的消息響應(yīng)函數(shù),實現(xiàn)模態(tài)對話框的顯示,代碼如下:
void CTestDlg::OnOK() CDialog::OnOK(); 編譯運行便可實現(xiàn)模態(tài)對話框的顯示了
(2)、非模態(tài)對話框的實現(xiàn) 新建一個基于對話框的應(yīng)用程序Test,在資源視圖中右鍵點擊Dialog,在彈出菜單中選擇“Inert Dialog”,然后根據(jù)類向?qū)陆ㄒ粋€對話框相關(guān)的類dlg1, 在CTestDlg類前面添加dg1的聲明語句,如下所示: class dlg1; .......... 然后在CTestDlg中添加一個變量:dlg1 *pdlg;并且在CTestDlg的構(gòu)造函數(shù)中初始化為NULL,而且要在TestDlg.CPP的前面加上頭文件#include"dlg1.h"
然后添加主對話框確定按鈕的消息映射,代碼如下 void CGeliangDlg::OnOK() 在添加內(nèi)存清理函數(shù), 在類視圖中右擊dlg1,選中Add Virtual Function,彈出New Virtual Overrride for class dlg1對話框,選擇PostNcDestroy,單擊AddHandler按鈕,單擊Edit Exiting按鈕,編寫代碼如下: void dlg1::PostNcDestroy() 至此已經(jīng)完成了非模態(tài)對話框的顯示與銷毀了。
|
|