1. 程式人生 > >MFC—對話方塊程式—模式對話方塊與非模式對話方塊

MFC—對話方塊程式—模式對話方塊與非模式對話方塊

一、根據主視窗型別,MFC軟體工程可以分為以下幾種架構模型:

1、SDI(Single Document Interface):單文件介面,一個主框架視窗下只能編輯一份文件。

例如:記事本和畫筆等。
2、MDI(Multiple Document Interface):多文件介面,一個主框架視窗下可以同時編輯多份文件。
例如:VC++6.0,Photoshop等軟體。
3、基於對話方塊的軟體模型:主視窗是通過資源管理器,在對話方塊模板內擺放控制元件編輯而成的。
多數用於開發小規模軟體,例如:工作管理員。
4、其他自定義視窗做主視窗:主視窗既不是框架也不是對話方塊,而是直接開發通用視窗類CWnd而成。

例如:輸入法視窗、QQ和360軟體等,有時這類軟體也都可以使用框架或對話方塊模式來代替開發而成。

對話方塊主要分為兩個型別:模式對話方塊和非模式對話方塊。當模式對話方塊彈出後,無法操作它的父視窗或者上一級視窗,直到關閉該對話方塊為止。例如:大部分軟體的“關於…”對話方塊,都是屬於模式對話方塊。當非模式對話方塊彈出後,不影響對它的父視窗或者上一級視窗的操作。例如:QQ的聊天框或者編輯軟體中的文字查詢對話方塊等等。
1、模式對話方塊的特點是:
a)在關閉模式對話方塊前,無法操作背景視窗,除非自身就是主視窗;
b)使用CDialog::DoModal函式彈出模式對話方塊,該函式執行過程是阻塞函式; 
c)因此在棧內或者堆內申請對話方塊類的物件都可以的,申請棧內變數開發和執行效率高一些。
2、非模式對話方塊的特點是:
a)在非模式對話方塊執行時可以操作背景視窗;

b)使用CDialog::Create函式和CWnd::ShowWindow彈出模式對話方塊,該函式執行過程是非阻塞函式; 

c)不能在棧內或者堆內申請對話方塊類的臨時物件,需要申請堆內變數或者使用全域性變數、成員變數等生命期較長的物件。

類結構圖:


模式對話方塊效果圖:


非模式對話方塊效果圖:


我在主對話方塊上面設定了兩個button,分別彈出模式對話方塊和非模式對話方塊。

程式碼實現:

void CMFCDlg::OnButton1() 
{
	//模式對話方塊:在棧內生成一個臨時變數,阻塞型對話方塊。DoModal產生的對話方塊,不能操作對話方塊後面的對話方塊
	CAboutDlg dlg;
	dlg.DoModal();
}

void CMFCDlg::OnButton2() 
{
	//非模式對話方塊:必須在堆內申請物件、或者在成員變數內申請物件
	CChatDlg* pDlg = new CChatDlg;
	//pDlg->Create(IDD_CHAT_DLG);//父視窗是m_pMainWnd所指定的物件
	pDlg->Create(IDD_CHAT_DLG, GetDesktopWindow());//不依賴與其他視窗,獨立的視窗
	pDlg->ShowWindow(SW_SHOW);
}