[MFC] CDialog::DoModal()函数用法

转载 2015年11月18日 22:59:23

5.2 创建有模式对话框

使用有模式对话框时在对话框弹出后调用函数不会立即返回,而是等到对话框销毁后才会返回(请注意在对话框弹出后其他窗口的消息依然会被传递)。所以在使用对话框时其他窗口都不能接收用户输入。创建有模式对话框的方法是调用CDialog::DoModal()。下面的代码演示了这种用法:

CYourView::OnOpenDlg()
{
	CYourDlg dlg;
	int iRet=dlg.DoModal();
}

CDialog::DoModal()的返回值为IDOK,IDCANCEL。表明操作者在对话框上选择“确认”或是“取消”。由于在对话框销毁前DoModal不会返回,所以可以使用局部变量来引用对象。在退出函数体后对象同时也会被销毁。而对于无模式对话框则不能这样使用,下节5.3 创建无模式对话框中会详细讲解。

你需要根据DoModal()的返回值来决定你下一步的动作,而得到返回值也是使用有模式对话框的一个很大原因。

使用有模式对话框需要注意一些问题,比如说不要在一些反复出现的事件处理过程中生成有模式对话框,比如说在定时器中产生有模式对话框,因为在上一个对话框还未退出时,定时器消息又会引起下一个对话框的弹出。

同样的在你的对话框类中为了向调用者返回不同的值可以调用CDialog::OnOK()或是CDialog::OnCancel()以返回IDOK或IDCANCEL,如果你希望返回其他的值,你需要调用 
CDialog::EndDialog( int nResult );其中nResult会作为DoModal()调用的返回值。

下面的代码演示了如何使用自己的函数来退出对话框:下载例子

void CMy52_s1View::OnLButtonDown(UINT nFlags, CPoint point) 
{//创建对话框并得到返回值
	CView::OnLButtonDown(nFlags, point);
	CTestDlg dlg;
	int iRet=dlg.DoModal();
	CString szOut;
	szOut.Format("return value %d",iRet);
	AfxMessageBox(szOut);
}
//重载OnOK,OnCancel
void CTestDlg::OnOK()
{//什么也不做
}
void CTestDlg::OnCancel()
{//什么也不做
}
//在对话框中对三个按钮消息进行映射
void CTestDlg::OnExit1() 
{
	CDialog::OnOK();
}
void CTestDlg::OnExit2() 
{
	CDialog::OnCancel();
}
void CTestDlg::OnExit3() 
{
	CDialog::EndDialog(0XFF);
}

由于重载了OnOK和OnCancel所以在对话框中按下Enter键或Escape键时都不会退出,只有按下三个按钮中的其中一个才会返回。

此外在对话框被生成是会自动调用BOOL CDialog::OnInitDialog(),你如果需要在对话框显示前对其中的控件进行初始化,你需要重载这个函数,并在其中填入相关的初始化代码。利用ClassWizard可以方便的产生一些默认代码,首先打开ClassWizard,选择相应的对话框类,在右边的消息列表中选择WM_INITDIALOG并双击,如图,ClassWizard会自动产生相关代码,代码如下:

BOOL CTestDlg::OnInitDialog() 
{
	/*先调用父类的同名函数*/
	CDialog::OnInitDialog();
	/*填写你的初始化代码*/	
	return TRUE; 

CDialog::DoModal

CDialog::DoModal Call this member function toinvoke the modal dialog box and return the dialog-box ...

MFC 模态对话框dlg.DoModal()返回值

查了很多资料,都说DoModal()返回值为OK或CANCEL键的ID  其实,这种说法是错误的  MSDN是这样说明其返回值的        If successful, the value of ...

C++DoModal怎样根据不同的按钮返回不同的值?

DoModal函数返回值对应的是对话框的关闭方式。默认的关闭方式是IDOK和IDCANCEL,对应的返回值是1和2。如果对话框中有多个按钮,我需要按不同的按钮返回不同的值,从而调用不同的处理函数怎么办...

DoModal函数的执行过程

原文地址 DoModal函数的执行过程(这是我观察MFC源代码得出的结论) 1:加载对话框资源; 2:使父窗口失去焦点; 3:创建对话框窗口; 4:执行对话框的消息循...

CDialog 一些小操作,小技巧汇总

1. 在任务栏隐藏对话框       ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW); 2. 使对话框为顶层窗口        ...

MFC:DoModal 函数的用法

DoModal 函数的用法 使用有模式对话框时在对话框弹出后调用函数不会立即返回,而是等到对话框销毁后才会返回(请注意在对话框弹出后其他窗口的消息依然会被传递)。所以在使用对话框时其他窗口都不能...

VC++/MFC中DoModal

问题1 :if(dlg.DoModal()==IDOK){......}怎么理解啊?问题2:当我 CMyDlg dlg;时,对话框显示了吗? 是不是要写dlg.DoModal();这时对话框才显示出来...

MFC中的CDialog类

CDialog::CDialog  构造 CDialog 对象。 CDialog::Create  初始化 CDialog 对象。 创建无模式对话框并将它附加到 CDialog 对象。   ...

MFC的对话框类CDialog

对话框经常被使用,因为对话框可以从模板创建,而对话框模板是可以使用资源编辑器方便地进行编辑的。1.      模式和无模式对话框 对话框分两种类型,模式对话框和无模式对话框。1.      模式对话框...
  • hczhiyue
  • hczhiyue
  • 2011年03月07日 15:37
  • 10755

关于dlg.DoModal()==IDOk的理解

问题1 : if(dlg.DoModal()==IDOK){......}怎么理解啊? 问题2: 当我 CMyDlg dlg;时,对话框显示了吗? 是不是要写dlg.DoModal();这时对话...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[MFC] CDialog::DoModal()函数用法
举报原因:
原因补充:

(最多只允许输入30个字)