zoukankan      html  css  js  c++  java
  • WinForm下Splash(启动画面)制作

    原文如下:

        本代码可以依据主程序加载进度来显示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);   


    对于需要加载很多组件的应用程序来说,在启动的时候会非常的缓慢,可能会让用户误以为程序已经死掉,这显然不是我们希望看到的。如果能够在启动的时候动态的给用户一些反馈信息(比如当前正在加载的项),那么就可以有效的避免这一问题,并且可以给我们的应用程序增色不少。下边的图片是此代码的效果图。
     
    下面是部分代码:
    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 == nullreturn;
            
    if (MySplashForm == nullreturn;

            
    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();
        }

    }
  • 相关阅读:
    同样的请求img代码,单个html文件和项目中的html文件请求结果不一样
    CSS中A标签断字不换行问题(基础知识)
    句柄无效。 (异常来自 HRESULT:0x80070006 (E_HANDLE))
    Ext.Net 控件FileUploadField上传文件
    500内部服务器错误。你查找的资源存在问题,因而无法显示
    WebService 错误:无法加载协定为xxx的终结点配置部分,因为找到了该协定的多个终结点配置
    SyntaxError: unterminated string literal
    servlet入门
    myeclipse视图布局恢复
    JavaWEB开发入门
  • 原文地址:https://www.cnblogs.com/top5/p/1709815.html
Copyright © 2011-2022 走看看