MFC-创建模态对话框和非模态对话框的方法

MFC-创建模态对话框和非模态对话框的方法在 MFC 中对话框有两种形式 一个是模态对话框 modeldialogb 一个是非模态对话框 modelessdial 本文对此分别简述其创建方法 一 模态对话框 modeldialogb 在程序运行的过程中 若出现了模态对话框 那么主窗口将无法发送消息 直到模态对话框退出才可以发送 点击模态对话框中的 OK 按钮 模态对话框会被销毁 创建一个模态对话框的代码如下所示 创建一个模态对话框 CTestDialogt td D

注意:以下实例中创建模态对话框时没有用create(id号)绑定资源id,而非模态对话框中要用create(id号)绑定对话框资源id。

在MFC中对话框有两种形式,一个是模态对话框(model dialog box),一个是非模态对话框(modeless dialog box)。本文对此分别简述其创建方法。

一、模态对话框(model dialog box)

 
  1. //创建一个模态对话框
  2. CTestDialog td;
  3. td.DoModal();

二、非模态对话框(modaless dialog box)

此处采用和上面一样的方式来创建一个非模态对话框,代码如下:

 
  1. CTestDialog td;
  2. td.Create(IDD_DIALOG1); //创建一个非模态对话框
  3. td.ShowWindow(SW_SHOWNORMAL); //显示非模态对话框

那么,在运行时,你会发现此对话框无法显示。这是因为你声明的对话框变量td是局部变量,但这个函数返回时,td也被析构了,所以无法显示此对话框。

创建非模态对话框,必须声明一个指向CTestDialog类的指针变量,且需要显示的调用ShowWindow()才能将对话框显示出来。有两种创建方法:

(1)采用局部变量创建一个非模态对话框

 
  1. //采用局部变量创建一个非模态对话框
  2. CTestDialog *pTD = new CTestDialog();
  3. pTD->Create(IDD_DIALOG1); //创建一个非模态对话框
  4. pTD->ShowWindow(SW_SHOWNORMAL); //显示非模态对话框

(2)采用成员变量创建一个非模态对话框
首先在你所要编写的类的头文件中声明一个指针变量:

 
  1. private:
  2. CTestDialog *pTD;

然后再在相应的CPP文件,在你要创建对话框的位置添加如下代码:

 
  1. //采用成员变量创建一个非模态对话框
  2. pTD = new CTestDialog(); //给指针分配内存
  3. pTD->Create(IDD_DIALOG1); //创建一个非模态对话框
  4. pTD->ShowWindow(SW_SHOWNORMAL); //显示非模态对话框

最后在所在类的析构函数中收回pTD所指向的内存:

delete pTD;

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

众所周知的,MFC中非模态对话框在显示后,程序其他窗口仍能正常运行,可以响应用户输入,还可以相互切换。本文就来给大家讲解一下非模态对话框的实现方法:

一、非模态对话框的对话框资源和对话框类

实际上,模态对话框和非模态对话框在创建对话框资源和生成对话框类上是没有区别的,因此,在创建模态对话框时所创建的IDD_TIP_DIALOG对话框资源和CTipDlg类都不需要修改。

二、创建及显示非模态对话框的步骤

需要修改的是,对话框类实例的创建和显示,也就是之前在CAdditionDlg::OnBnClickedAddButton()函数体中添加的对话框显示代码。下面是具体步骤:

1. 在AdditionDlg.h中包含CTipDlg头文件并定义CTipDlg类型的指针成员变量。详细操作方法是,在AdditionDlg.cpp中 删除之前添加的#include “TipDlg.h”,而在AdditionDlg.h中添加#include “TipDlg.h”,这是因为我们需要在AdditionDlg.h中定义CTipDlg类型的指针变量,所以要先包含它的头文件;然后在 AdditionDlg.h中为CAdditionDlg类添加private成员变量CTipDlg  *m_pTipDlg;。

2.在CAdditionDlg类的构造函数中初始化成员变量m_pTipDlg。如果cpp文件中函数太多,我们可以在Class View上半个视图中找到CAdditionDlg类,再在下半个视图中找到其构造函数双击,中间客户区域即可马上切到构造函数的实现处。在构造函数体中 添加m_pTipDlg = NULL;,这是个好习惯,在任何指针变量使用前都初始化,可以避免因误访问重要内存地址而 破坏此地址的数据。

3.添加非模态对话框的创建和显示代 码。VC++中注释单行代码使用“//”,注释多行代码可以在需注释的代码开始处添加“/*”,结束处添加“*/”。修改后的 CAdditionDlg::OnBnClickedAddButton()

