【转载】MFC非模态对话框实例

2012-06-17 16:21:41|  分类: C++/MFC |  标签: |字号大中小 订阅

实例目的

在Windows环境中,对话框是一种常用的输入输出手段。对话框有两种类型,非模态和模态。非模态对话框与模态对话框不同,在非模态对话框活动的同时,用户还可以在应用程序的其他地方工作,而模态对话框在其关闭之前,用户不能在同一个应用程序的其他地方工作。本例将从主框架窗口创建一个简单的非模态对话框,在该对话框关闭之前,用户可以在主框架窗口中的其他地方工作,比如选择“打开”文件等。

实现方法

非模态对话框的创建比较复杂。下面介绍具体的方法:

首先,创建一个新的对话框资源,并新建一个类与之关联(用AppWizard);

其次,调用CDialog的默认构造函数来构造对话框对象(注意,创建的不是窗口),这一步在主框架窗口的构造函数中实现。

再次,调用CDialog::Create成员函数创建窗口,Create把资源ID作为参数,并且,在对话框窗口仍然在屏幕上显示时,就立刻返回控件。

最后,在关闭非模态对话框时,注意要调用DestroyWindow函数而不是CloseWindow。删除的只是对话框窗口,对话框对象并未删除,留待创建新的窗口。在程序退出时,再删除该对话框对象。这个过程中对话框与主窗口之间消息的传递必须由用户实现,自定义消息映射(在代码的第10步详细说明)。

在编程过程中必须准确了解何时构造对话框对象,何时创建对话框窗口,何时删除对话框。

程序代码

1.  利用AppWizard生成一个名为ShowModelessDialog的SDI工程,其他步骤均采用VC的默认配置(取消Print And PrintView的选定)。

2.  使用对话框编辑器创建对话框资源。从Insert菜单选择Resource,然后选定Dialog。改变对话框标题为Modeless Dialog。添加一个静态文本控件和一个编辑控件。静态文本控件标题可以任意指定,本例指定为“Password”。

3.  使用ClassWizard创建CModelessDialog类,该类与刚才创建的资源相关联。添加消息处理函数OnCancel和OnOK,代码如下:

void CModelessDialog::OnCancel()

{

if(m_pView != NULL)

{

//非模式对话框不调用基类CDialog的OnCancel函数

//发送用户定义的消息WM_GOODBYE

m_pView->PostMessage(WM_GOODBYE, IDCANCEL);

}

else

{

//模态对话框直接调用基类的OnConcel函数

CDialog::OnCancel();

}

}

void CModelessDialog::OnOK()

{

if(m_pView != NULL)

{

//非模式对话框不调用基类CDialog的OnOK函数

UpdateData(TRUE);

m_pView->PostMessage(WM_GOODBYE, IDOK);

}

else

{

//模态对话框直接调用基类的OnOK函数

CDialog::OnOK();

}

}

4.  为CModelessDialog类增加如下成员变量和构造函数原型:

private:

CView *m_pView; //指向调用此对话框的视类对象的指针

Public:

CModelessDialog(CView *pView); //保留原有的构造函数,从而可以兼容模态对话框

BOOL Create();

5.  在CModelessDialog.h中定义WM_GOODBYE消息的ID:

#define WM_GOODBYE WM_USER+5

6.  在CModelessDialog.cpp中增加非模态的构造函数和Create函数:

CModelessDialog::CModelessDialog(CView *pView)

{

//非模态对话框的构造函数,m_pView不为空

m_pView = pView;

}

BOOL CModelessDialog::Create()

{

return CDialog::Create(CModelessDialog::IDD);

}

7.  在CShowModelessDialogView.h中添加一个指向非模态对话框的指针:

private:

CModelessDialog *m_pDlg;

8.  在CShowModelessDialogView.cpp中修改构造函数和析构函数。构造函数在堆上构造对话框对象,并且最终由视图析构函数删除它:

CShowModelessDialogView::CShowModelessDialogView()

{

// TODO: add construction code here

//在堆中生成CModelessDialog对象

m_pDlg = new CModelessDialog(this);

}

CShowModelessDialogView::~CShowModelessDialogView()

{

//删除对话框对象,释放堆空间

delete m_pDlg;

}

9.  在CShowModelessDialogView.cpp中添加代码到虚函数OnDraw中,提示用户按下选择“演示 -> 非模态对话框”来进行演示,并添加头文件的包含语句:

#include “ModelessDialog.h”

void CShowModelessDialogView::OnDraw(CDC* pDC)

{

// TODO: add draw code for native data here

pDC->TextOut(0, 0, "请选择 演示 -> 非模态对话框 进行演示");

}

10.  为WM_GOODBYE增加自己的消息代码。因为ClassWizard不支持用户定义的消息,所以,我们必须自己编写代码。

在CShowModelessDialogView.cpp中,BEGIN_MESSAGE_MAP语句之后AFX_MSG_MAP括号外增加如下代码,定义消息映射:

ON_MESSAGE(WM_GOODBYE, OnGoodbye);

在CShowModelessDialogView.h中,DECLARE_MESSAGE_MAP语句之前AFX_MSG括号之外,增加如下消息映射的声明:

afx_msg LRESULT OnGoodbye(WPARAM wParam, LPARAM lParam);

同样,在CShowModelessDialogView.cpp中,增加消息处理函数:

LRESULT CShowModelessDialogView::OnGoodbye(WPARAM wParam, LPARAM lParam)

{

//输出按钮的ID,OK按钮ID为1,CANCLE按钮ID为2

//可以根据此消息进行用户的工作

TRACE("CShowModelessDialogView::OnGoodbye %x, %x\n", wParam);

m_pDlg->DestroyWindow();

return 0L;

}

