天天看点

在应用程序中使用启动屏幕和登陆窗口

在应用程序中使用启动屏幕和登陆窗口

    在winform应用程序开发中,我们通常习惯于将系统的初始化代码(例如:读取配置文件、实例化持久数据层、设置主窗体界面)写在主窗体的构造函数或其OnLoad事件中,如果这些系统初始化代码的运行需要较长一段时间的话,就需要设置一个启动屏幕随时显示系统当前正在执行的操作以增强用户体验;另外,某些情况下你的系统可能需要用户输入密码方可正常使用,那么如何处理登陆窗口和系统主窗体的关系呢?本文将这两个知识点以实例的方式做了一下演示,希望对初学者能有所帮助。

准备工作

1、打开vs2005,创建一个名为“SplashScreen”的windows应用程序项目(C#)

2、删除自动生成的 Form1.cs并添加一个名为frmMain.cs的windows窗体

3、修改应用程序的主入口static void Main()函数中Application.Run(new Form1());为Application.Run(new frmMain());

一、编写启动屏幕的核心代码

    首先创建一个名为ISplashForm的接口,该接口包含一个名为SetStatusInfo的方法以用来在启动屏幕上设置系统加载状态,代码如下:

在应用程序中使用启动屏幕和登陆窗口

     public   interface  ISplashForm

在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口

{

在应用程序中使用启动屏幕和登陆窗口

        void SetStatusInfo(string NewStatusInfo);

在应用程序中使用启动屏幕和登陆窗口

    }

    接着创建一个名为Splasher的类,该类包含Show、 Close 两个静态方法以显示、关闭启动屏幕,另外还有一个名为Status的只读属性,最终代码如下:

在应用程序中使用启动屏幕和登陆窗口

     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>

在应用程序中使用启动屏幕和登陆窗口

        /// 显示启动画面

在应用程序中使用启动屏幕和登陆窗口

        /// </summary>

在应用程序中使用启动屏幕和登陆窗口

        public static void Show(Type splashFormType)

在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口

{

在应用程序中使用启动屏幕和登陆窗口

            if (m_SplashThread != null)

在应用程序中使用启动屏幕和登陆窗口

                return;

在应用程序中使用启动屏幕和登陆窗口

            if (splashFormType == null)

在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口

{

在应用程序中使用启动屏幕和登陆窗口

                throw (new Exception("必须设置启动窗体"));

在应用程序中使用启动屏幕和登陆窗口

            }

在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口

            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>

在应用程序中使用启动屏幕和登陆窗口

        /// 设置加载信息

在应用程序中使用启动屏幕和登陆窗口

        /// </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>

在应用程序中使用启动屏幕和登陆窗口

        /// 关闭启动画面

在应用程序中使用启动屏幕和登陆窗口

        /// </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 = FormType.InvokeMember(null,

在应用程序中使用启动屏幕和登陆窗口

                                BindingFlags.DeclaredOnly |

在应用程序中使用启动屏幕和登陆窗口

                                BindingFlags.Public | BindingFlags.NonPublic |

在应用程序中使用启动屏幕和登陆窗口

                                BindingFlags.Instance | BindingFlags.CreateInstance, null, null, null);

在应用程序中使用启动屏幕和登陆窗口

            m_SplashForm = obj as Form;

在应用程序中使用启动屏幕和登陆窗口

            m_SplashInterface = obj as ISplashForm;

在应用程序中使用启动屏幕和登陆窗口

            if (m_SplashForm == null)

在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口

{

在应用程序中使用启动屏幕和登陆窗口

                throw (new Exception("启动窗体类型必须是System.Windows.Forms.Form的子类"));

在应用程序中使用启动屏幕和登陆窗口

            }

在应用程序中使用启动屏幕和登陆窗口

            if (m_SplashInterface == null)

在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口

{

在应用程序中使用启动屏幕和登陆窗口

                throw (new Exception("启动窗体必须实现ISplashForm接口"));

在应用程序中使用启动屏幕和登陆窗口

            }

在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口

            if (!string.IsNullOrEmpty(m_TempStatus))

在应用程序中使用启动屏幕和登陆窗口

                m_SplashInterface.SetStatusInfo(m_TempStatus);

在应用程序中使用启动屏幕和登陆窗口

        }

