WinForm界面开发之 启动界面

我们在开发桌面应用程序的时候,由于程序启动比较慢,往往为了提高用户的体验,增加一个闪屏,也就是SplashScreen,好处有:1、让用户看到加载的过程,提高程序的交互响应;2.可以简短展示或者介绍程序的功能或者展示Logo,给客户较深的印象。

本人在开发的共享软件中,对于启动比较慢的程序,也倾向于引入这个控件来展示下,先看看软件启动的时候的效果

中间的那些文字“正在初始化应用程序......”可以根据加载的进度显示不同的内容,当然最好简单扼要了,其他的内容你也可以视需要做相应变化,因为这个是一个Form,你想改变什么就改变什么的。

看看闪屏代码如何使用先,首先我们在入口的Main函数中开始

    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            //登陆界面
            FrmLogin dlg = new FrmLogin();
            dlg.StartPosition = FormStartPosition.CenterScreen;
            if (DialogResult.OK == dlg.ShowDialog())
            {

                   SplashScreen.Splasher.Show(typeof(SplashScreen.FrmSplashScreen));

                  Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
                  Application.Run(new FrmMain());
            }

        }

        private static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs ex)
        {
            //LogHelper.Error(ex.Exception);

            string message = string.Format("{0}\r\n操作发生错误,您需要退出系统么?", ex.Exception.Message);
            if (DialogResult.Yes ==MessageBox.Show(message,"系统错误",MessageBoxButtons.YesNo))
            {
                Application.Exit();
            }
        }
    }

上面代码中:SplashScreen.Splasher.Show(typeof(SplashScreen.frmSplash));主要为启动闪屏类代码,

其中 Splasher 这个类当中使用后台线程,反射来实例化窗体,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Reflection;

namespace SplashScreen
{
    public class Splasher
    {
        private static Form m_SplashForm = null;
        private static ISplashForm m_SplashInterface = null;
        private static Thread m_SplashThread = null;
        private static string m_TempStatus = string.Empty;

        /// <summary>
        /// Show the SplashForm
        /// </summary>
        public static void Show(Type splashFormType)
        {
            if (m_SplashThread != null)
                return;
            if (splashFormType == null)
            {
                throw (new Exception("splashFormType is null"));
            }

            m_SplashThread = new Thread(new ThreadStart(delegate()
            {
                CreateInstance(splashFormType);
                Application.Run(m_SplashForm);
            }));

            m_SplashThread.IsBackground = true;
            m_SplashThread.SetApartmentState(ApartmentState.STA);
            m_SplashThread.Start();
        }

        /// <summary>
        /// set the loading Status
        /// </summary>
        public static string Status
        {
            set
            {
                if (m_SplashInterface == null || m_SplashForm == null)
                {
                    m_TempStatus = value;
                    return;
                }

                m_SplashForm.Invoke(
                        new SplashStatusChangedHandle(delegate(string str) { m_SplashInterface.SetStatusInfo(str); }),
                        new object[] { value }
                    );
            }

        }

        /// <summary>
        /// Colse the SplashForm
        /// </summary>
        public static void Close()
        {
            if (m_SplashThread == null || m_SplashForm == null) return;

            try
            {
                m_SplashForm.Invoke(new MethodInvoker(m_SplashForm.Close));
            }
            catch (Exception)
            {
            }
            m_SplashThread = null;
            m_SplashForm = null;
        }

        private static void CreateInstance(Type FormType)
        {

            //利用反射创建对象
            object obj = Activator.CreateInstance(FormType);

            m_SplashForm = obj as Form;
            m_SplashInterface = obj as ISplashForm;
            if (m_SplashForm == null)
            {
                throw (new Exception("Splash Screen must inherit from System.Windows.Forms.Form"));
            }
            if (m_SplashInterface == null)
            {
                throw (new Exception("must implement interface ISplashForm"));
            }

            if (!string.IsNullOrEmpty(m_TempStatus))
                m_SplashInterface.SetStatusInfo(m_TempStatus);
        }

        private delegate void SplashStatusChangedHandle(string NewStatusInfo);

    }
}

为了增加启动界面的说明,在启动界面上增加了一个文字接口,可以在外部来修改启动界面上的说明:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SplashScreen
{
    /// <summary>
    /// interface for Splash Screen
    /// </summary>
    public interface ISplashForm
    {
        void SetStatusInfo(string NewStatusInfo);
    }
}

然手在闪屏的窗体上继承接口,并实现相关的接口代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace SplashScreen
{
    public partial class FrmSplashScreen : Form,ISplashForm
    {
        public FrmSplashScreen()
        {
            InitializeComponent();
        }

        //实现接口方法,主要用于接口的反射调用
        #region ISplashForm

        void ISplashForm.SetStatusInfo(string NewStatusInfo)
        {
            lbStatusInfo.Text = NewStatusInfo;
        }

        #endregion
    }
}

然后程序在点击“登录”按钮后,就可以在主界面上做闪屏界面等待了,frmMain窗体代码:

