- 1、本文档共4页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
详解VC态对话框和非模态对话框
详解VC++模态对话框和非模态对话框
MFC中有两种类型的对话框:模态对话框和非模态对话框。
模态对话框是指当其显示时,程序会暂停执行,直到关闭这个模态对话框后,才能继续执行程序中其他任务。非模态对话框是指当其显示时,允许转而执行程序中其他任务,而不用关闭这个对话框。
模态对话框的创建:
创建模态对话框需要调用CDialog类的成员函数:DoModal,该函数的功能是创建并显示一个模态对话框,其返回值将作为CDialog类的另一个成员函数:EndDialog的参数,后者的功能是关闭模态对话框。一般显示模态对话框的实现代码如下:
void CASCEView::OnDialog()
{
CASCEDlg dlg;
dlg.DoModal();
}
非模态对话框的创建:
要创建非模态对话框就需要利用CDialog类的Create成员函数,该函数有以下两种形式的声明:
virtual BOOL Create(
LPCTSTR lpszTemplateName,
CWnd* pParentWnd = NULL
);
virtual BOOL Create(
UINT nIDTemplate,
CWnd* pParentWnd = NULL
);
有上可知,CDialog::Create函数的第一个参数可以是对话框资源的ID(nIDTemplate),或者也可以是对话框模板的名称(lpszTemplateName);而第二个参数指定了对话框的父窗口,如果其值是NULL,则对话框的父窗口就是主应用程序窗口。
当利用Create函数创建非模态对话框时,我们还需要接着调用ShowWindow函数来将这个对话框显示出来;而利用DoModal创建的模态对话框之所以不用,是因为DoModal函数本身就有显示模态对话框的作用。同时我们不能像模态对话框那样将对话框定义成对象,如下代码是显示不出非模态对话框的:
void CASCEView::OnDialog()
{
CASCEDlg dlg;
dlg.Create(IDD_DIALOG1, this);
dlg.ShowWindow(SW_SHOW);
}
因为这里创建的非模态对话框对象dlg是一个局部对象,当程序执行时,会依次执行各条代码,当OnDialog函数执行结束时,dlg这个对象的生命周期也就玩玩了,它就会销毁与之相关联的对话框资源,对话框自然就显示不出来啦!而模态对话框之所以能够显示,是因为当执行到调用DoModal函数以显示模态对话框时,程序就会暂停执行,直到模态对话框关闭之后,程序才继续向下执行。而这之前,dlg还没销毁。
因此,在创建非模态对话框时,不能将对话框对象定义成局部变量,解决方法有二:一是把对话框对象定义成CASCEView类的成员变量;二是把它定义成指针,在堆上分配内存,如下:
void CASCEView::OnDialog()
{
CASCEDlg *pDlg = new CASCEDlg;
pDlg-Create(IDD_DIALOG1, this);
pDlg-ShowWindow(SW_SHOW);
}
但是这又引入了新的问题:我们必须释放pDlg占用的资源,否则会造成内存泄漏!况且这里pDlg还是一个局部指针变量,当它的生命周期结束时,在程序中就无法再引用它所指向的那块内存了。解决方法同样有两个:一是将pDlg定义成CASCEView类的成员变量,然后在CASCEView类的析构函数中调用delete函数释放它指向的内存;二是在CASCEDlg类中重载PostNcDestroy虚函数,释放this指针指向的内存:
void CASCEDlg::PostNcDestroy()
{
delete this;
CDialog::PostNcDestroy();
}
还有一点需要注意的是:当单击对话框上的默认OK按钮时,两种对话框都会消失。但对于模态对话框而言,此时对话框窗口对象被销毁了;而对非模态对话框来说,对话框窗口对象并未被销毁,只是隐藏起来而已。
在非模态对话框中单击OK按钮后,程序会调用基类CDialog的OnOK函数,这是一个虚函数,后者又会调用EndDialog函数,这个函数用于终止模态对话框,但对于非模态对话框,这个函数只是使对话框窗口不可见,并不销毁它。因此,对非模态对话框来说,如果有一个ID值为IDOK的按钮,就必须重写基类的OnOK虚函数,并在重写的函数中调用DestroyWindow函数,以完成销毁对话框的工作,同时注意不要再调用
您可能关注的文档
- 客房手册20100720 -运营部、管理学院.pdf
- 小学新课实施现状调查报告.pdf
- 养生桩的法和要领.doc
- 褚时建与59岁现象.doc
- 200900290047 《尔雅义疏》录入.pdf
- 江西省初数学练习册答案(全一册).ppt
- 全国201年7月自学考试外贸函电试题打印版.doc
- 《爬山虎脚读后感》.ppt
- 冶金勘探用多能A字塔的总体设计.doc
- 2.1 大气受热过程说课稿.doc
- 中国国家标准 GB/T 22517.2-2024体育场地使用要求及检验方法 第2部分:游泳场地.pdf
- GB/T 22517.2-2024体育场地使用要求及检验方法 第2部分:游泳场地.pdf
- 《GB/T 22517.2-2024体育场地使用要求及检验方法 第2部分:游泳场地》.pdf
- 苏教版(2017秋)科学三年级下册1.《种子发芽了》 教案(含课堂练习和反思).docx
- 2024-2025学年小学数学六年级上册冀教版(2024)教学设计合集.docx
- 地理商务星球版七年级上册4.5形成气候的主要因素 同步教案.docx
- 2024-2025学年中职中职专业课金融类73 财经商贸大类教学设计合集.docx
- 2024-2025学年初中地理七年级上册(2024)仁爱科普版(2024)教学设计合集.docx
- 2024-2025学年小学英语二年级上册外研版(一起)教学设计合集.docx
- 2024-2025学年高中数学选择性必修 第二册北师大版(2019)教学设计合集.docx
文档评论(0)