在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口

        private delegate void SplashStatusChangedHandle(string NewStatusInfo);

在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口

    }

在应用程序中使用启动屏幕和登陆窗口

二、创建启动屏幕

    在项目中添加一个名为frmSplash.cs的windows窗体,设置该窗体的StartPosition属性为CenterScreen,TopMost属性为true,FormBorderStyle属性为None;为窗体选择一个合适的背景图片(临时先随便找个差不多大小的就可以)并设置窗体的大小与图片大小一致。拖动一个Label到frmSplash窗体上一个合适位置,并更名为lbStatusInfo,切换到代码视图实现ISplashForm接口,关键代码如下:

在应用程序中使用启动屏幕和登陆窗口

public  partial  class  frmSplash : Form,ISplashForm

在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口

{

在应用程序中使用启动屏幕和登陆窗口

        public frmSplash()

在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口

{

在应用程序中使用启动屏幕和登陆窗口

            InitializeComponent();

在应用程序中使用启动屏幕和登陆窗口

        }

在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口

        ISplashForm 成员#region ISplashForm 成员

在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口

        void ISplashForm.SetStatusInfo(string NewStatusInfo)

在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口

{

在应用程序中使用启动屏幕和登陆窗口

            lbStatusInfo.Text = NewStatusInfo;

在应用程序中使用启动屏幕和登陆窗口

        }

在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口

        #endregion

在应用程序中使用启动屏幕和登陆窗口

    }

三、启动屏幕演示的最后工作

    调整主窗体frmMain.cs的WindowState属性为Maximized,并修改其构造函数如下:

在应用程序中使用启动屏幕和登陆窗口

public  frmMain()

在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口

{

在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口

            Splasher.Status = "正在创建主窗体

在应用程序中使用启动屏幕和登陆窗口

";

在应用程序中使用启动屏幕和登陆窗口

            System.Threading.Thread.Sleep(1000);

在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口

            InitializeComponent();

在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口

            Splasher.Status = "正在读取配置文件

在应用程序中使用启动屏幕和登陆窗口

";

在应用程序中使用启动屏幕和登陆窗口

            System.Threading.Thread.Sleep(1500);

在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口

            Splasher.Status = "正在安装系统插件

在应用程序中使用启动屏幕和登陆窗口

";

在应用程序中使用启动屏幕和登陆窗口

            System.Threading.Thread.Sleep(1500);

在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口

            Splasher.Status = "再休眠1秒钟

在应用程序中使用启动屏幕和登陆窗口

";

在应用程序中使用启动屏幕和登陆窗口

            System.Threading.Thread.Sleep(1000);

在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口

            Splasher.Close();

在应用程序中使用启动屏幕和登陆窗口

        }

在应用程序中使用启动屏幕和登陆窗口

    修改应用程序的主入口static void Main()函数如下:

在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口

        [STAThread]

在应用程序中使用启动屏幕和登陆窗口

         static   void  Main()

在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口

{

在应用程序中使用启动屏幕和登陆窗口

            Application.EnableVisualStyles();

在应用程序中使用启动屏幕和登陆窗口

            Application.SetCompatibleTextRenderingDefault(false);

在应用程序中使用启动屏幕和登陆窗口

            Splasher.Show(typeof(frmSplash));

在应用程序中使用启动屏幕和登陆窗口

            Application.Run(new frmMain());

在应用程序中使用启动屏幕和登陆窗口

        }

    做完以上工作,编译项目并运行即可看到启动屏幕的显示效果。

四、创建登陆窗口

    在项目中添加一个名为frmLogin.cs的windows窗体,设置该窗体的StartPosition属性为CenterScreen,FormBorderStyle属性为FixedSingle,MaximizeBox属性为false。向窗体添加一个GroupBox、两个Label、两个TextBox和两个Button,分别设置两个Label的Text属性为“用户:”和“密码:”,设置两个TextBox的Name为“txtUser”和“txtPass”,设置两个Button的Name属性为“btnLogin”和“btnExit”,对应Text设置为“登陆”和“退出”,设置btnExit的DialogResult属性为Cancel,然后双击btnLogin切换到代码视图编写如下代码:

