我们在想关闭一些程序的时候,首先考虑的就是点击程序右上角的'X'或者'ok'来退出程序(有些程序会在Form或者Menu里提供退出程序的方式),但是.NET CF在处理'X'和'ok'时的做法是,点击'X'后程序窗体不显示而只是最小化,但是程序依然在运行;点击'ok'则默认调用this.close();
可是,许多用户习惯了PC的操作习惯,认为点了'X'后就退出了程序,其实不然。但是开发者仍然可以做一些处理来做到点击'X'后完全退出程序。
下面看一下程序启动和退出的例子,借此来说明程序的启动顺序和退出顺序!
启动和退出程序Order code
public Form1()
{
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
2 - OnLoad
3 - Form1_Load
4 - OnActivated
5 - Form1_Activated
|
我们可以知道程序启动按照“构造函数 - Load - Activated”的顺序进行。
2. 再看当点击'X'号后的退出顺序:
1 - Form1 Constructor
2 - OnLoad
3 - Form1_Load
4 - OnActivated
5 - Form1_Activated
6 - OnDeactivate
7 - Form1_Deactivate
|
可以得到点击'X'号的退出顺序为"Deactivate",但是却没有进入OnClosing和OnClosed中,由此我们也就明白了为什么在最初点击'X'号后程序并不退出的原因了。那么,该怎么处理呢,很简单,由于在点'X'号后程序进入Deactivate,因此,我们在OnDeactivate或Form1_Deactivate中调用this.close()就能进入到OnClosing和OnClosed中了,然后在OnClosing和OnClosed中做一些退出处理,就是这样!
3. 点击'ok'后的退出顺序
1 - Form1 Constructor
2 - OnLoad
3 - Form1_Load
4 - OnActivated
5 - Form1_Activated
6 - OnClosing
7 - Form1_Closing
8 - OnClosed
9 - Form1_Closed
10 - OnDeactivate
11 - Form1_Deactivate
|
呵呵,果然如此,点击'ok'后果然比点击'X'后多了OnClosing和OnClosed的处理。
__________
相信通过上面的说明,再加上您自己的单步调试,你对程序加载和退出的机制已经明白了。
OK,就到这里!
Good Luck!
--------------------------------------------------
李森 – listen
E-mail: lisencool@gmail.com
|
声明:
这里集中了在WinCE和Windows Mobile开发中的一些基本常识。我很乐意和大家分享,也希望大家提出意见,并给我投稿,我会第一时间替您发表并署上您的大名!
Announce:
Here collects general knowledge on WinCE and Windows mobile. I 'm very glad to share them with all friends, and also hope you can share your problems and opinions and contribute articles to me to share with others. I'll publish your articles and sign your name at the first time.
|