C# Close 与 Closing 、OnClosing与Closed详解

有许多软件可以设置“关闭主面板时,最小化到系统托盘,不退出程序”。是通过重载程序自身的OnClosing来完成的。那么OnClosing是什么呢?

度娘了一下,发现涉及到的问题不仅仅是Closing本身。还有Close、Closed、Closing。。。。下面贴出来共享下知识:

首先是Form.Close,Close是一个方法,窗体可调用这个方法让自身关闭。

然后是OnClosing,我们可以通过重载OnClosing来实现窗体关闭前的某种处理。比如,通过重载OnClosing让窗体最小化。代码:

1 protected override void OnClosing(CanelEventArgs e)
2 {
3     e.Cancel = true;
4     this.WindowState = FormWindowState.Minimized;
5     Hide();
6 }

Form.Close方法大概是这样子的:

1 Form.Close()
2 {
3      OnClosing(this.e);
4       if(!e.Cancel)//默认为false,即这里是true
5       //关闭窗口
6 }

所以,没有经过Close函数就调用OnClosing函数是会照样关闭窗口的。因为你直接调用OnClosing方法根本就没调用Close()方法。

这样,当我们单击窗口右上角那个叉叉的时候,窗体首先调用Close方法,Close方法再调用OnClosing方法。而我们通过重载OnClosing方法,让程序不是退出,而是最小化到系统托盘区。

Form.Close引发OnClosing,OnClosing引发Closing和FormClosing.

但是在MSDN上声明,在 .NET Framework 版本 2.0 及其以后版本,Form.Closed与 Form.Closing 事件已过时,请改用 Form.FormCloseing 和 Form.FormClosed 事件。在这里介绍Closing只是为了扩充下知识。

然后是Form.FormClosing,语态是进行时。是在窗体关闭时,需要处理的事情,基本等同于前边的OnClosing方法。比如C#可以添加NotifyIcon控件,加入ICO图标。将窗体属性中的,ShowIntaskBar设置为false。

然后写窗体的Form.FormClosing事件。可以得到:

1 private void Form1_FormClosing(object sender, FormClosingEventArgs e)
2 {
3      e.Canel = true;//默认为FALSE,关闭窗体。true为不关闭。
4      this.WindowState = FormWindowState.Minimized;//窗体最小化。
5      Hide();
6 }

以后每次窗体关闭时,都自动最小化。又因为设置了ShowInstaskBar就不会在任务栏显示。但因为有了NotifyIcon,所以在系统托盘里可以看到自己的程序。

msdn上是这样解释的:

1)、在窗体关闭时,Form.FormClosing 事件发生。 窗体关闭时,此事件会得到处理,从而释放与此窗体关联的所有资源。 如果取消此事件,则该窗体保持打开状态。 若要取消窗体的关闭操作,请将传递给事件处理程序的 FormClosingEventArgs 的 Cancel 属性设置为 true。在显示为无模式窗口的 Form 上调用 Close 方法时,不能调用 Show 方法使窗体可见,因为窗体的资源已被释放。 若要隐藏窗体然后又使其可见,请使用 Hide 方法。

2)、如果窗体是多文档界面 (MDI) 父窗体,则在引发 MDI 父窗体的 FormClosing 事件之前将引发所有 MDI 子窗体的 FormClosing 事件。 同样,在引发 MDI 父窗体的FormClosed 事件之前,将引发所有 MDI 子窗体的 FormClosed 事件。 取消 MDI 子窗体的 FormClosing 事件不能防止引发 MDI 父窗体的 FormClosing 事件。 但是,取消该事件会将作为参数传递给父窗体的 FormClosingEventArgs 类的 Cancel 属性设置成 true。 要强制关闭所有 MDI 父窗体和子窗体,请将 MDI 父窗体中的 Cancel 属性设置成 false。

说白了,Form.FormClosing与OnClosing 的存在就是为了让我们有手段去阻止窗口的关闭。

 最后是Form.Closed方法:

在用户或Application类的Close方法或Exit方法关闭窗体后,会发生FormClosed事件。可以使用此事件释放窗体的一些资源。还可以使用此事件保存输入窗体中的一些信息或者更新父窗体。可以进行对窗体设置的保存啊,文件的保存啊,保存资源啊等等。

转载请注明 博客园 :http://www.cnblogs.com/gu-zhan/ 老咸出品

时间: 2024-12-30 04:22:52

C# Close 与 Closing 、OnClosing与Closed详解的相关文章

