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

非模态对话框
可以在弹出窗口和调用窗口之间随意切换。
调用窗口调用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/net-sky/p/10218976.html

c#中的模态对话框和非模态对话框相关推荐

  1. QT中的模态对话框及非模态对话框

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

  2. Qt中的模态对话框和非模态对话框

    模态对话框及非模态对话框(详情见课本P51). 模态对话框:在没有被关闭之前,用户不能与同一个应用程序的其他窗口进行交互,直到该对话框关闭. 非模态对话框:当被打开时,用户既可选择和该对话框进行交互, ...

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

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

  4. MFC中的模态对话框与非模态对话框的消息循环及消息传递问题(都可以通过SendMessage传递消息)

    注意:非模态和模态对话框都有自己的消息响应过程函数WindowPro,只不过他们的调用模态是自己的消息泵,非模态是由父窗体或父窗体的上一级的消息泵来调用.模态对话框和非模态对话框都可以通过SendMe ...

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

    MFC中对话框有两种形式,一个是模态对话框(model dialog box),一个是非模态对话框(modeless dialog box).二者的区别在于当对话框打开时,是否允许用户进行其他对象的操 ...

  6. 【VS开发】模态对话框和非模态对话框

    MFC中对话框有两种形式,一个是模态对话框(model dialog box),一个是非模态对话框(modeless dialog box). 一.模态对话框(model dialog box) 在程 ...

  7. 模态对话框和非模态对话框的消息循环分析

    1.非模态对话框和父窗口共享当前线程的消息循环 2.模态对话框新建一个新的消息循环,并由当前消息循环派发消息,而父窗口.模态对话框屏蔽了用户对它父窗口的操作,但是不是在消息循环里面屏蔽,所以给父窗口发 ...

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

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

  9. 小甲鱼 OllyDbg 教程系列 (十四) : 模态对话框 和 非模态对话框 之 URlegal 和 movgear

    小甲鱼 OD 使用教程:https://www.bilibili.com/video/av6889190?p=22 exeScope 下载:https://pan.baidu.com/s/1dSWap ...

最新文章

  1. 我们也可以从学习中获得快乐 ------稻盛和夫
  2. AI领域经典原创推荐,每一份坚持都值得被尊重
  3. 用好这个数据分析工具,BI平台建设少费一半力
  4. 从零开始写项目第八篇【将未完成的项目发布在Tomcat上】
  5. 「管理数学基础」4.3 模糊数学:模糊关系与模糊矩阵、模糊关系的运算与合成、模糊等价关系
  6. fscanf读出来的数字不正确_听了那么多数字英文儿歌,这位牛妈的做法却最能引导孩子输出!...
  7. IDL | 实验二、IDL语法基础
  8. 绿点 | 区块链介入下的绿色经济 x 妳格局LadyVision x WinMap+!
  9. 重心法例题matlab,重心法--例子.ppt
  10. Telink Mesh 开发(1)调试log打印
  11. 企业运维容器之 docker 安全
  12. 基于QQ空间热修复原理实践
  13. Zabbix 5.0 配置短信报警
  14. (待补)(递归)九连环问题*
  15. 我要写王者荣耀类游戏的网页代码
  16. qca9882 qca9880移植
  17. 学了代码之后,对于程序员黑客的区别,我的认识是......
  18. 创业赢利模式之一 鱼模式
  19. Open3d-Point cloud (点云)
  20. 关于读博的意义的一些感想

热门文章

  1. NumberUtils、ArrayUtils和RandomUtils工具类用法
  2. 说说 JAVA 代理模式
  3. Git与Repo入门
  4. SQL 注入详解扫盲
  5. mysql dba系统学习(21)mysql存储引擎InnoDB
  6. Python 异常处理 Python 基础教程 try..except
  7. 简明python教程 --C++程序员的视角(六):输入输出IO
  8. 图像处理(四)图像分割(2)测地距离Geodesic图割
  9. Sed教程(四):基本命令、特殊字符、字符串
  10. Python基础教程(二):基础语法、变量类型