使用多线程制作启动窗体和登录窗体

对程序简单说明一下,MainForm是主窗体,需要从数据库读取数据来生成界面,程序运行时,首先显示SplachScreenForm,并在SplachScreenForm中执行MainForm中的生成界面的方法。如果MainForm界面生成成功,则显示LoginForm,否则退出应用程序。LoginForm中,用户登录成功,则显示MainForm,取消登录,则退出应用程序。总之,在MainForm显示之前,要先显示SplachScreenForm和LoginForm。任何情况下,只有MainForm初始化完成并且登录成功,用户才能看到MainForm。

Program类

    static class Program
    {
        delegate DialogResult ShowLoginCallBack();
        delegate void CloseFormCallBack();
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            SplachScreenForm.ShowSplachScreen();    //首先显示SplachScreenForm
            if (SplachScreenForm.Init())   //如果界面初始化成功
            {
                DialogResult result = ShowLogin();     //调用SplachScreenForm中的ShowLogin方法,显示LoginForm
                if (result == DialogResult.OK)
                {
                    MainForm mainForm = SplachScreenForm.MainForm;
                    CloseForm();     //关闭SplachScreenForm
                    Application.Run(mainForm);    //启动主窗体
                }
            }

        }

        //线程间安全调用启动窗体的ShowLogin方法
        static DialogResult ShowLogin()
        {
            try
            {
                if (SplachScreenForm.SplachScreen.InvokeRequired)
                {
                    ShowLoginCallBack showLogin = new ShowLoginCallBack(ShowLogin);
                    return (DialogResult)SplachScreenForm.SplachScreen.Invoke(showLogin);
                }
                else
                {
                    return SplachScreenForm.ShowLogin();
                }
            }
            catch (System.Data.SqlClient.SqlException ex)
            {
                Common.CommonLib.ShowError(ex.Message);
                return DialogResult.Cancel;
            }
        }

        //线程间安全调用启动窗体的CloseForm方法
        static void CloseForm()
        {
            if (SplachScreenForm.SplachScreen.InvokeRequired)
            {
                CloseFormCallBack closeForm = new CloseFormCallBack(CloseForm);
                SplachScreenForm.SplachScreen.Invoke(closeForm);
            }
            else
            {
                SplachScreenForm.CloseForm();
            }
        }
    }

SplachScreenForm代码

     public partial class SplachScreenForm : Form
    {
        delegate DialogResult ShowDialogCallBack(LoginForm loginForm);
        static MainForm mainForm;
        private static SplachScreenForm splachScreen ;
        private static Thread thread;

        public SplachScreenForm()
        {
            InitializeComponent();
        }

        static SplachScreenForm()
        {
            mainForm = new MainForm();

        }

        public static SplachScreenForm SplachScreen
        {
            get { return splachScreen; }
        }

        public static MainForm MainForm
        {
            get { return mainForm; }
        }

        public static void ShowSplachScreen()
        {
            if (splachScreen != null)
                return;
            thread = new Thread(new ThreadStart(ShowForm));  //开启一个线程,显示SplachScreenForm
            thread.IsBackground = true;
            thread.SetApartmentState(ApartmentState.STA);
            thread.Start();
        }

        private static void ShowForm()
        {
            splachScreen = new SplachScreenForm();
            Application.Run(splachScreen);
        }

        public static bool Init()
        {
            return mainForm.Manager.SystemMenuForm.Init();  //初始化MainForm界面
        }

        public static DialogResult ShowLogin()
        {
            LoginForm loginForm = new LoginForm();
            loginForm.Owner = splachScreen;
           
            return loginForm.ShowDialog();   //显示LoginForm,登录成功返回DialogResult.OK
        }

        public static void CloseForm()
        {
            splachScreen.Close();
            mainForm = null;
            thread = null;
            splachScreen = null;
        }

    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值