函数如下:

 
  1. void CAdditionDlg::OnBnClickedAddButton()
  2. {
  3. // TODO: Add your control notification handler code here
  4. /*INT_PTR nRes; // 用于保存DoModal函数的返回值
  5. CTipDlg tipDlg; // 构造对话框类CTipDlg的实例
  6. nRes = tipDlg.DoModal(); // 弹出对话框
  7. if (IDCANCEL == nRes) // 判断对话框退出后返回值是否为IDCANCEL,如果是则return,否则继续向下执行
  8. return;*/
  9. // 如果指针变量m_pTipDlg的值为NULL,则对话框还未创建,需要动态创建
  10. if (NULL == m_pTipDlg)
  11. {
  12. // 创建非模态对话框实例
  13. m_pTipDlg = new CTipDlg();
  14. m_pTipDlg->Create(IDD_TIP_DIALOG, this);
  15. }
  16. // 显示非模态对话框
  17. m_pTipDlg->ShowWindow(SW_SHOW);
  18. // 将各控件中的数据保存到相应的变量
  19. UpdateData(TRUE);
  20. // 将被加数和加数的加和赋值给m_editSum
  21. m_editSum = m_editSummand + m_editAddend;
  22. // 根据各变量的值更新相应的控件。和的编辑框会显示m_editSum的值
  23. UpdateData(FALSE);
  24. }

4.因为此非模态对话框实例是动态创建的,所以需要手动删除此动态对象来销毁对话框。我们在 CAdditionDlg类的析构函数中添加删除代码,但是MFC并没有自动给出析构函数,这时需要我们手动添加,在对话框对象析构时就会调用我们自定义 的析构函数了。在AdditionDlg.h文件中为CAdditionDlg添加析构函数声明:~CAdditionDlg();,然后在 AdditionDlg.cpp文件中添加析构函数的实现,函数体如下:

 
  1. CAdditionDlg::~CAdditionDlg()
  2. {
  3. // 如果非模态对话框已经创建则删除它
  4. if (NULL != m_pTipDlg)
  5. {
  6. // 删除非模态对话框对象
  7. delete m_pTipDlg;
  8. }
  9. }

这样,非模态对话框创建和显示的代码就添加修改完了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233093.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • [MFC美化] MFC界面UI库总结

    [MFC美化] MFC界面UI库总结稍微说下自己用过的感受:1.SkinMagic动态库DLL使用,(有VC6版本的静态链接库,没能成功调用)。对控件:菜单和下拉框(下拉滚动条)有问题。不能自由设置颜色背景皮肤格式:.smf,可使

    2022年7月1日
    26
  • stl文件格式特点_常见文件格式

    stl文件格式特点_常见文件格式一、介绍STL文件格式(stereolithography,光固化立体造型术的缩写)是由3DSYSTEMS公司于1988年制定的一个接口协议,是一种为快速原型制造技术服务的三维图形文件格式。S

    2022年8月3日
    8
  • 向DropDownList 下拉框添加新选项[通俗易懂]

    向DropDownList 下拉框添加新选项[通俗易懂]    大家有没有遇见过这样的情况,假如有一个下拉框,现在让你在下拉框里面添加一个新的选项如“请选择”,而数据库里面又不存在这一选项》要怎么做,下面为大家推荐两种写法:数据库的表为类别表:createtableLE_FoodType(FoodTypeIDintprimarykeyidentity(1,1),FoodTypeNamenvarchar(50)notnu…

    2025年9月5日
    8
  • ViewPager的addOnPageChangeListener方法详解

    ViewPager的addOnPageChangeListener方法详解关于上篇博客中写道了ViewPager的拖动状态监听的方法有网友私信问我不太明白里面的逻辑,我估摸着还是对ViewPager不太熟悉,所以就没一一回复在此开篇帖子写下关于ViewPager的具体用法,ViewPage使用时,最关键的代码就是addOnPageChangeListener,传入一个ViewPager.OnPageChangeListener对象。下面做先给大家贴上google的官方源

    2022年7月22日
    20
  • AllJoyn+Android开发案例-android跨设备调用方法

    AllJoyn+Android开发案例-android跨设备调用方法AllJoyn+Android开发案例-android跨设备调用方法

    2022年6月21日
    33
  • 安防监控必备的基础知识「建议收藏」

    安防监控必备的基础知识「建议收藏」安防监控必备的基础知识 什么是云镜控制解码器?答:解码器是将前端发出的控制信号转换为电压信号从而控制云台、镜头的的装置。什么是同轴电缆?答:同轴电缆(COARIALCABLE)的得名与它的结构相关。同轴电缆也是监控中最常见的传输介质之一。它用来传递信息的一对导体是按照一层圆筒式的外导体套在内导体(一根细芯)外面,两个导体间用绝缘材料互相隔离的结构制选的,外层导体和中心轴芯线的…

    2022年4月19日
    48

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号