MFC—对话框程序—模式对话框与非模式对话框
一、根據(jù)主窗口類型,MFC軟件工程可以分為以下幾種架構(gòu)模型:
1、SDI(Single Document Interface):單文檔界面,一個(gè)主框架窗口下只能編輯一份文檔。
例如:記事本和畫筆等。
2、MDI(Multiple Document Interface):多文檔界面,一個(gè)主框架窗口下可以同時(shí)編輯多份文檔。
例如:VC++6.0,Photoshop等軟件。
3、基于對(duì)話框的軟件模型:主窗口是通過資源管理器,在對(duì)話框模板內(nèi)擺放控件編輯而成的。
多數(shù)用于開發(fā)小規(guī)模軟件,例如:任務(wù)管理器。
4、其他自定義窗口做主窗口:主窗口既不是框架也不是對(duì)話框,而是直接開發(fā)通用窗口類CWnd而成。
例如:輸入法窗口、QQ和360軟件等,有時(shí)這類軟件也都可以使用框架或?qū)υ捒蚰J絹泶骈_發(fā)而成。
對(duì)話框主要分為兩個(gè)類型:模式對(duì)話框和非模式對(duì)話框。當(dāng)模式對(duì)話框彈出后,無法操作它的父窗口或者上一級(jí)窗口,直到關(guān)閉該對(duì)話框?yàn)橹埂@?#xff1a;大部分軟件的“關(guān)于…”對(duì)話框,都是屬于模式對(duì)話框。當(dāng)非模式對(duì)話框彈出后,不影響對(duì)它的父窗口或者上一級(jí)窗口的操作。例如:QQ的聊天框或者編輯軟件中的文字查找對(duì)話框等等。
1、模式對(duì)話框的特點(diǎn)是:
a)在關(guān)閉模式對(duì)話框前,無法操作背景窗口,除非自身就是主窗口;
b)使用CDialog::DoModal函數(shù)彈出模式對(duì)話框,該函數(shù)執(zhí)行過程是阻塞函數(shù);?
c)因此在棧內(nèi)或者堆內(nèi)申請(qǐng)對(duì)話框類的對(duì)象都可以的,申請(qǐng)棧內(nèi)變量開發(fā)和運(yùn)行效率高一些。
2、非模式對(duì)話框的特點(diǎn)是:
a)在非模式對(duì)話框運(yùn)行時(shí)可以操作背景窗口;
b)使用CDialog::Create函數(shù)和CWnd::ShowWindow彈出模式對(duì)話框,該函數(shù)執(zhí)行過程是非阻塞函數(shù);?
c)不能在棧內(nèi)或者堆內(nèi)申請(qǐng)對(duì)話框類的臨時(shí)對(duì)象,需要申請(qǐng)堆內(nèi)變量或者使用全局變量、成員變量等生命期較長的對(duì)象。
類結(jié)構(gòu)圖:
模式對(duì)話框效果圖:
非模式對(duì)話框效果圖:
我在主對(duì)話框上面設(shè)置了兩個(gè)button,分別彈出模式對(duì)話框和非模式對(duì)話框。
代碼實(shí)現(xiàn):
void CMFCDlg::OnButton1()?
{
?? ?//模式對(duì)話框:在棧內(nèi)生成一個(gè)臨時(shí)變量,阻塞型對(duì)話框。DoModal產(chǎn)生的對(duì)話框,不能操作對(duì)話框后面的對(duì)話框
?? ?CAboutDlg dlg;
?? ?dlg.DoModal();
}
?
void CMFCDlg::OnButton2()?
{
?? ?//非模式對(duì)話框:必須在堆內(nèi)申請(qǐng)對(duì)象、或者在成員變量內(nèi)申請(qǐng)對(duì)象
?? ?CChatDlg* pDlg = new CChatDlg;
?? ?//pDlg->Create(IDD_CHAT_DLG);//父窗口是m_pMainWnd所指定的對(duì)象
?? ?pDlg->Create(IDD_CHAT_DLG, GetDesktopWindow());//不依賴與其他窗口,獨(dú)立的窗口
?? ?pDlg->ShowWindow(SW_SHOW);
}
原文:https://blog.csdn.net/huanhuanxiaoxiao/article/details/80905198?
?
總結(jié)
以上是生活随笔為你收集整理的MFC—对话框程序—模式对话框与非模式对话框的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: H.264的NALU,RTP封包说明(转
- 下一篇: 如何创建MFC模式对话框与非模式对话框