11.  使用菜单编辑器添加菜单项“演示—〉非模式对话框”,对应ID为ID_MODELESS。为它创建消息处理函数如下:

void CShowModelessDialogView::OnShowMD()

{

//如果对话框窗口不存在则创建一个

if(m_pDlg->GetSafeHwnd() == 0)

{

//创建对话框窗口,显示Show Modeless Dialog对话框

m_pDlg->Create();

}

}

编译并运行该程序,选择“演示—〉非模式对话框”,非模态对话框Modeless Dialog跳出,这时,我们仍可以在该对话框中工作,也可以在应用程序的其他地方工作,譬如选择“文件 —〉打开”,就会跳出打开文件对话框。但是打开文件对话框是模态对话框,所以在关闭它之前我们不能在应用程序的其他地方工作了。从中我们也可以体会到非模态对话框与模态对话框的不同。

本例中对非模态对话框传递的消息并未做处理,只是简单的输出了用户所做的选择:确定或取消。如果读者想要根据传递的消息做一些工作,可以自己添加代码实现。

MFC非模态对话框实例相关推荐

  1. mfc 子窗体 按钮不触发_实战经验:MFC非模态对话框的使用

    问题 在MFC编程中,我们经常会使用到模态对话框,模态对话框的一个典型特征是当对话框弹出后,其父窗口将不接受任何UI响应,直到关闭当前的模态对话框后才能继续.然而,非模态对话框就没有这个限制,今天我们 ...

  2. mfc入门基础(六)创建模态对话框与非模态对话框

    参考博客: VS2010/MFC编程入门之十一(对话框:模态对话框及其弹出过程)-软件开发-鸡啄米 一.创建模态对话框 1.接着上节中的test02的例子来讲,找到test02.cpp文件,找到函数I ...

  3. MFC创建模态对话框与非模态对话框 执行顺序

    创建模态对话框 CDialog::DoModal virtual int DoModal(); 返回值: 整数值,指定了传递给CDialog::EndDialog 的nResult参数值.该函数用于关 ...

  4. 鸡啄米vc++2010系列11(非模态对话框的创建)

    上一节鸡啄米讲了模态对话框及其弹出过程,本节接着讲另一种对话框--非模态对话框的创建及显示. 鸡啄米已经说过,非模态对话框显示后,程序其他窗口仍能正常运行,可以响应用户输入,还可以相互切换.鸡啄米会将 ...

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

    注意:以下实例中创建模态对话框时没有用create(id号)绑定资源id,而非模态对话框中要用create(id号)绑定对话框资源id. 在MFC中对话框有两种形式,一个是模态对话框(model di ...

  6. 鸡啄米:模态、非模态对话框

    模态对话框: (1)找到视图,添加一个"对话框"资源作为模态对话框(即:插入 Dialog(E)): (2)再给该模态对话框资源在添加类,类名为CTipDlg. 右键新加入的对话框 ...

  7. MFC中的模态对话框与非模态对话框

    模态对话框创建: MyDialog mydlg; mydlg.DoModal() 当前只能运行此模态对话框,且停止主窗口的运行,直到模态对话框退出,才允许主窗口运行. 模态对话框的关闭顺序: OnCl ...

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

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

  9. MFC中模态对话框和非模态对话框的差别

    在MFC中有模态对话框和非模态对话框,那这两种有什么差别呢. 又都是用于什么场合呢. 首先,要弄清楚2种对话框是怎样创建的. 然后要弄清楚2种对话框有什么差别,可能从表面上看,模态会堵塞主对话框.可原 ...

最新文章

  1. 皮一皮:论智能酒店的高等级提示...
  2. MSER+SIFT 图像的特征向量提取
  3. LeetCode 31 Next Permutation(下一个全排列)
  4. linux+管道+分段,Linux中shell基础、重定向、管道符、环境变量
  5. STM32之GPIO浮空输入例程
  6. 微型计算机三级项目,微机原理三级项目.doc
  7. 镄囩 php编码,GBK 编码
  8. Python算法教程:强连通分量
  9. OFD板式文档阅读器
  10. GitHub项目精选
  11. 处理ArchLinux上各软件屏幕卡顿与显示问题(chrome浏览器,微信开发者工具wxdt,vscode移动慢问题)
  12. 清理Win11磁盘的方法
  13. 解决 win10系统zookeeper启动闪退分析
  14. 高速PCB设计指南系列(四)
  15. android button 属性,两行显示数字,前面各有图像,Android_2_常用控件及常用属性
  16. RK3568触摸屏驱动调试总结
  17. jade支持html,Jade !HTML框架
  18. 基于ARM11+Linux的无线视频监控系统
  19. vscode:The terminal process failed to launch (exit code: -1)
  20. RedisTemplate 保存数据的键值通过rdm可视化工具查看乱码

热门文章

  1. [渝粤教育] 广东-国家-开放大学 21秋期末考试管理会计10171k2
  2. 【渝粤教育】国家开放大学2018年秋季 0695-21T (1)农业企业经营管理 参考试题
  3. 【渝粤题库】广东开放大学 大学英语B 形成性考核 (2)
  4. 一分钟了解:zigbee的三种关键角色(视频讲解)
  5. 过防火墙一句话php2017,dedeCMS友情链接getshell漏洞利用
  6. 5 zabbix 添加host_Zabbix 快速上手——添加 Agent 主机
  7. mysql 5.6自动任务_mysql定时执行某任务
  8. 【MFC系列-第16天】企业信息管理软件开发
  9. 【MFC系列-第9天】MFC消息映射机制的原理
  10. 【通信原理课程设计】8PSK调制解调技术的设计与仿真(MATLAB)