当前位置:编程学习 > C#/ASP.NET >>

winform 问题求教

有三个窗体,Login,Splash,Main

程序启动加载Login,登录后本应进入Main窗体,但由于Main窗体加载时间过长,所以希望先显示Splash窗体,等Main窗体加载完毕后,Main显示,关闭Splash

求教代码如何完成? --------------------编程问答-------------------- 这个真不难。 --------------------编程问答-------------------- 如果是为了友好的用户体验,那就要用多线程或者异步了。。。 --------------------编程问答--------------------
引用 1 楼 isjoe 的回复:
这个真不难。


+++++ --------------------编程问答-------------------- 你想实现的也就是像QQ登录的界面一样吧!加载完后,在现实主窗体,Splash将它的在任务栏显示的去掉,挡在Main窗体前或者是将Main窗体的透明度设置为0等加载完了在现实出来!但是要控制两个窗体的坐标位置,并且要通过多线程来实现两个窗体的同时加载,而且一定要注意窗体的闪烁的情况,一般会用到双缓冲和重绘技术。 --------------------编程问答-------------------- 加载mian窗口时先让Splash窗口显示,然后,在mian窗口加载完后的瞬间关闭Splash窗口 --------------------编程问答--------------------
  private void B_Load(object sender, EventArgs e)
        {
            Form2 ss = new Form2();
            ss.Show();
            for (int i = 0; i < 100000; i++)
            {
                button1.Text = i.ToString();
            }
            ss.Close();
        }
经测试,,可以。。
--------------------编程问答-------------------- 如果能让两个窗体在两个线程中分别打开? --------------------编程问答--------------------
引用楼主 mama1223 的回复:
有三个窗体,Login,Splash,Main

程序启动加载Login,登录后本应进入Main窗体,但由于Main窗体加载时间过长,所以希望先显示Splash窗体,等Main窗体加载完毕后,Main显示,关闭Splash

求教代码如何完成?


重点是要分析Main窗体中为什么加载时间过长?通常都是由于查询数据库或一些计算引起的,可以将这部分内容放在线程中处理。
进入线程前先隐藏Main窗体,显示splash窗体。
进入线程,线程执行完毕后,关闭splash窗体,将数据显示/绑定到Main窗体,显示Main窗体。

注意:在线程中是不能够直接访问UI元素的。具体实现可参阅MSDN,关键字BackgroupWorker --------------------编程问答--------------------
引用 7 楼 mama1223 的回复:
如果能让两个窗体在两个线程中分别打开?

两个窗体就有两个线程,不用刻意操作 --------------------编程问答--------------------
引用 9 楼 killdsbzero 的回复:
引用 7 楼 mama1223 的回复:
如果能让两个窗体在两个线程中分别打开?

两个窗体就有两个线程,不用刻意操作


winform 是STA模式的。 --------------------编程问答-------------------- 不会,请教 --------------------编程问答-------------------- 这个看样子得用线程,Splash窗体相当于查询数据时的进度条显示窗体. --------------------编程问答-------------------- 不过,顺序也可以不必非要登陆->splash->main。你的程序是否允许用户注销?或者先不登录(点取消进入)。有的时候这样也是必要的,需要用什么帐号登陆时在登陆。不许使用就可以注销而非退出程序。当离开时,可以防止别人用这个帐号操作。
这样的活你的菜单中应该有登陆和注销,那这样的话你就可以使用项目管理器设置初始屏幕为splash窗体。启动窗体为main。在main窗体里加载必要的数据以及设置。在main窗体的Shown事件里显示登陆窗体。试试这样如何? --------------------编程问答-------------------- 学习中 --------------------编程问答-------------------- 过程楼主已经说的很清楚了.你们瞎掺和..又不帮忙实现..如果我会,我早就写了. --------------------编程问答-------------------- LZ可参考
我自己做了一个闪屏类,专门用于加载我的主窗体时用。该类可实现启动和关闭时的渐隐渐现效果,动态显示正在加载的内容,多线程的准确的动态进度条(注意是准确的,不是类似于延时、循环等假的,只为了增强用户体验的那种)。
我一般在会在该类中检查程序的环境,数据库的可用否,网络连接可用否,是否缺失必要文件等等操作,加载完后,启动 LoadRunMainProgram函数来加载主窗体,窗体加载完后(注意是真实的加载完,不是利用延时等假的方法),关闭闪屏。

主要代码如下
主程序Program.CS

                //弹出初始化界面
                MySplash.ShowSplash();

                MySplash.SetStatus("正在加载模块1......");
                MySplash.SetStatus("正在加载模块2......");
                MySplash.SetStatus("正在加载模块3......");
                MySplash.SetStatus("正在加载模块4......");
                MySplash.SetStatus("所有模块加载完毕");
                Application.DoEvents();
                //System.Threading.Thread.Sleep(5);
                MySplash.SetStatus("正在加载主窗体");
                MySplash.LoadRunMainProgram(new Form_Main());

只需要把你的 Application.Run(new Form_Main()); 替换成 MySplash.LoadRunMainProgram(new Form_Main());就可以

闪屏的LoadRunMainProgram 主要代码


        static public void LoadRunMainProgram(Form form)
        {
            //订阅主窗体的句柄创建事件 
            form.HandleCreated += delegate
            {
                //启动新线程来显示Splash窗体
                new Thread(new ThreadStart(delegate
                    {
                        form.Shown += delegate
                        {
                            //通知Splash窗体关闭自身 
                            frmSplash.Invoke(new EventHandler(frmSplash.KillMe));
                        };
                    })).Start();
            };
            //显示主窗体
            Application.Run(form);
        }
--------------------编程问答-------------------- 把主窗体做一个事件,加载完成后,触发一个事件。之前是隐藏的。
触发后,显示窗体,把登陆框再隐藏。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,