`

模态对话框和非模态对话框区别

阅读更多

按工作方式不同,可将对话框分成两类:
??模式对话框(modal dialog box模态对话框):在关闭模式对话框之前,程序不能进行其他工作(如一般的“打开文件”对话框)
??无模式对话框(modeless dialog box 非模态对话框):模式对话框打开后,程序仍然能够进行其他工作(如一般的“查找与替换”对话框)
两者的区别:
一. 非模态对话框的模板必须具有Visible风格(Visible=True),否则对话框将不可见,而模态对话框则无需设置该项风格。在实际编程中更加保险的办法是调用CWnd::ShowWindow(SW_SHOW)来显示对话框,而不管对话框是否具有Visible风格。
二. 非模态对话框对象是用new操作符来动态创建的,而不是以成员变量的形式嵌入到别的对象中或以局部变量的形式构建的。通常应在对话框的拥有者窗口类内声明一个指向对话框类的指针成员变量,通过该指针可访问对话框对象。
三. 通过调用CDialog::Create函数来启动对话框,而不是CDialog::DoModal,这是两者之间区别的关键所在。由于Create函数不会启动新的消息循环,对话框与应用程序共用同一个消息循环,这样对话框就不会垄断用户输入。Create在显示了对话框后就立即返回,而DoModal是在对话框被关闭后才返回的。由于在Create返回后,不能确定对话框是否已关闭,这样也就无法确定对话框对象的生存期,因此只好在堆栈中构建对话框对象,而不能以局部变量的形式来构建之。
四. 必须调用CWnd::DestroyWindow而不是CDialog::EndDialog来关闭非模态对话框。调用CWnd::DestroyWindow是直接删除窗口的一般方法。由于缺省的CDialog::OnOK和CDialog::OnCancel函数均调用EndDialog,故程序员必须编写自己的OnOK和OnCancel函数并且在函数中调用DestroyWindow来关闭对话框。
五. 因为是用new操作符构建非模态对话框对象,因此必须在对话框关闭后,用delete操作符删除对话框对象。在屏幕上一个窗口被删除后,框架会调用CWnd::PostNcDestroy,这是一个虚拟函数,程序可以在该函数中完成删除窗口对象的工作,具体代码如下
void CModelessDialog::PostNcDestroy
{delete this; //删除对象}
这样,在删除屏幕上的对话框后,对话框对象将被自动删除。拥有者就不必显式地调用delete来删除对话框对象了。
六. 必须有一个标志表明非模态对话框是否打开的。这样做的原因是用户有可能在打开一个模态对话框的情况下,又一次选择打开命令。程序根据标志来决定是打开一个新的对话框,还是仅仅把原来打开的对话框激活。通常可以用拥有者窗口中的指向对话框对象的指针作为这种标志,当对话框关闭时,给该指针赋NULL值,以表明对话框对象已不存在了。
例如:
创建模态对话框
CTestDlg dlg;
dlg.DoModal();
创建非模态对话框
CTestDlg * dlg = new CTestDlg;
dlg->Create(IDD_TEST_DLG);
dlg->ShowWindow(SW_SHOW);

分享到:
评论

相关推荐

    详解VC++模态对话框和非模态对话框

    在VC++中,MFC(Microsoft Foundation Classes)框架提供了两种主要的对话框类型:模态对话框和非模态对话框。这两种对话框在程序执行流程和用户交互方面有着显著的区别。 模态对话框(Modal Dialog Box)是通过...

    vc的模态对话框和非模态对话框

    ### VC的模态对话框和非模态对话框详解 #### 概述 在Visual C++(VC)中,模态对话框与非模态对话框是两种常见的对话框类型,它们各自具备独特的特性和用途。理解这两种对话框的区别对于开发用户友好的应用程序至...

    VC中模态对话框和非模态对话框的编程

    ### VC中模态对话框和非模态对话框的编程 #### 一、概述 对话框(Dialog)作为Windows应用程序中频繁使用的元素之一,主要用于接收用户的输入信息。在MFC框架下,对话框的功能被封装在`CDialog`类中,这是一个从`...

    模态对话框与非模态对话框程序Java示例

    对话框分为两种主要类型:模态对话框(Modal Dialog)和非模态对话框(Non-modal Dialog)。下面将详细阐述这两种对话框的概念、特点以及如何在Java中创建和使用它们。 1. 模态对话框: 模态对话框是阻止用户与父...

    MFC模态对话框和非模态对话框

    在Windows应用程序开发中,Microsoft Foundation Class (MFC)库提供了一种高效且便捷的方式来创建用户界面,其中包括模态对话框和非模态对话框。这两种对话框在不同的场景下各有其用途,理解它们的工作原理和使用...

    模态对话框和非模态对话框创建和使用VS2010/MFC

    在Microsoft Visual Studio 2010 (VS2010) 中,MFC(Microsoft Foundation Classes)库提供了创建和管理用户界面元素的功能,其中包括模态对话框和非模态对话框。这两种对话框在Windows应用程序开发中扮演着重要的...

    MFC模态 非模态对话框 ARX2008+VS2005

    结合Visual Studio 2005(VS2005)的Microsoft Foundation Classes (MFC),我们可以构建强大的用户界面,其中包括模态和非模态对话框。下面将详细解释这两个概念以及如何在ARX2008+VS2005环境下实现它们。 1. **...

    MFC学习之模态对话框和非模态对话框

    对话框分为两种主要类型:模态对话框(Modal Dialog)和非模态对话框(Modeless Dialog)。让我们深入探讨这两种对话框的概念、区别以及如何在MFC中实现它们。 模态对话框是一种阻塞型窗口,当它打开时,用户必须先...

    mfc中模态、非模态对话框与主对话框之间的数据交换

    点击运行弹出一个对话框,点击DIALOG1按钮弹出一个模态对话框,在该对话框的编辑框输入文本点击确定该对话框消失且输入的文本被显示到主对话框MainDialog中,点击DAILOG2按钮弹出一个非模态对话框,操作现象和模态...

    MFC模态对话框与非模态对话框

    MFC中经常会用到弹出模态或非模态对话框,模态对话框与非模态对话框容易混淆

    android 模态与非模态对话框实现

    总之,理解和熟练使用模态和非模态对话框是Android开发中的关键技能,这不仅能提升用户体验,也是优化应用程序交互设计的重要手段。通过源码分析和工具辅助,开发者可以更好地掌握这些技术,实现更高质量的Android...

    vc非模态对话框例子

    非模态对话框与模态对话框不同,在非模态对话框活动的同时,用户还可以在应用程序的其他地方工作,而模态对话框在其关闭之前,用户不能在同一个应用程序的其他地方工作。本例将从主框架窗口创建一个简单的非模态...

    创建非模态对话框

    对话框通常分为两种类型:模态对话框和非模态对话框。模态对话框会阻止用户与应用程序的其他部分进行交互,直到对话框被关闭。而非模态对话框则允许用户同时与应用程序的其他部分交互。 #### 非模态对话框的特点 ...

    VS2010+MFC 模态对话框、非模态对话框的显示与打开以及对话框的之间的数据传递

    在本文中,我们将深入探讨如何在VS2010中使用MFC实现模态对话框(Modal Dialog)和非模态对话框(Modeless Dialog)的显示与打开,以及它们之间的数据传递。 首先,模态对话框是一种阻止用户与应用程序其他部分交互...

    qml自定义模态对话框

    在QML(Qt Quick)中,自定义模态对话框是一种常见的需求,它允许开发者创建具有独特设计和功能的交互式界面元素。不同于标准的`Popup`组件,自定义模态对话框通常需要更高的定制性,以满足特定的用户体验或项目需求...

    MFC 加法计算器+属性页对话框+非模态对话框 完整代码下载

    MFC 加法计算器+属性页对话框+非模态对话框 完整代码下载 MFC 加法计算器+属性页对话框+非模态对话框 完整代码下载 MFC 加法计算器+属性页对话框+非模态对话框 完整代码下载 MFC 加法计算器+属性页对话框+非模态...

    MFC多线程创建非模态对话框(防止一闪而逝)

    在提供的"多线程创建非模态对话框防闪逝demo"中,你可以找到具体实现的代码示例,通过学习和实践,你可以更好地理解和掌握这一技术。 总结来说,MFC多线程创建非模态对话框的关键在于合理分配任务到不同的线程,...

    vc模态和非模态对话框关闭过程

    在VC++中,模态对话框和非模态对话框是两种常用的交互界面形式。模态对话框在显示时会阻止用户与应用程序中的其他窗口进行交互,直到该对话框被关闭;而非模态对话框则不会阻止用户与其他窗口的交互。这两种对话框在...

    模态和非模态对话框的区别

    模态对话框和非模态对话框的区别 在 GUI 编程中,对话框是非常常见的交互方式,对话框可以分为两种:模态对话框和非模态对话框。了解这两种对话框的区别对于开发高质量的软件至关重要。 首先,非模态对话框通常...

Global site tag (gtag.js) - Google Analytics