WinForm程序启动时不显示主窗体的实现方法

简介:

望程序启动时不显示主窗体,而只是在SystemTray显示一个图标;当用户点击该图标时,才第一次显示出主窗体来。

作者在文章中已经说得很清楚,将Form的Visible属性设置为false是不行的,因为在Application.Run方法的内部,主窗体的Visible属性将被强制设置为true。
此外,有朋友在回复中提供了“不启动任何窗体”的办法,即:

using (new MainForm())
{
Application.Run();
}

然后在NotifyIcon的Click事件中显示MainForm就可以了。
可以参考他的文章( http://ly4cn.cnblogs.com/archive/2006/03/16/351205.html)。

这个方法的确是解决了这个问题;但是由于切断了主窗体和Application之间的联系,因此必须使用Application.Exit来关闭程序。这样做仍然有些不自然,且有一些安全隐患;那么到底有没有更好的方法呢?

一个方法就是使用ApplicationContext。

ApplicationContext实质上就是一个Application与主窗体之间的连接器,掌管着二者之间的互动关系。
其中最主要的,就是负责在主窗体关闭时结束线程。既然如此,我们只要根据需要自定义一个ApplicationContext就可以了:

internal class HideOnStartupApplicationContext : ApplicationContext
{
private
Form mainFormInternal;

// 构造函数,主窗体被存储在mainFormInternal
public
HideOnStartupApplicationContext(Form mainForm)
{
this.mainFormInternal =
mainForm;

this.mainFormInternal.Closed += new
EventHandler(mainFormInternal_Closed);
}

// 当主窗体被关闭时,退出应用程序
void mainFormInternal_Closed(object
sender, EventArgs e)
{
Application.Exit();
}
}

随后,我们只需要在Main当中像下面这样调用既可:

static void Main()
{
//...


HideOnStartupApplicationContext context = new HideOnStartupApplicationContext(new MainForm());
Application.Run(context);
}

这样,MainForm根本不用去考虑窗口与应用程序的关系,安安心心做它的“主窗口”就可以了。

此外,既然明白了ApplicationContext掌管着窗口结束与程序结束的关系,我们就可以用它来做出一些有趣的东西:
比如MSDN上就给出了一个“双主窗口”——同时显示2个Form,关闭其中任何一个都不会导致程序结束,只有全部关闭了才会结束程序。有兴趣的朋友可以参看MSDN关于ApplicationContext的资料,那里给出了详细的说明和范例代码。
再如,要设计一个“向导(Wizard)”类的程序,使用ApplicationContext也是最佳选择——它可以轻松控制Form到Form的流程,以及Form的启动与关闭,使得你的每个Form更加模块化,减少Form之间的依赖。



本文转自94cool博客园博客,原文链接:http://www.cnblogs.com/94cool/archive/2010/01/05/1639905.html,如需转载请自行联系原作者 
相关文章
|
27天前
|
设计模式 程序员 C#
C# 使用 WinForm MDI 模式管理多个子窗体程序的详细步骤
WinForm MDI 模式就像是有超能力一般,让多个子窗体井然有序地排列在一个主窗体之下,既美观又实用。不过,也要小心管理好子窗体们的生命周期哦,否则一不小心就会出现一些意想不到的小bug
|
IDE 编译器 开发工具
问题:窗体在运行时显示,在解决方案管理器中不显示
小引: 虽然我知道实现《机房收费管理系统》会遇见各种问题,但是碰到这么狗血的问题,我真是大姑娘上花轿——头一回!
|
区块链 C#
C# 窗体修改应用程序图标
C# 窗体修改应用程序图标
380 0
C# 窗体修改应用程序图标
|
C#
WinForm关闭主窗体后,仍然有后台进程运行。
WinForm关闭主窗体后,仍然有后台进程运行。
409 0
在C#中设置窗体最前,并且如果不关掉这个窗体,就不能操作其余的控件
窗口名 新窗口名 = new 窗口名();新窗口名.ShowDialog();
479 0
|
C# C++
获取当前进程(程序)主窗体句柄并设置wpf的父窗体为此句柄
原文:获取当前进程(程序)主窗体句柄并设置wpf的父窗体为此句柄 有时候在c++调用wpf控件的时候,wpf控件想自己显示窗体,但需要设置owner属性。迂回解决办法是设置wpf的window窗体的父窗体为进程的句柄。
3106 0