在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口

         private   void  btnLogin_Click( object  sender, EventArgs e)

在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口

{

在应用程序中使用启动屏幕和登陆窗口

            string temp = CheckInput();

在应用程序中使用启动屏幕和登陆窗口

            if (!string.IsNullOrEmpty(temp))

在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口

{

在应用程序中使用启动屏幕和登陆窗口

                MessageBox.Show(temp, "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);

在应用程序中使用启动屏幕和登陆窗口

                txtUser.Focus();

在应用程序中使用启动屏幕和登陆窗口

                return;

在应用程序中使用启动屏幕和登陆窗口

            }

在应用程序中使用启动屏幕和登陆窗口

            this.DialogResult = DialogResult.OK;

在应用程序中使用启动屏幕和登陆窗口

        }

在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口

         private   string  CheckInput()

在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口

{

在应用程序中使用启动屏幕和登陆窗口

            string strUser=txtUser.Text.Trim();

在应用程序中使用启动屏幕和登陆窗口

            string strPass=txtPass.Text.Trim();

在应用程序中使用启动屏幕和登陆窗口

            if (string.IsNullOrEmpty(strUser))

在应用程序中使用启动屏幕和登陆窗口

                return "登陆用户不得为空!  ";

在应用程序中使用启动屏幕和登陆窗口

            if (string.IsNullOrEmpty(strPass))

在应用程序中使用启动屏幕和登陆窗口

                return "登陆密码不得为空!  ";

在应用程序中使用启动屏幕和登陆窗口

            if (strUser != "test" || strPass != "test")

在应用程序中使用启动屏幕和登陆窗口

                return "登陆用户或登陆密码错误!    ";

在应用程序中使用启动屏幕和登陆窗口

            return string.Empty;

在应用程序中使用启动屏幕和登陆窗口

        }

五、调整应用程序的主入口函数

    修改应用程序的主入口static void Main()函数如下:

在应用程序中使用启动屏幕和登陆窗口

[STAThread]

在应用程序中使用启动屏幕和登陆窗口

         static   void  Main()

在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口

{

在应用程序中使用启动屏幕和登陆窗口

            Application.EnableVisualStyles();

在应用程序中使用启动屏幕和登陆窗口

            Application.SetCompatibleTextRenderingDefault(false);

在应用程序中使用启动屏幕和登陆窗口

            frmLogin frm = new frmLogin();

在应用程序中使用启动屏幕和登陆窗口

            if (DialogResult.OK == frm.ShowDialog())

在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口

{

在应用程序中使用启动屏幕和登陆窗口

                Splasher.Show(typeof(frmSplash));

在应用程序中使用启动屏幕和登陆窗口

                frmMain MyMainForm = new frmMain();

在应用程序中使用启动屏幕和登陆窗口

                Application.Run(MyMainForm);

在应用程序中使用启动屏幕和登陆窗口

            }

在应用程序中使用启动屏幕和登陆窗口

            else

在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口

{

在应用程序中使用启动屏幕和登陆窗口

                Application.Exit();

在应用程序中使用启动屏幕和登陆窗口

            }

在应用程序中使用启动屏幕和登陆窗口

        }

    编译后运行便可看到整体效果了,注意,这里的登陆验证只是判断用户名和密码是否均为test。

    另外,为了在应用程序加载完毕后将主窗体展示给用户,可在frmMain_Load中添加如下代码:

在应用程序中使用启动屏幕和登陆窗口
在应用程序中使用启动屏幕和登陆窗口

             this .Show();

在应用程序中使用启动屏幕和登陆窗口

             this .Activate();

演示工程下载:http://www.cnblogs.com/Files/cncxz/SplashScreen.rar

posted on 2006-07-14 19:14  cncxz(虫虫) 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/cncxz/archive/2006/07/14/450987.html

继续阅读