netstat状态详解

一.生产服务器netstat tcp连接状态................................................................................ 2 1.1生产服务器某个业务LVS负载均衡上连接状态数量............................................... 2 1.2生产服务器某个业务web上连接状态数量...............................................

TCP协议状态详解

原文出自:Vimer的程序世界 1.建立连接协议(三次握手)(1)客户端发送一个带SYN标志的TCP报文到服务器.这是三次握手过程中的报文1.(2) 服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN标志.因此它表示对刚才客户端SYN报文的回应:同时又标志SYN给客户端,询问客户端是否准备好进行数据通讯.(3) 客户必须再次回应服务段一个ACK报文,这是报文段3. 2.连接终止协议(四次握手) 由于TCP连接是全双工的,因此每个方向都必须单独进行关闭.这原则是当一

用netstat查看网络状态详解

--用netstat查看网络状态详解 -----------------------------2014/06/11 一.Linux服务器上11种网络连接状态:                                          图:TCP的状态机 通常情况下:一个正常的TCP连接,都会有三个阶段:1.TCP三次握手;2.数据传送;3.TCP四次挥手 注:以下说明最好能结合"图:TCP的状态机"来理解. SYN: (同步序列编号,Synchronize Sequence

netstat命令详解

1.netstat命令详解其实我常用的是 netstat -tnl | grep 443 (查看443端口是否被占用),如果有当前是root用户,我喜欢用netstat -pnl | grep 443 (还可显示出占用本机443端口的进程PID).netstat功能说明:显示网络状态.语 法:netstat [-acCeFghilMnNoprstuvVwx] [-A<网络类型>][--ip]补充说明:利用netstat指令可让你得知整个Linux系统的网络情况.参 数:-a   或–all  

SUBLIME TEXT 2 设置文件详解

SUBLIME TEXT 2 设置文件详解 Preferences.sublime-settings文件: // While you can edit this file, it’s best to put your changes in // “User/Preferences.sublime-settings”, which overrides the settings in here. // // Settings may also be placed in file type speci

Sublime Text 2配置文件详解

Sublime Text 2是那种让人会一眼就爱上的编辑器,不仅GUI让人眼前一亮,功能更是没的说,拓展性目前来说也完全够用了,网上介绍软件的文章和推荐插件的文章也不少,而且很不错,大家可以去找找自己需要的.而且 Linux 支持也做的非常好. 之前想设置什么都是直接在网上搜,但最近想调行距,这个把我给难住了,软件上的设置没找到,网上搜也没有,最后的最后在Sublime的官方论坛找到了,个人觉得行距还是很影响视觉体验的,看看下面的对比图就知道了: 看来想驾驭好这软件不弄清楚配置文件是不行了,周末

Python:file/file-like对象方法详解【单个文件读写】

IO中读写文件操作方法汇总!----The_Third_Wave的学习笔记! 本文由@The_Third_Wave(Blog地址:http://blog.csdn.net/zhanh1218)原创.不定期更新,有错误请指正. Sina微博关注:@The_Third_Wave 如果这篇博文对您有帮助,为了好的网络环境,不建议转载,建议收藏!如果您一定要转载,请带上后缀和本文地址. class file(object) |  file(name[, mode[, buffering]]) -> fi

TCP-IP协议、状态详解

今天对TCP-IP协议做一个简单总结.以便日后自己查看. 本文通过两个图来梳理TCP-IP协议相关知识.TCP通信过程包括三个步骤:建立TCP连接通道,传输数据,断开TCP连接通道. 如图1所示,给出了TCP通信过程的示意图. 图1主要包括三部分:建立连接.传输数据.断开连接 一.概述: 1)建立TCP连接很简单,通过三次握手便可建立连接. 2)建立好连接后,开始传输数据.TCP数据传输牵涉到的概念很多:超时重传.快速重传.流量控制.拥塞控制等等. 3)断开连接的过程也很简单,通过四次握手完成断

Linux netstat详解

做计算机管理员,我们都必要了解一下netstat这个命令,它是一个查看网络连接状态的工具,在windows下也默认有这个工具.Netstat命令详解 netstat命令怎样使用 如何关闭TIME_WAIT连接 如何统计web服务器的访问量 如果查看nginx的访问流量? 下面我们来看看它主要的用法和详解!(netstat -na 命令),本文主要是说Linux下的netstat工具,然后详细说明一下各种网络连接状态.netstat -nat |awk ‘{print $6}’|sort|uniq