模态对话框
弹出窗口阻止调用窗口的所有消息响应。
只有在弹出窗口结束后调用窗口才能继续。
在模态窗口“关闭”后,可以读取模态窗口中信息,包括窗口的返回状态,窗口子控件的值。

非模态对话框
可以在弹出窗口和调用窗口之间随意切换。
调用窗口调用show方法后,下面的代码可以立即执行。在非模态窗口关闭后,窗口的所有资源被释放,窗口不存在,无法获取窗口的任何信息。

所谓模态对话框,就是指除非采取有效的关闭手段,用户的鼠标焦点或者输入光标将一直停留在其上的对话框。非模态对话框则不会强制此种特性,用户可以在当前对话框以及其他窗口间进行切换

概念说明

1 模态窗口

打开模态窗口后,只要不关闭该窗口,鼠标焦点或者光标就会一直停留在该窗口上。只有关闭该窗口后,调用窗口才能继续。模态窗口关闭后,仍可以读取模态窗口中的信息,如窗口的返回状态等。

2 非模态窗口

打开非模态窗口后,仍可以操作调用窗口。关闭非模态窗口,该窗口将不复存在,会释放窗口的所有资源,所以无法得到该窗口的任何信息。

实例说明

1 建立Windows窗体程序ShowAndShowDialogExp,程序主画面包含两个按钮,用于打开模态窗口和非模态窗口(如下图所示)。

2 编写按钮的Click事件代码

private void button1_Click(object sender, EventArgs e)
{
Form frm1 = new Form();
frm1.Text = "我是模态窗口!";
frm1.ShowDialog();//打开模态窗口(对话框)
} private void button2_Click(object sender, EventArgs e)
{
Form frm2 = new Form();
frm2.Text = "我是非模态窗口!";
frm2.Show();//打开非模态窗口(对话框)
}

3 运行代码,进行操作体验

点击按钮“打开模态窗口”,打开模态窗口frm1,窗口标题栏显示“我是模态窗口!”,此时无法切换到调用窗口,当关闭该窗口后,又可以继续操作调用窗口了。
点击按钮“打开非模态窗口”,打开非模态窗口frm2,此时,可以仍切换到调用窗口操作调用窗口。

4 实例结论

C#中使用Show()方法打开非模态窗口,使用ShowDialog()方法打开模态窗口。

5 进阶

修改前面按钮的Click事件代码,修改后的代码如下所示。

private void button1_Click(object sender, EventArgs e)
{
Form frm1 = new Form();
frm1.Text = "我是模态窗口!";
frm1.ShowDialog();//打开模态窗口(辍对话框)
MessageBox.Show(frm1.DialogResult.ToString());
} private void button2_Click(object sender, EventArgs e)
{
Form frm2 = new Form();
frm2.Text = "我是非模态窗口!";
frm2.Show();//打开非模态窗口(对话框)
MessageBox.Show(frm2.DialogResult.ToString());
}

朋友,发现跟前面代码的区别了吗?
呵呵,仅仅加了一句输出弹出窗口的DialogResult属性值的代码而已。

再次执行代码,程序的运行情况是:

点击“打开模态窗口”打开模态窗口,接着关闭模态窗口,会弹出消息框,输出“Cancel”(frm1.DialogResult.ToString()的结果)。
点击“打开非模态窗口”打开非模态窗口后,便会弹出消息框,输出“None”(frm2.DialogResult.ToString()的结果)。

从程序执行情况我们了解到:

执行Show()方法后,后面的代码会立即执行;而执行ShowDialog()方法后,后面的代码需要等弹出窗口关闭后才能及时执行。

前面说到:模态窗口关闭后,仍可以读取模态窗口中的信息。

这主要是因为:当“关闭”模态窗口后,窗体并没有被真的被“关闭”,因为用户点击“关闭”按钮或者设置DialogResult属性值时,并没有调用窗体的Close方法,只是将窗体的Visible属性赋值为false,隐藏了窗体而已。这样隐藏的窗体是可以被重新显示的,且窗体资源并没有被释放。所以,在你真的不需要这个窗体时,一定要记得Dispose一下哦。

为了说明这一切,修改前面打开模态窗口的按钮Click事件代码。

private void button1_Click(object sender, EventArgs e)
{
Form frm1 = new Form();
frm1.Text = "我是模态窗口!";
frm1.ShowDialog();//打开模态窗口(对话框)
MessageBox.Show(frm1.DialogResult.ToString());
frm1.Visible = true;
}

代码执行情况是:
打开模态窗口后,关闭窗口,窗口隐藏,同时,弹出消息框,显示“Cancel”,接着,关闭消息框,模态窗口又被显示(frm1.Visible = true)。

