DoModal
计算机函数
DoModal是一个函数,可以用来显示一个模态对话框。此成员函数用来显示一个模态对话框。其返回值对应用于来关闭对话框的控件的ID。此函数返回后,Windows响应这个对话框,所有的属性页都会被销毁。
简介
CPropertySheet::DoModal
virtual int DoModal();
返回值:如果函数成功则返回IDOK或IDCANCEL;否则返回0或-1。如果此属性表是作为一个向导(参见SetWizardMode)建立的,DoModal返回ID_WIZFINISH或IDCANCEL。
备注:
在一个属性页被第一次从它相应的对话框资源创建时,它有可能引发一个第一次机会(first-chance)异常。这是在创建此页之前属性页将对话框资源的风格改变成了所需的风格的结果。因为资源通常来说是只读的,所以这导致了一个异常。这个异常由系统处理,系统会自动拷贝修改后的资源。这样,第一次机会(first-chance)异常就被忽略了。
由于这个异常必须由操作系统来处理,所以不要用一个C++ try/catch块来隐藏调用CPropertySheet::DoModal,因为在一个C++ try/catch块中catch会处理所有的异常,比如,catch(...)。它将处理那些属于操作系统的异常,这将导致不可预料的行为发生。但是,通过指定异常类型或结构化异常处理来处理C++异常就是安全的,在结构化异常处理中,访问非法异常被传递给操作系统。
请参阅:
CDialog::DoModal, CPropertySheet::Create
CPrintDialog::DoModal();
virtual int DoModal();
回值明细
返回值
返回IDOK或IDCANCEL。如果返回的是IDCANCEL,则要调用WindowsCommDlgExtendedError函数来确定是否发生了一个错误。IDOK和IDCANCEL都是常量,它表明用户选择的是OK按钮还是Cancel按钮。
备注
此函数用来显示Windows的通用打印对话框,并允许用户选择各个打印选项,例如备份的数目、页范围和备份是否需要整理。
如果你想要提供设置m_pd结构的成员来初始化各个打印对话框选项,则应当在打印DoModal之前,但在对话框对象构造之后进行。
在调用了DoModal之后,你就可以调用其它的成员函数来检取各个设置或用户在对话框中输入的信息了。
请参阅:
CPrintDialog::CPrintDialog, CDialog::DoModal
COlePropertiesDialog::DoModal
virtual int DoModal();
返回值
如果成功则返回IDOK或IDCANCEL;否则返回0。IDOK和IDCANCEL都是常量,它们指示用户是选择了OK按钮还是Cancel按钮。
如果返回的是IDCANCEL,你可以调用函数Windows CommDlgExtendedError来确定是否发生了一个错误。
备注
这个成员函数用来显示Windows通用OLE Object Properties对话框,并允许用户查看或改变文档项的各个属性。
请参阅:
COlePropertiesDialog::OnApplyScale, COlePropertiesDialog::m_psh
COleUpdateDialog::DoModal
virtual int DoModal();
返回值
对话框的完成状态。是下列值之一: · IDOK 如果对话框成功返回。
· IDCANCEL 如果当前文档中不存在需要更新的链接项或嵌入项。
· IDABORT 如果发生了一个错误。如果返回的是IDABORT,调用COleDialog::GetLastError成员函数来获取更多有关所发生的错误类型的信息。可能发生的错误的列表,参见“OLE 2.01用户接口库”中的OleUIEditLinks函数。
备注
此函数以更新方式显示Edit Links对话框。除非用户选择了Cancel按钮,所有的链接项和/或嵌入项都会被更新。
请参阅:
COleDialog::GetLastError,COleLinksDialog::DoModal
CPageSetupDialog::DoModal
virtual int DoModal();
返回值
则调用Windows CommDlgExtendedError函数来确定是否发生了一个错误。
IDOK和IDCANCEL都是常量,它们用来表明用户选择的是OK按钮还是Cancel按钮。
备注
此函数用来显示Windows通用OLE Page Setup对话框,并允许用户选择不同的打印设置选项,比如打印边距、页面大小、页面方向,和打印机目标。另外,用户页可以访问如网络位置和所选打印机的属性等打印机设置选项。
如果你希望通过设置m_psd结构的成员来初始化不同的Page Setup对话框选项,你必须在调用DoModal之前和构造此对话框之后进行。在调用DoModal之后,调用其它的成员函数来获取用户在对话框中输入的设置和信息。
如果你想传送用户输入的当前设置,请调用CWinApp::SelectPrinter。这个函数读取来自CPageSetupDialog对象的信息并初始化和选择一个具有适当属性的新打印机DC。
AfxGetApp()->SelectPrinter(dlg.m_psd.hDevNames, dlg.m_psd.hDevMode );
请参阅:CPageSetupDialog::m_psd
COleLinksDialog::DoModal
virtual int DoModal();
返回值
对话框的完成状态。它可以是下面的值: · IDOK 如果对话框被成功显示则返回此值。
· IDCANCEL 如果用户取消了对话框则返回此值。
· IDABORT 如果发生了错误则返回此值。如果返回的是IDABORT,则调用成员函数COleDialog::GetLastError来获取有关所发生错误的类型的进一步信息。可能发生的错误的列表,请参见“OLE 2.01用户接口库”中的OleUIEditLinks函数。
备注
此函数用来显示OLE Edit Links对话框。
如果你要通过设置m_el结构的成员来初始化不同的对话框控件,你必须要在调用DoModal之前,对话框对象被销毁之后进行。
请参阅:
COlePasteSpecialDialog::DoModal
virtual int DoModal();
返回值
对话框完成的状态。它可以是下列值之一: · IDOK 如果成功显示了对话框。
· IDCANCEL 如果用户取消了对话框。
· IDABORT 如果返回的是IDABORT,则要调用COleDialog::GetLastError成员函数来获取有关所发生的错误类型的进一步信息。可能发生的错误的列表,请参见“OLE 2.01用户接口库”中的OleUIPasteSpecial函数。
备注
此函数用来显示OLE Paste Special 对话框。
如果你想通过设置m_ps结构的成员函数来初始化不同的对话框控件,则你必须在调用DoModal之前,但在构造了对话框对象之后进行。
如果DoModal返回IDOK,则你可以调用其它成员函数来获取各个设置或由用户在对话框中输入的信息。
请参阅:
COleDataObject, COlePasteSpecialDialog::COlePasteSpecialDialog, COlePasteSpecialDialog::GetDrawAspect, COlePasteSpecialDialog::GetIconicMetafile, COlePasteSpecialDialog::GetPasteIndex, COlePasteSpecialDialog::GetSelectionType
COleInsertDialog::DoModal
virtual int DoModal( );
int DoModal( DWORD dwFlags );
返回值
返回对话框的完成状态。可以是下列值之一: · IDOK 如果对话框被成功显示。
· IDCANCEL 如果用户取消了对话框。
· IDABORT 如果发生了一个错误。如果返回的是IDABORT,调用COleDialog::GetLastError成员函数来获取更多有关所发生的错误的类型的信息。可能发生的错误的列表,参见“OLE 2.01用户接口库”中的OleUIInsertObject。
参数
dwFlags 是下列值之一: ·COleInsertDialog::DocObjectOnly 将只插入DocObjects。
·COleInsertDialog::ControlsOnly 将只插入ActiveX控件
如果是零,则DoModal将既不插入一个DocObjects,也不插入一个ActiveX控件;它的返回值与上面所列的第一种原形的返回值一样。
备注
此函数用来显示该OLE Insert Object对话框。
如果你想通过设置m_io结构的成员来初始化不同的对话框控件,你应该在第一DoModal之前,但在对话框对象被构造之后进行。
如果DoModal返回的是IDOK,则你可以调用其它的成员函数来获取用户输入到此对话框中的设置或信息。
请参阅:
COleInsertDialog::GetSelectionType, COleInsertDialog::GetClassID, COleInsertDialog::GetDrawAspect, COleInsertDialog::GetIconicMetafile, COleInsertDialog::GetPathName, COleInsertDialog::m_io
COleConvertDialog::DoModal
virtual int DoModal( );
返回值
对话框的完成状态。它可以是下列值: · IDOK 若对话框成功显示。
· IDCANCEL 如果用户取消了该对话框。
· 请参阅OLE文档中的OleUIConvert函数。
备注
调用该函数,以显示OLE 转换对话框。
如果要通过调整m_cv结构的值来初始化对话框中的控件状态,
请参阅:
COleConvertDialog::m_cv, COleConvertDialog::DoConvert, COleConvertDialog::GetSelectionType, COleConvertDialog::GetClassID, COleConvertDialog::GetDrawAspect, COleConvertDialog::GetIconicMetafile
COleChangeSourceDialog::DoModal
virtual int DoModal( );
返回值
对话框的完成状态。它可以是下列值: · IDOK 若对话框成功显示。
· IDCANCEL 如果用户取消了该对话框。
(User InterfaceLibrary)”中的OleUIChangeSource函数。
备注
调用该函数,以显示OLE变换资源对话框。
如果要通过调整m_cs结构的值来初始化对话框中的控件状态,
如果DoModal返回IDOK, 可以调用其它成员函数获取用户在对话框中输入的设置或信息。下面所列的是典型的查询函数:
·GetFileName
·GetDisplayName
·GetItemName
请参阅:COleChangeSourceDialog::COleChangeSourceDialog
COleChangeIconDialog::DoModal
virtual int DoModal( );
返回值
对话框的完成状态。它可以是下列值: · IDOK 若对话框成功显示。
· IDCANCEL 如果用户取消了该对话框。
·(User InterfaceLibrary)”中的OleUIChangeIcon函数。
备注
调用该函数,以显示OLE变换图标对话框。
如果要通过调整m_cs结构的值来初始化对话框中的控件状态,
请参阅:
COleChangeIconDialog::m_ci, COleChangeIconDialog::DoChangeIcon, COleChangeIconDialog::GetIconicMetafile
COleBusyDialog::DoModal
virtual int DoModal( ) const;
返回值
对话框的完成状态。它可以是下列值: · IDOK 若对话框成功显示。
· IDCANCEL 如果用户取消了该对话框。
· InterfaceLibrary)”中的OleUIBusy函数。
备注
调用该函数,以显示OLE服务器忙或服务器没有响应对话框。
如果要通过调整m_bz结构的值来初始化对话框中的控件状态,
请参阅:
COleBusyDialog::GetSelectionType, COleBusyDialog::m_bz
CFontDialog::DoModal
virtual int DoModal( );
返回值
IDOK或IDCANCEL。如果返回IDCANCEL,则调用WindowsCommDlgExtendedError函数判断是否发生了错误。
备注
调用此成员函数显示一个Windows通用字体对话框,并允许用户选择一种字体。
如果想用设置m_cf结构成员的方法初始化各种字体对话控件,则应在调用DoModal之前,及创建了对话对象之后进行。
如果DoModal返回IDOK,可用其它成员函数获得用户输入对话框的设置或信息。
请参阅:CDialog::DoModal,CFontDialog::CFontDialog
CFileDialog::DoModal
virtual int DoModal( );
返回值
IDOK或IDCANCEL。如果返回IDCANCEL,调用CommDlgExtendedError函数来判断是否是发生错误。
IDOK或IDCANCEL是表明用户选择了OK还是Cancel按钮的常数。
备注
调用此成员函数前显示一个Windows常用文件对话框,使用户浏览文件和目录并输入一个文件名。
如果想通过设置m_ofn结构的成员来初始化各种文件对话框选项,则应在调用DoModal之前,创建对话对象之后进行。
当用户单击对话框的OK或Cancel按钮或选择对话框控件菜单中的关闭,则控件返回你的应用,然后可以调用其它成员函数获取用户输入对话框中的更多信息和设置。
DoModal是从CDialog类覆盖得到的虚函数
请参阅:CDialog::DoModal, CFileDialog::CFileDialog
程序
CDialog::DoModal
virtual int DoModal();
整数值
整数值,指定了传递给CDialog::EndDialog(该函数用于关闭对话框) 的nResult参数值。如果函数不能创建对话框,则返回-1;如果出现其它错误,则返回IDABORT。
备注
调用该成员函数使用模态对话框并返回对话框结果。当对话框处于活动状态时,该函数处理与用户的交互。这使得对话框是模态的,使用户在关闭对话框之前不能与其它窗口交互。
如果用户单击了对话框中的按钮,如OK或Cancel,那么消息处理函数如OnOK或OnCancel被调用,从而关闭对话框。缺省的OnOK成员函数会对对话框数据进行有效性检验和更新,并关闭它得到结果IDOK。缺省OnCancel函数关闭对话框得到结果IDCANCEL,而不对对话框数据检验或更新,可以覆盖这些消息函数并改变它们的行为。注意 PreTransMessage被调用来处理模态对话框的消息。
请参阅:::DialogBox, CWnd::IsDialogMessage
异常检测
CColorDialog::DoModal
virtual int DoModal( );
返回值
IDOK或者IDCANCEL。如果返回了IDCANCEL,则可以调用Windows函数CommDlgExtendedError来检测是否发生了错误。
其他信息
本函数用于显示Windows通用颜色对话框并接收用户的选择。
如果想通过设置m_cc结构的各个成员来初始化不同的颜色对话框,应在对话框对象构造之后,调用DoModal之前进行。
在调用DoModal之后,可以调用其它的成员函数检索设置信息和用户输入的信息。
请参阅:CDialog::DoModal,CColorDialog::CColorDialog
说明
DoModal()函数调用失败的原因分析:
对话框DoModal()函数调用失败一般而言有两种表现形式:一是对话框弹不出来,但是没有错误提示;二是对话框弹不出来,同时伴随内存访问错误的提示框出现。 第一种表现主要是因为没有对资源句柄进行切换造成的,以在DLL中弹出对话框中最为常见。解决办法是:如果是MFC规则DLL,可以使用所有导出函数的开始处添加 AFX_MANAGE_STATE宏,具体代码为:AFX_MANAGE_STATE(AfxGetStaticModuleState( )),如果是MFC扩展DLL,具体做法是 1. 在DLL中定义两个全局变量, HINSTANCE hResOld; // 旧的资源句柄 HINSTANCE hDll; // DLL资源句柄 2. 在DllMain函数里初始化hDll hDll = hInstance; 3. 在调用对话框DoModal()函数之前进行资源句柄切换 HINSTANCE hResOld = AfxGetResourceHandle(); AfxSetResourceHandle(hDll); …… CYourDlg dlg; dlg.DoModal(); …… AfxSetResourceHandle(hResOld); 若是第二种表现,即对话框弹不出来,同时伴随内存访问错误的提示框出现,那么问题很可能出现在初始化对话框界面的代码方面,具体是在OnInitDialog函数,即使它是在DLL中弹出对话框。事实上在在DLL中弹出对话框如果不进行资源句柄切换,顶多是弹不出对话框,并不会出现内存访问方面的错误。在解决这方面的错误,一个误区是单步进入DoModal()函数调试,直至定位DoModal函数内部哪一句出错。后来我发现这纯粹是浪费时间,就算定位了在DoModal函数内部哪一句出错,你依然不知道为什么会出错。实际上调用DoModal()函数,激发的却是OnInitDialog函数。因此你只需确定OnInitDialog函数哪一句出错了(这里的OnInitDialog函数是指派生对话框类的OnInitDialog函数)。
参考资料
最新修订时间:2023-05-28 20:15
目录
概述
简介
参考资料