MFC——模態對話方塊和非模態對話方塊
一、模態對話方塊
如果你需要做一個模態對話方塊,簡單的說就是你點一個按鈕,彈出一個對話方塊,之後你只能在彈出的對話方塊上操作的這麼一個過程。實驗的過程很簡單,跟著我做吧。
下面開始模態對話方塊實驗
-
在資源檢視新建一個對話方塊資源,修改其ID為IDD_DIALOG1,這個就是即將要彈出來的對話方塊
-
在這個對話方塊模板上點右鍵選擇“Add Class…”,彈出新增類的對話方塊,設定“Class name”為CTestDlg,點“OK”。在Solution Explorer中可以看到生成了CTestDlg類的標頭檔案TestDlg.h和原始檔TestDlg.cpp
-
假設你想點選ID為IDC_BUTTON1的按鈕後彈出上面建立的對話方塊,你就需要雙擊IDC_BUTTON1這個按鈕,在它的訊息相應函式中執行彈出的過程,下面是具體的方法。
-
因為你要訪問CTestDlg類,所以要在 工程Dlg.cpp 檔案中包含CTestDlg的標頭檔案:#include “TestDlg.h”
-
新增好標頭檔案後,修改IDC_BUTTON1的訊息響應函式,如下所示:
void CMFCApplication1Dlg::OnBnClickedButton1() { // TODO: 在此新增控制元件通知處理程式程式碼 INT_PTR nRes; // 用於儲存DoModal函式的返回值 CTestDlg testDlg; // 構造對話方塊類CTipDlg的例項 nRes = testDlg.DoModal(); // 彈出對話方塊 if (IDCANCEL == nRes) // 判斷對話方塊退出後返回值是否為IDCANCEL,如果是則return,否則繼續向下執行 return; }
- 編譯,點選那個button1,你就會發現彈出了你做的對話方塊
二、非模態對話方塊
如果你需要做一個非模態對話方塊,簡單的說就是你點一個按鈕,彈出一個對話方塊,之後你還能在原對話方塊上操作的這麼一個過程。實驗的過程也很簡單,跟著我做吧。
-
在資源檢視新建一個對話方塊資源,修改其ID為IDD_DIALOG1,這個就是即將要彈出來的對話方塊
-
在這個對話方塊模板上點右鍵選擇“Add Class…”,彈出新增類的對話方塊,設定“Class name”為CTestDlg,點“OK”。在Solution Explorer中可以看到生成了CTestDlg類的標頭檔案TestDlg.h和原始檔TestDlg.cpp
-
在AdditionDlg.h中新增#include “TestDlg.h”,這是因為我們需要在工程Dlg.h中定義CTestDlg型別的指標變數,所以要先包含它的標頭檔案;然後在 工程Dlg.h 中新增private成員變數CTestDlg *m_pTestDlg;
-
在CAdditionDlg類的建構函式中初始化成員變數m_pTestDlg。加入
m_pTestDlg = NULL;
- 修改button1的訊息響應函式,如下
void CMy2_MFCTempDlg::OnBnClickedButton1()
{
// TODO: 在此新增控制元件通知處理程式程式碼
if (NULL == m_pTestDlg)
{
// 建立非模態對話方塊例項
m_pTestDlg = new CTestDlg();
m_pTestDlg->Create(IDD_DIALOG1, this);
}
// 顯示非模態對話方塊
m_pTestDlg->ShowWindow(SW_SHOW);
}
- 最後,在 工程Dlg.h檔案中為CAdditionDlg新增解構函式宣告:
~C工程Dlg();
然後在AdditionDlg.cpp檔案中新增解構函式的實現,函式體如下:
C工程Dlg::~C工程Dlg()
{
// 如果非模態對話方塊已經建立則刪除它
if (NULL != m_pTestDlg)
{
// 刪除非模態對話方塊物件
delete m_pTestDlg;
}
}
效果如下