在 VS中,可以创建以下 3 类典型的 Windows 应用程序,它们都是通过 MFC向导创建的:
- 基于对话框的应用程序:这类程序适合于文档较少而交互操作较多的应用场合,如 Windows 自带的计算器程序。
- 单文档界面( SDI )应用程序:这类程序一次只能打开一个文档,如 Windows 自带的 Notepad 程序。
- 多文档界面( 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恢复它原来的大小和位置。
*/
执行程序发现仍然没有弹出测试对话框,问题就出在创建的非模态对话框是一个局部对象,函数结束后,对话框的生命周期也就结束了。在创建非模态对话框时不能将其定义为局部对象。有两种解决方法:
- 把对话框对象定义为类的成员变量
- 将对话框对象定义为指针,在堆上分配内存