我们在想关闭一些程序的时候,首先考虑的就是点击程序右上角的'X'或者'ok'来退出程序(有些程序会在Form或者Menu里提供退出程序的方式),但是.NET CF在处理'X'和'ok'时的做法是,点击'X'后程序窗体不显示而只是最小化,但是程序依然在运行;点击'ok'则默认调用this.close();
{
InitializeComponent();
ShowDebug("Form1 Constructor");
}
// 标记启动和退出的顺序
private int m_index = 0;
private void Form1_Load(object sender, EventArgs e)
{
ShowDebug("Form1_Load");
}
private void Form1_Closing(object sender, CancelEventArgs e)
{
ShowDebug("Form1_Closing");
}
private void Form1_Closed(object sender, EventArgs e)
{
ShowDebug("Form1_Closed");
}
private void Form1_Activated(object sender, EventArgs e)
{
ShowDebug("Form1_Activated");
}
private void Form1_Deactivate(object sender, EventArgs e)
{
ShowDebug("Form1_Deactivate");
}
protected override void OnLoad(EventArgs e)
{
ShowDebug("OnLoad");
base.OnLoad(e);
}
protected override void OnClosing(CancelEventArgs e)
{
ShowDebug("OnClosing");
base.OnClosing(e);
}
protected override void OnClosed(EventArgs e)
{
ShowDebug("OnClosed");
base.OnClosed(e);
}
protected override void OnActivated(EventArgs e)
{
ShowDebug("OnActivated");
base.OnActivated(e);
}
protected override void OnDeactivate(EventArgs e)
{
ShowDebug("OnDeactivate");
base.OnDeactivate(e);
}
private void ShowDebug(string funcName)
{
System.Diagnostics.Debug.WriteLine((++m_index).ToString() + " - " + funcName);
}
注意:
在说明这个之前,我想说下Form1_Load和OnLoad的区别:基类中的OnLoad函数会引发事件调用Form1_Load。如果你重写OnLoad函数(不调用base.OnLoad(e);而是定义自己在程序加载时的操作),那么基类中引发事件的代码就不会被执行,也就是说Form1_Load将不会被执行。
其他几个对应的函数同理。
1. 首先看程序启动的顺序:
|
1 - Form1 Constructor |
我们可以知道程序启动按照“构造函数 - Load - Activated”的顺序进行。
2. 再看当点击'X'号后的退出顺序:
|
1 - Form1 Constructor |
可以得到点击'X'号的退出顺序为"Deactivate",但是却没有进入OnClosing和OnClosed中,由此我们也就明白了为什么在最初点击'X'号后程序并不退出的原因了。那么,该怎么处理呢,很简单,由于在点'X'号后程序进入Deactivate,因此,我们在OnDeactivate或Form1_Deactivate中调用this.close()就能进入到OnClosing和OnClosed中了,然后在OnClosing和OnClosed中做一些退出处理,就是这样!
|
1 - Form1 Constructor |
--------------------------------------------------
|
李森 – listen |
|
声明: Announce: |