• [转]WinForm下Splash(启动画面)制作


    本文转自:http://www.smartgz.com/blog/Article/1088.asp 

    原文如下:

        本代码可以依据主程序加载进度来显示Splash。

        static class Program
        {
            /// <summary>
            /// 主程序的入口点在此设置,包括一些初始化操作,启动窗体等
            /// </summary>
            private static ApplicationContext context;
            [STAThread]      
            static void Main()
            {
                Application.EnableVisualStyles();                       //样式设置
                Application.SetCompatibleTextRenderingDefault(false);   //样式设置
                Splash sp = new Splash();                               //启动窗体
                sp.Show();                                              //显示启动窗体
                context = new ApplicationContext();
                context.Tag = sp;
                Application.Idle += new EventHandler(Application_Idle); //注册程序运行空闲去执行主程序窗体相应初始化代码
                Application.Run(context);
            }
    
    
    
            //初始化等待处理函数
            private static void Application_Idle(object sender, EventArgs e)
            {
                Application.Idle -= new EventHandler(Application_Idle);
                if (context.MainForm == null)
                {
                    Main mw = new Main();
                    context.MainForm =mw;
                    mw.init();                                  //主窗体要做的初始化事情在这里,该方法在主窗体里应该申明为public
                    Splash sp = (Splash)context.Tag;
                    sp.Close();                                 //关闭启动窗体 
                    mw.Show();                                  //启动主程序窗体
                }
            }
        }

            Splash窗体的相关属性设置:
            BackgroundImage:载入你想作为启动画面的图片;
            ControlBox:False;
            FormBorderStyle:None;
            ShowInTaskbar:False;
            StartPositon:CenterScreen.

    [转] 
    http://www.lordong.cn/blog/post/18.html 
    当程序在启动过程中需要花一些时间去加载资源时,我们希望程序能显示一个欢迎界面,能简单介绍软件功能的同时还能告知用户该程序还在加载中,使得用户体验更友好。 
    实现如下: 

    1. 添加欢迎界面的窗体(比如SlpashForm),做以下调整: 
    将FormBorderStyle属性设成None,即没有窗体边框 
    将StartPosition属性设成CenterScreen,即总是居中 
    将TopMost属性设成True,即总是在顶部 
    将UseWaitCursor属性设成Ture,即显示等待光标,让人感觉后台还在运行 
    增加一个PictureBox控件,与欢迎图片大小一致,窗体的大小也设成一致 
    增加一个ProgressBar控件,将Style设成Marquee,将MarqueeAnimationSpeed设成50 

    2. 主界面的构造函数改成以下代码: 

    // Create thread to show splash window 
    Thread showSplashThread = new Thread(new ThreadStart(ShowSplash)); 
    showSplashThread.Start(); 
    
    // Time consumed here 
    InitializeFrame(); // 把原来构造函数中的所有代码移到该函数中 
    
    // Abort show splash thread 
    showSplashThread.Abort(); 
    showSplashThread.Join(); // Wait until the thread aborted 
    showSplashThread = null; 
    
    3. 显示SplashForm的线程函数 
    /// 
    /// Thread to show the splash. 
    /// 
    private void ShowSplash() 
    { 
    SplashForm sForm = null; 
    try 
    { 
    sForm = new SplashForm(); 
    sForm.ShowDialog(); 
    } 
    catch (ThreadAbortException e) 
    { 
    // Thread was aborted normally 
    if (_log.IsDebugEnabled) 
    { 
    _log.Debug("Splash window was aborted normally: " + e.Message); 
    } 
    } 
    finally 
    { 
    sForm = null; 
    } 
    } 


    4. 在主窗体的Load事件加激活自己的代码 
    SetForegroundWindow(Process.GetCurrentProcess().MainWindowHandle); 

    在使用SetForegroundWindow之前先声明一下 
    // Uses to active the exist window 
    [DllImport("User32.dll")] 
    public static extern void SetForegroundWindow(IntPtr hwnd);   


    http://www.cnblogs.com/hcfalan/archive/2006/09/13/502730.html

    对于需要加载很多组件的应用程序来说,在启动的时候会非常的缓慢,可能会让用户误以为程序已经死掉,这显然不是我们希望看到的。如果能够在启动的时候动态的给用户一些反馈信息(比如当前正在加载的项),那么就可以有效的避免这一问题,并且可以给我们的应用程序增色不少。下边的图片是此代码的效果图。
     
    下面是部分代码:
    AppStart 类,包含Main方法
    public class AppStart
    {
        public AppStart()
        {
        }
        [STAThread]
        static void Main(string[] args)
        {
            //    显示Splash窗体
            Splash.Show();
    
            DoStartup(args);
    
            //    关闭Splash窗体
            Splash.Close();
        }
    
        static void DoStartup(string[] args)
        {
            //    做需要的事情
            frmMain f = new frmMain();
            Application.Run(f);
        }
    }

    Splash功能类:
    public class Splash
    {
        static frmSplash MySplashForm = null;
        static Thread MySplashThread = null;
    
        static void ShowThread() 
        {
            MySplashForm = new frmSplash();
            Application.Run(MySplashForm);
        }
    
        static public void Show() 
        {
            if (MySplashThread != null)
                return;
    
            MySplashThread = new Thread(new ThreadStart(Splash.ShowThread));
            MySplashThread.IsBackground = true;
            MySplashThread.ApartmentState = ApartmentState.STA;
            MySplashThread.Start();
        }
    
        static public void Close() 
        {
            if (MySplashThread == null) return;
            if (MySplashForm == null) return;
    
            try 
            {
                MySplashForm.Invoke(new MethodInvoker(MySplashForm.Close));
            }
            catch (Exception) 
            {
            }
            MySplashThread = null;
            MySplashForm = null;
        }
    
        static public string Status 
        {
            set 
            {
                if (MySplashForm == null) 
                {
                    return;
                }
    
                MySplashForm.StatusInfo = value;
            }
            get 
            {
                if (MySplashForm == null) 
                {
                    throw new InvalidOperationException("Splash Form not on screen");
                }
                return MySplashForm.StatusInfo;
            }
        }
    }

    Splash 界面类:

    public class frmSplash : System.Windows.Forms.Form
    {
        private string _StatusInfo = "";
        
        public frmSplash()
        {
            InitializeComponent();
        }
    
        private void InitializeComponent()
        {
            // 
            this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image")));        
            //
    
        }
    
        public string StatusInfo 
        {
            set 
            {
                _StatusInfo = value;
                ChangeStatusText();
            }
            get 
            {
                return _StatusInfo;
            }
        }
    
        public void ChangeStatusText() 
        {
            try 
            {
                if (this.InvokeRequired) 
                {
                    this.Invoke(new MethodInvoker(this.ChangeStatusText));
                    return;
                }
    
                labStatus.Text = _StatusInfo;
            }
            catch (Exception e) 
            {
                //    异常处理
            }
        }
    }

    主界面类:

    public class frmMain : System.Windows.Forms.Form
    {
        public frmMain()
        {
            InitializeComponent();
    
        Splash.Status = "状态:载入初始化模块";
                System.Threading.Thread.Sleep(1000);
                
        Splash.Status = "状态:载入管理模块";
                System.Threading.Thread.Sleep(1000);
    
        Splash.Status = "状态:载入打印模块";
                System.Threading.Thread.Sleep(1000);
    
        Splash.Status = "状态:载入插件模块";
                System.Threading.Thread.Sleep(1000);
    
        Splash.Status = "状态:连接数据库";
                System.Threading.Thread.Sleep(1000);
    
        Splash.Close();
        }
    }
  • 相关阅读:
    Tencent 闲聊对话机器人接口调用,画像:设计员小白
    logging模块简介python
    jieba分词的几种形式
    h5py这个坑-PyCharm Process finished with exit code -1073741819 (0xC0000005)
    python之six模块的用法six.py2 six.py3
    Swoole从入门到入土(8)——协程初探
    Swoole从入门到入土(7)——TCP服务器[大杂烩]
    Swoole从入门到入土(6)——TCP服务器[粘包]
    Swoole从入门到入土(5)——TCP服务器[异步任务]
    Swoole从入门到入土(4)——TCP服务器[正确重启]
  • 原文地址:https://www.cnblogs.com/lxGIS/p/3729190.html
Copyright © 2020-2023  润新知