原文地址:https://www.cnblogs.com/xiaohua19920/p/9836149.html

C#模态对话框和非模态对话框的更多相关文章

  1. MFC编程入门之十二(对话框:非模态对话框的创建及显示)

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

  2. VC++模态对话框和非模态对话框

    MFC中有两种类型的对话框:模态对话框和非模态对话框.  模态对话框是指当其显示时,程序会暂停执行,直到关闭这个模态对话框后,才能继续执行程序中其他任务.非模态对话框是指当其显示时,允许转而执行程序中 ...

  3. QT笔记之模态对话框及非模态对话框

    模态对话框(Modal Dialog)与非模态对话框(Modeless Dialog)的概念不是Qt所独有的,在各种不同的平台下都存在.又有叫法是称为模式对话框,无模式对话框等.所谓模态对话框就是在其 ...

  4. VS2010/MFC对话框:非模态对话框的创建及显示

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

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

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

  6. c#中的模态对话框和非模态对话框

    模态对话框弹出窗口阻止调用窗口的所有消息响应.只有在弹出窗口结束后调用窗口才能继续.在模态窗口“关闭”后,可以读取模态窗口中信息,包括窗口的返回状态,窗口子控件的值. 非模态对话框可以在弹出窗口和调用 ...

  7. VS2010/MFC编程入门之十二(对话框:非模态对话框的创建及显示)

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

  8. QT模态对话框及非模态对话框

    QT模态对话框及非模态对话框 模态对话框(Modal Dialog)与非模态对话框(Modeless Dialog)的概念不是Qt所独有的,在各种不同的平台下都存在.又有叫法是称为模式对话框,无模式对 ...

  9. VS2010-MFC(对话框:非模态对话框的创建及显示)

    转自:http://www.jizhuomi.com/software/162.html 前面已经说过,非模态对话框显示后,程序其他窗口仍能正常运行,可以响应用户输入,还可以相互切换.本节会将上一讲中 ...

随机推荐

  1. JavaScript 数组2—关联数组

    ㈠什么是关联数组 可以自定义下标名称的数组 ㈡为什么 索引数组中的数字下标没有明确的意义 ㈢何时 只希望每个元素都有专门的名称时 ㈣如何:2步 1)创建空数组 2)向空数组中添加新元素,并自定义下标名 ...

  2. JavaScript RegExp ——对象,语法,修饰符,方括号,元字符,量词,对象方法,对象属性

    ㈠RegExp 对象 正则表达式是描述字符模式的对象. 正则表达式用于对字符串模式匹配及检索替换,是对字符串执行模式匹配的强大工具. ㈡语法 var patt=new RegExp(pattern,m ...

  3. python 数据库插入操作

    数据库插入操作 以下实例使用执行 SQL INSERT 语句向表 EMPLOYEE 插入记录: #!/usr/bin/python # -*- coding: UTF-8 -*- import MyS ...

  4. BZOJ 1212: [HNOI2004]L语言 trie

    长度小于 10 是关键信息~ #include <cstdio> #include <cstring> #include <algorithm> #define N ...

  5. Travis CI Could not find or load main class org.gradle.wrapper.GradleWrapperMain 错误

    问题 在 Travis CI 编译的时候出现 Error: Could not find or load main class org.gradle.wrapper.GradleWrapperMain ...

  6. scala实战学习-快速排序

    def qSort(a:List[Int]):List[Int]={ if(a.length < 2) a else qSort(a.filter(a.head > _)) ++ a.fi ...

  7. [CSP-S模拟测试]:Cover(单调栈++单调队列+DP)

    题目传送门(内部题126) 输入格式 第一行两个个整数$n,m$表示区间的长度与彩灯的数量. 接下来$m$行,每行三个整数$l_i,r_i,a_i$表示一条彩灯能够覆盖的区间以及它的美观程度. 输出格 ...

  8. 第3周Java编程总结

    1.打印输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其中各位数字立方和等于该数本身.例如,153是一个“水仙花数”. 2. 编写Java程序,求13-23+33-43+…+973-983+ ...

  9. gromacs2018使用踩坑记--grompp 为啥要用-r

    1. GMX grompp 概要 gmx grompp [ -f [<.mdp>] ] [ -c [<.gro / .g96 / ...>] ] [ -r [<.gro ...

  10. leetcode 64. 最小路径和Minimum Path Sum

    很典型的动态规划题目 C++解法一:空间复杂度n2 class Solution { public: int minPathSum(vector<vector<int>>&am ...