模态对话框和非模态对话框的区别
在这里我就说的比较通俗易懂了,就是当你打开一个模态对话框时,你的焦点不能转移到程序的其他窗口上,也就是你只能先响应模态对话框,才能进行成下面的操作。
而非模态对话框则相反,你可以不用管它,照常能够将其他窗口激活。
创建模态对话框
创建模态对话框,主要是应用对话框的DoModal函数,如下:
CInputDlg *dlg=new CInputDlg("输入参数","请输入旋转的角度:",this);
if(dlg->DoModal()==IDOK)
{
}
else
{
return;
}
if(dlg->DoModal()==IDOK)
{
}
else
{
return;
}
如果你用下面的办法创建模态对话框,那么OnInitialDialog函数里面的程序将会出现将所有的对话框成员变量都变为空的错误。
//创建InputDlg的模态对话框
CInputDlg dlg=new CInputDlg("输入参数","请输入旋转的角度:",this);
if(dlg.DoModal()==IDOK)
{
}
else
{
return;
}
CInputDlg dlg=new CInputDlg("输入参数","请输入旋转的角度:",this);
if(dlg.DoModal()==IDOK)
{
}
else
{
return;
}
那么打开的对话框如下:
也就是在构造函数中的CString确实传过去了,但是一到OnInitialDialog里面这些传过去的值都会为空的。但是用指针类型的时候就不会出错,因为用new创建一个类的实例之后,返回的是一个地址,也就是一个指针类型的数据。
创建非模态对话框
创建非模态对话框,需要用到对话框的两个API函数:Create和ShowWindow,如下:
CInputDlg* pDlg=new CInputDlg("输入参数","请输入旋转的角度:",this);
pDlg->Create(IDD_DLG_INPUTDLG);
pDlg->ShowWindow(SW_SHOW);
pDlg->Create(IDD_DLG_INPUTDLG);
pDlg->ShowWindow(SW_SHOW);
特殊说明
从上面的两段程序可以看出,我重载CInputDlg的构造函数。这是你需要在重载构造函数的时候,先构造父类,也就是必须有下面的红色字体部分。
CInputDlg::CInputDlg(CString title,CString promp,CWnd* pParent)
: CDialog(CInputDlg::IDD, pParent)
{
m_title1=title;
m_prompt1=promp;
}
{
m_title1=title;
m_prompt1=promp;
}
如果没有先构造父类呢?那么在你创建非模态对话框的时候,是不会有什么问题的。但是当你创建模态对话框的时候,就会弹出下面的错误提示: