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);
}
原文:https://blog.csdn.net/huanhuanxiaoxiao/article/details/80905198?
?
總結
以上是生活随笔為你收集整理的MFC—对话框程序—模式对话框与非模式对话框的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: H.264的NALU,RTP封包说明(转
- 下一篇: ffmpeg-0.8 开源编码解码库从l