namespace SplashScreen
{
    public partial class FrmMain : Form
    {
        public FrmMain()
        {
            InitializeComponent();

            System.Threading.Thread.Sleep(800);
            Splasher.Status = "正在展示相关的内容......";
            System.Threading.Thread.Sleep(800);

            //.......此处加载耗时的代码

            Splasher.Status = "初始化完毕............";
            System.Threading.Thread.Sleep(800);

            Splasher.Close();

        }
    }
}
时间: 2024-11-05 11:36:57

WinForm界面开发之 启动界面的相关文章

简单进入启动界面或非启动界面

1.利用从特定的路径中取出字典的返回BOOL值来进行判断. //获取plist文件的地址,为空 NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/d.plist"]; //根据文件创建字典 NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:path]; //取出字典的值,这里没有,为false BOOL

App启动界面效果设计

转载请标明出处:http://blog.csdn.net/u012637501/article/details/45746617 每个Android应用启动之后都会出现一个Splash启动界面,大多数的Splash界面都是会等待一定时间,然后切换到下一个界面.但如果app启动时间过长,可使用启动界面让用户耐心等待这段枯燥的时间.Splash界面一般用于显示产品的LOGO.产品名称.版本信息等,也可以完成对系统状况的检测,如网络是否连通.电源是否充足.检测新版本等,也可以预先加载相关数据.启动界面

WinForm界面开发之布局控件&quot;WeifenLuo.WinFormsUI.Docking&quot;的使用

http://www.cnblogs.com/wuhuacong/archive/2009/07/09/1520082.html 本篇介绍Winform程序开发中的布局界面的设计,介绍如何在我的共享软件中使用布局控件"WeifenLuo.WinFormsUI.Docking". 布局控件"WeifenLuo.WinFormsUI.Docking"是一个非常棒的开源控件,用过的人都深有体会,该控件之强大.美观.不亚于商业控件.而且控件使用也是比较简单的.先看看控件使用

winform界面开发-HTML内容编辑控件

参照及推荐博客:伍华聪 http://www.cnblogs.com/wuhuacong/archive/2009/07/07/1518346.html http://www.cnblogs.com/wuhuacong/p/3560685.html 这篇文章介绍了作者软件的开发及成长历程,作者在十几年的开发历程中注重思考.总结.归纳和整理,形成了自己的开发风格,其中很多经验之处值得我们借鉴和学习,至少使我提前意识到软件开发成长历程中除了技术的熟练程度之外更应该注重的是开发思想.开发心得及开发思路

iOS开发之启动动画(动态欢迎界面,非静态Default)

最近在使用<青葱日记>这款App,发现它的启动界面做的很精美. 不同我自己之前简单的替换Default.png图片. 它的动态效果做的不错. 于是乎,花了点时间,自己实现了这个功能. 其实也很简单,具体效果如下 实现起来也不困难.因为我们知道,在应用启动的时候,它会先执行AppDelegate.m中的 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)la

简单java web实现界面开发

有关javaweb的一个简单的登陆界面开发 这里使用的工具是eclipse.sql 2016.tomcat8 开发前需要在eclipse中完成tomcat和SQL的连接配置,这里tomcat在web项目运行时会自动的启动,下边介绍开发步骤 一.web项目的建立 打开eclipse点解File->New->Dynamic Web Project 进入以下界面,输入项目名称 点击next 再点击next,进入下一界面 将箭头指向的位置选中,点击finish及完成Web项目的创建 三.数据库建表 打

Winform开发框架之Office Ribbon界面

在前面几篇文章介绍我的Winform框架随笔文章,包括有<Winform开发框架之字典数据管理>.<Winform开发框架之权限管理系统>.<Winform开发框架之终极应用>,其中Winform开发框架之终极应用是集众多功能与一身,提供综合一站式.整体性的传统应用系统的开发框架,在此基础上开发新的业务系统,开发工作则是事半功倍,而且提供了高效.统一的界面布局以及支持多种数据库的数据访问层支持,提供了基于大量数据的数据分页解决方案,提供了传统Excel报表以及自定义模板

Android基础之——startActivityForResult启动界面并返回数据,上传头像

在android应用的开发过程中,经常会出现启动一个界面后填写部分内容后带着数据返回启动前的界面,最典型的应用就是登录过程.在很多应用程序的模块中,都有"我的"这个模块,在未登录状态下点击其中的某一项,就会弹出登录界面,登录完成后回到我的界面,会显示一些登录后的数据,这个功能的实现就要用到startActivityForResult. 下面通过一个小demo来说明一下startActivityForResult的使用,以及在实际开发中的一些应用. demo的效果图如下: 主界面布局:

JAVA开发简易计算器界面-SWT

大家好,我是成都[LD],博客四年前就申请了,一直没打理,最近正好有时间,遂萌生了写技术博客的念头.我不得不感慨现在新技术更新很快,一不小心,就感觉自身就Out了.记得一年前,当时我也是在51CTO上了解到NoSQL和Hadoop这样的信息,当时就简单觉得很新奇,没想到一年之后发展如此迅速~~当然我这样说,并不是叫大家去追寻新技术,最根本的还是基础打牢靠,休息的时候多去了解下最新的IT动态.学习下前辈高手的一些技能~~打铁还需自身硬嘛! 我写博客的目的:一来是为了促进自身的进步,二来是为了希望与