Windows對話框分為兩類:模態對話框和非模態對話框。
模態對話框,當它彈出后,本應用程序其他窗口將不再接受用戶輸入,只有該對話框響應用戶輸入,在對它進行相應操作退出后,其他窗口才能繼續與用戶交互。(比如:word中的“另存為”)
非模態對話框,它彈出后,本程序其他窗口仍能響應用戶輸入。非模態對話框一般用來顯示提示信息等。(比如:word中的“查找與替換)
創建模態對話框
彈出對話框比較關鍵的一個函數,
CDialog::DoModal()函數的原型為: virtual INT_PTR DoModal(); 返回值:整數值,指定了傳遞給CDialog::EndDialog(該函數用於關閉對話框)的nResult參數值。如果函數不能創建對話框,則返回-1;如果出現其它錯誤,則返回IDABORT。 調用了它對話框就會彈出,返回值是退出對話框時所點的按鈕的ID,比如,我們點了“退出”按鈕,那么DoModal返回值為IDCANCEL。
就是對話框類的DoModal()函數。
注:CAdditionDlg 為新建對話框的類。 CAdditionDlg dlg; // 定義對話框類CAdditionDlg的對象dlg INT_PTR nResponse = dlg.DoModal(); // 彈出對話框dlg,並將DoModal函數的返回值(退出時點擊按鈕的ID)賦值給nResponse if (nResponse == IDOK) // 判斷返回值是否為OK按鈕 { MessageBox(“ ”,””,MB_OK); } else if (nResponse == IDCANCEL) // 判斷返回值是否為Cancel按鈕 { MessageBox(“ ”,””,MB_OK); }
步驟:
1. 在資源視圖添加Dialog的對話框,再給對話框添加類CAdditionDlg。
2. 定義對話框類的對象CAdditionDlg m_dlg。
3. m_dlg.DoModal()。
非模態對話框
實際上,模態對話框和非模態對話框在創建對話框資源和生成對話框類上是沒有區別的。
創建非模態對話框:
注:CAdditionDlg 為新建對話框的類。在父對話框的頭文件必須加上” CAdditionDlg.h”。
在父對話框的頭文件,先聲明CAdditiondlg *m_pDlg。再到源文件的初始化中把m_pDlg=NULL;
CAdditiondlg *m_pDlg; If(m_pDlg==NULL) { // 創建非模態對話框實例 m_pDlg=new CAdditionDlg; m_pDlg->Create(,NULL); //第一參數為新建對話框的ID。 } m_pDlg->ShowWindow(SW_SHOW); // // 顯示非模態對話框
銷毀非模態對話框:
因為此非模態對話框實例是動態創建的,所以需要手動刪除此動態對象來銷毀對話框。我們在CAdditionDlg類的析構函數中添加刪除代碼,但是MFC並沒有自動給出析構函數,這時需要我們手動添加,在對話框對象析構時就會調用我們自定義的
析構函數了。在AdditionDlg.h文件中為CAdditionDlg添加析構函數聲明:~CAdditionDlg();,然后在AdditionDlg.cpp文件中添加析構函數的實現,函數體如下:
CAdditionDlg::~CAdditionDlg() { // 如果非模態對話框已經創建則刪除它 if (NULL != m_pDlg) { // 刪除非模態對話框對象 delete m_pDlg; } }
注意:創建非模態對話框為什么不用對象呢?
如:m_Dlg.Create( ,NULL);
第一次創建成功,並可以顯示。第二次時,程序崩潰。因為,以對象來創建,只有一份內存,而用指針時,每一次都重新分配內存(new)。
步驟:
1. 在資源視圖中,創建Dailog對話框,並添加類 CAdditiondlg。
2. 在父對話框的頭文件添加新建Dailog的頭文件 ”CAdditiondlg.h”。(一定要添加)
3. 再創建CAdditiondlg *m_pDlg; 在源文件 初始化為NULL;
4. m_pDlg=new CAdditiondlg; 分配內存
5. 創建非模態對話框 並顯示
6.
m_pDlg->Create(,NULL); //第一參數為新建對話框的ID。
m_pDlg->ShowWindow(SW_SHOW);
。。。。。。。。。。。。。。。。。。。。結束。。。。。。。。。。。。。。。。。。。。。。
