09 MFC控件编程-对话框的种类

在 VS中,可以创建以下 3 类典型的 Windows 应用程序,它们都是通过 MFC向导创建的:

  1. 基于对话框的应用程序:这类程序适合于文档较少而交互操作较多的应用场合,如 Windows 自带的计算器程序。 
  2. 单文档界面( SDI )应用程序:这类程序一次只能打开一个文档,如 Windows 自带的 Notepad 程序。 
  3. 多文档界面( MDI )应用程序:这类程序可以同时打开多个文档并进行处理,处理的过程中很容易地进行切换,如 Microsoft Word 。

对话框是一种特殊类型的窗口,绝大多数Windows程序都通过对话框与用户进行交互。它既可以单独组成一个简单的应用程序,又可以成为文档/视图结构程序的资源。

按MFC向导创建一个基于对话框的MFC应用程序后,在类视图中,可以看到生成了3 个类: CAboutDlg 、 CDialogApp 和 CDialogDlg 。

CAboutDlg:对应生成的版本信息对话框。 

CDialogApp:对话框类,从 Cdialog 继承过来的,在程序运行时看到的对话框就是它的一个具体对象。 

CDialogDlg:应用程序类,从 CWinApp 继承过来,封装了初始化、运行、终止该程序的代码。

另外需要特别说明的两个对话框成员函数是: 

       DoDataExchange函数,该函数主要完成对话框数据的交换和校验。

       OnInitDialog函数:相当于对对话框进行初始化处理

      调用这个成员函数是对WM_INITDIALOG消息作出的反应。这条消息是在对话框即将显示之前,在Create,CreateIndirect或       DoModal调用期间发出的。

 

常用对话框有两类,分别是:

1、模态对话框

     当其显示时,程序会暂停执行,直到关闭这个模态对话框之后,才能执行程序中的其他任务。实现模态对话框的创建需要调用CDialog类的成员函数 DoModal(),该函数的功能就是创建并显示一个对话框。

CTestDlg dlg;
dlg.DoModal();	//显示模态对话框

2、非模态对话框

    当非模态对话框显示时,运行转而执行程序中 的其他任务,而不用关闭这个对话框。如果要创建非模态对话框在需要使用CDialog的Create成员函数。

BOOL Create(LPCSTR lpszTemplateName, CWnd* pParentWnd = NULL);
BOOL Create(UNIT nIDTemplate, CWnd* pParentWnd = NULL);
/*
返回值:
    如果对话框创建和初始化成功,则返回非零值,否则为0。
参数: 
  lpszTemplateName 对话框模板的名称。  
  nIDTemplate 对话框资源的ID。  
    pParentWnd 指向含有对话框的父窗口对象的指针。如果为NULL,对话框对象的父窗口设置为应用的主窗口。
注意:窗口只能创建一次,所以不能在按钮的回调内使用它,否则多次点击,会是程序崩溃,所以应该把该函数放在对话框的OninitDialog()中进行创建,然后再按钮的回调内把他显示即可
*/

注意:窗口只能创建一次,所以不能在按钮的回调函数内进行创建,否则,多次点击,将会使程序崩溃,所以应该在对话框的OninitDialog()函数内进行创建,在按钮回调函数内将其显示出来

创建完毕后,记得要使用ShowWindow函数将对话框显示出来。

BOOL ShowWindow( int nCmdShow );
/*
返回值:如果窗口原来可见,则返回非零值;如果CWnd原来是隐藏的,则返回0。

参数: nCmdShow 指定了CWnd应如何被显示。它必须是下列值之一: 
    SW_HIDE 隐藏窗口并将活动状态传递给其它窗口。  
    SW_MINIMIZE 最小化窗口并激活系统列表中的顶层窗口。  
    SW_RESTORE 激活并显示窗口。如果窗口是最小化或最大化的,Windows恢复其原来的大小和位置。  
    SW_SHOW 激活窗口并以其当前的大小和位置显示。  
    SW_SHOWMAXIMIZED 激活窗口并显示为最大化窗口。  
    SW_SHOWMINIMIZED 激活窗口并显示为图标。  
    SW_SHOWMINNOACTIVE 将窗口显示为图标。当前活动的窗口将保持活动状态。  
    SW_SHOWNA 按照当前状态显示窗口。当前活动的窗口将保持活动状态。  
    SW_SHOWNOACTIVATE 按窗口最近的大小和位置显示。当前活动的窗口将保持活动状态。  
    SW_SHOWNORMAL 激活并显示窗口。如果窗口是最小化或最大化的,则Windows恢复它原来的大小和位置。  
 
*/

执行程序发现仍然没有弹出测试对话框,问题就出在创建的非模态对话框是一个局部对象,函数结束后,对话框的生命周期也就结束了。在创建非模态对话框时不能将其定义为局部对象。有两种解决方法:

  • 把对话框对象定义为类的成员变量
  • 将对话框对象定义为指针,在堆上分配内存

 

 

你可能感兴趣的:(MFC入门教程)