MFC非模态对话框实例

【转载】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跳出,这时,我们仍可以在该对话框中工作,也可以在应用程序的其他地方工作,譬如选择“文件 —〉打开”,就会跳出打开文件对话框。但是打开文件对话框是模态对话框,所以在关闭它之前我们不能在应用程序的其他地方工作了。从中我们也可以体会到非模态对话框与模态对话框的不同。

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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353769.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Node简单服务器开发

运用的知识:http,fs,get,post 接口定义:/user?actreg$useraaa&passbbb后台返回格式:{"ok":false,"msg":"原因"}/user?actlogin$useraaa&passbbb后台返回格式&…

5个常见的Hibernate异常及其解决方法

了解如何使用Hibernate轻松解决最常见的问题 Hibernate可能是市场上最受欢迎的JPA实现,您可以在许多地方看到它,例如: 您自己使用过的项目数, 需要Hibernate经验的职位数量,当然还有 互联网上发布的问题和例外数量…

MATLAB figure中提取数据

MATLAB figure中提取数据 (2011-10-26 14:26:21) 转载▼标签: 杂谈 分类: matlab figure画出来,提取数据有很多好处,方便保存,计算,加工,还可以导入到origin里面画图。具体的方法就是两部。第一…

Wine下完美安装QQ 2010:

Wine下完美安装QQ 2010:1、先安装Wine:sudo apt-get install wine2、获取获取最新的WineTricks,WineTricks 是 Wine的其中一个开发者DanKegel写的一个安装Windows有关库和软件的小程序,非常有用。下载WineTricks,在终端…

stopwatch_在Java中衡量执行时间– Spring StopWatch示例

stopwatch有两种方法可以通过使用System.currentTimeinMillis()或使用System.nanoTime() 来测量Java中经过的执行时间 。 这两个方法可用于测量 Java中两个方法调用或事件之间的经过时间或执行时间 。 计算经过的时间是Java程序员…

oracle客户端中文乱码问题的解决

1 查看服务器端编码 select userenv(language) from dual; 我实际查看到的结果为: USERENV(LANGUAGE) ----------------------------- AMERICAN_AMERICA.ZHS16GBK 2 执行语句 select * from V$NLS_PARAMETERS; 查看第一行PARAMETER项中为NLS_LANGUAGE对应的VALUE项…

avi文件格式详解

avi文件格式详解 AVI是音频视频交错(Audio Video Interleaved)的英文缩写,它是Microsoft公司开发的一种符合RIFF文件规范的数字音频与视频文件格式,原先用于Microsoft Video for Windows (简称VFW)环境,现在已被Windows 95/98、OS/2等多数操作…

许多参数和丢失的信息

代码越少越好? 对象越少越好? 是真的吗 像往常一样,这取决于。 在某些情况下,通过添加更多内容,我们会添加不必要的复杂性。 当我们仅出于“将来可能需要这种额外的灵活性”而创建接口或其他抽象时,就会发…

并发编程---线程queue---进程池线程池---异部调用(回调机制)

线程 队列:先进先出堆栈:后进先出优先级:数字越小优先级越大,越先输出import queueq queue.Queue(3) # 先进先出-->队列q.put(first) q.put(2) # q.put(third) # q.put(4) #由于没有人取走,就会卡主 q.put(4,block…

avi编码格式以及查看的视频编码方式的小工具

avi编码格式以及查看的视频编码方式的小工具 2009-06-06 17:55:47| 分类: 默认分类 | 标签: |字号大中小 订阅 首先要说明的是,文件后缀名为avi的文件不一定使用的编码方式就是一样的,所以才写下来,以备以后查阅…

SQL Server遗失管理权限账号密码怎么办?

假如一个SQL Server实例只允许“SQL身份认证”模式登录数据库,而糟糕的是你忘记了sa的密码(sa出于安全考虑应该被禁用,这里仅仅为了描述问题)或其它具有sysadmin角色的登录名的密码?个人就遇到这样一个案例&#xff0c…

MFC 定时器使用方式

MFC 定时器使用方式 2011-04-30 12:24:58| 分类: 默认分类 | 标签: |字号大中小 订阅 用SetTimer函数 创建定时器 参数1表示定时器的ID,参数2表示时间间隔,最后一个参数是处理的函数,如果填NULL表示&#xff0…

js循环获取table中的值

<script type"text/javascript">function getTdValue() {var tableId document.getElementById("tab");var str "";//获取table中的某一列的值for (var i 1; i < tableId.rows.length; i) {alert(tableId.rows[i].cells[3].innerHTM…

MFC中Radio Button使用方法

MFC中Radio Button使用方法2012-04-19 09:44:22 我来说两句 收藏 我要投稿 先为对话框加上2个radio button&#xff0c;分别是Radio1和Radio2。 问题1&#xff1a;如何让Radio1或者Radio2默认选上&#xff1f;如何知道哪个被选上了&#xff1f; 关键是选上&#x…

使用不可变对象创建值对象

在回答我最近的文章中AutoValue&#xff1a;生成的不可变的值类 &#xff0c; 布兰登认为&#xff0c;这可能是有趣的&#xff0c;看看如何AutoValue比较项目Lombok和Immutables和凯文借调这一点。 我同意这是一个好主意&#xff0c;但是我首先将这篇文章发布为Immutables的简要…

css3 transform实现水平和垂直居中

代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compatible…

ubuntu vnc 远程连接桌面

ubuntu vnc 远程连接桌面 2011-05-18 10:30:48 分类&#xff1a; LINUX 一、WindowsXP远程连接Ubuntu的桌面 1.在WindowsXP上下载并安装RealVNC; 2.在Ubuntu中操作&#xff0c;打开 应用程序/互联网 /远程桌面查看器; 3.首先要配置一下&#xff0c;打开 系统/首选项/远程桌面&…

hkws摄像头拆机

转载于:https://www.cnblogs.com/feipeng8848/p/8961924.html

java虚拟机常用命令工具

java虚拟机常用命令工具 博客分类&#xff1a; 虚拟机 虚拟机jvmjava 一、概述 程序运行中经常会遇到各种问题&#xff0c;定位问题时通常需要综合各种信息&#xff0c;如系统日志、堆dump文件、线程dump文件、GC日志等。通过虚拟机监控和诊断工具可以帮忙我们快速获取、分…

Spring Cloud Zuul –编写过滤器

Netflix OSS项目Zuul充当后端服务的网关&#xff0c;并支持添加安全性&#xff0c;路由等边缘功能。 在Zuul世界中&#xff0c;称为Zuul过滤器的组件提供了特定的边缘功能&#xff0c;为基于Spring Cloud的项目编写这种过滤器非常简单。 此处提供了添加过滤器的良好参考。 在这…