C++API【CDialog::DoModal()】【AfxEnableControlContainer 函数】

SYD8821是具有全球领先低功耗(RX 2.4mA @-94.5dBm灵敏度,TX 4.3mA @0dBm输出功率)的蓝牙低功耗SOC芯片,在极低电流下实现了优异的射频性能,搭配176kB SRAM,512kB flash,非常适合中高阶可穿戴、智能家居、物联网等低功耗应用具体可咨询:http://www.sydtek.com/

CDialog::DoModal()

摘录于:https://blog.csdn.net/zqxf123456789/article/details/49914547

 

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; 

AfxEnableControlContainer 函数

摘录于:https://blog.csdn.net/heary29/article/details/42240475

 

AfxEnableControlContainer()函数是允许应用程序作为控件容器来使用,对于用MFC向导自动生成的单文档框架程序的C...APP::InitInstance()函数中自动加了这一句 AfxEnableControlContainer();

AfxEnableControlContainer() 负责布线所需的 CWnd 对象,以包含 OLE 控件支持结构。如果选择 OLE 控件支持时,此调用应用程序向导通过添加到项目中。您需要手动添加此调用,在以下情况中:

 

  • 要控制容器支持添加到现有项目。-或者-
     
  • 将包含 OLE 控件的对象不是直接由应用程序向导,如 OLE 控件创建的。

例如,如果动态地创建 OLE 控件作为另一个 OLE 控件的子级,父控件必须在其构造函数中调用 AfxEnableControlContainer()。

下面的列表列出了一些最常见的问题 (其他人是可能的),如果未调用 AfxEnableControlContainer() 可能会出现:

 

 

 

  • 在许多情况下,您可能会收到下面的调试器输出窗口中跟踪消息:
       >>> If this dialog has OLE controls:
       >>> AfxEnableControlContainer has not been called yet.
       >>> You should call it in your app's InitInstance function.
    						
  • 在其他情况下,您可能会遇到以下文件 Cmdtarg.cpp,行 218 中的断言:
       ASSERT(afxOccManager != NULL);
    						
  • 如果您 Masked Edit 上放置或某些其他 OLE 控件 CFormView,然后运行该应用程序,您可能会看到一个消息框,表明:

    创建空文档失败。

  • 在用AppWizard创建新的应用程序时,你的应用程序就被缺省设置为控件包容器,即在第3步选中支持ActiveX   Controls的复选框。如果你在创建过程中没有选择这项技术支持,以后也可以手动地加入这项支持。如果你手动添加这个函数,和APPWIZEARD添加效果是一样的  

 

 

 

 

 

 

 

 

你可能感兴趣的:(C++API【CDialog::DoModal()】【AfxEnableControlContainer 函数】)