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恢复它原来的大小和位置。  
 
*/

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

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chiang木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值