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

原文地址:http://www.cnblogs.com/smalldust/articles/361807.html

 

曾经在一个月前看过一篇文章(http://gamix.cnblogs.com/archive/2006/03/10/347354.html),其中作者希望程序启动时不显示主窗体,而只是在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之间的依赖。

转载于:https://www.cnblogs.com/Yjianyong/archive/2010/07/14/1777320.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值