winform 使用SplashScreen窗口

SplashScreen,就是平时我们说的溅射屏幕,任何一个做过客户端程序的coder应该对它都不陌生,因为它能提升用户体验,让软件看上去更美。SplashScreenForm通常进入程序时是打开,主窗体加载完毕后退出。一般来说,SplashScreenForm比较简洁,窗体的内容只是显示程序主题、版权等信息;复杂些的,可以显示主程序的加载项目情况。

  下面是我实现的一个SplashScreen类:

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Reflection;

namespace SplashScreen
{
    public class SplashScreen
    {
        private static object _obj = new object();

        private static Form _SplashForm = null;

        private static Thread _SplashThread = null;

        private delegate void ChangeFormTextdelegate(string s);

        public static void Show(Type splashFormType)
        {
            if (_SplashThread != null)
                return;
            if (splashFormType == null)
            {
                throw (new Exception());
            }

            _SplashThread = new Thread(new ThreadStart(delegate()
            {
                CreateInstance(splashFormType);
                Application.Run(_SplashForm);
            }));

            _SplashThread.IsBackground = true;
            _SplashThread.SetApartmentState(ApartmentState.STA);
            _SplashThread.Start();
        }

        public static void ChangeTitle(string status)
        {
            ChangeFormTextdelegate de = new ChangeFormTextdelegate(ChangeText);
            _SplashForm.Invoke(de, status);
        }

        public static void Close()
        {
            if (_SplashThread == null || _SplashForm == null) return;

            try
            {
                _SplashForm.Invoke(new MethodInvoker(_SplashForm.Close));
            }
            catch (Exception)
            {
            }
            _SplashThread = null;
            _SplashForm = null;
        }

        private static void ChangeText(string title)
        {
            _SplashForm.Text = title.ToString();
        }

        private static void CreateInstance(Type FormType)
        {
            if (_SplashForm == null)
            {
                lock (_obj)
                {
                    object obj = FormType.InvokeMember(null,
                                        BindingFlags.DeclaredOnly |
                                        BindingFlags.Public | BindingFlags.NonPublic |
                                        BindingFlags.Instance | BindingFlags.CreateInstance, null, null, null);
                    _SplashForm = obj as Form;
                    _SplashForm.TopMost = true;
                    _SplashForm.ShowInTaskbar = false;
                    _SplashForm.BringToFront();
                    _SplashForm.StartPosition = FormStartPosition.CenterScreen;
                    if (_SplashForm == null)
                    {
                        throw (new Exception());
                    }
                }
            }
        }
    }
}

调用的时候只需要传入你需要作为溅射屏幕的窗体,然后在主窗体加载完毕后调用close方法:

namespace SplashScreen
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            SplashScreen.Show(typeof(SplashForm));
            InitializeComponent();
            Thread.Sleep(1000);
            SplashScreen.ChangeTitle("111");
            Thread.Sleep(1000);
            SplashScreen.ChangeTitle("222");
            Thread.Sleep(1000);
            SplashScreen.ChangeTitle("333");
            Thread.Sleep(1000);
            SplashScreen.ChangeTitle("444");
            SplashScreen.Close();
        }
    }
}

 

时间: 2024-10-18 02:48:04

winform 使用SplashScreen窗口的相关文章

窗口隐藏-c# winform 如何判断窗口是否处于隐藏状态?

问题描述 c# winform 如何判断窗口是否处于隐藏状态? 应用场景是这样的:多个窗口实例化之后个别执行了Hide方法怎么才能知道具体是哪些窗口被隐藏呢,开始以为用WindowState结果发现FormWindowState并不包含Hide.最后我通过改全局变量的方法间接获取,有没有更直接点的办法? 解决方案 this.Visible == true;

c#Winform跳转窗口面后自动获取下拉列表的值

问题描述 c#Winform跳转窗口面后自动获取下拉列表的值 c#Winform跳转窗口面后自动获取原来下拉列表所选定的值. 解决方案 http://bbs.csdn.net/topics/390128592

右键菜单-winform点击窗口意外的位置关闭窗口

问题描述 winform点击窗口意外的位置关闭窗口 -如题 用窗体做一个图标的右键菜单.. 想点窗口意外的位置关闭窗口... 本来放在 窗口不是活动窗体的时候自动关闭 - - 可是那样点任务栏和桌面时它不会关闭qwq 解决方案 焦点不在窗口内的时候关闭就好了 解决方案二: 意外的位置指的是什么,, 解决方案三: 在Deactivate事件里关闭不行吗? 解决方案四: 试试失去焦点或者activite状态转换事件 解决方案五: activite状态转换事件? 解决方案六: 声明 焦点不在窗口内 事

winform c# pdf-C#Winform怎么把窗口上的信息生成PDF文件???

问题描述 C#Winform怎么把窗口上的信息生成PDF文件??? 窗口上的信息很多,估计要分好几页保存,在谷歌搜了说可以用pdfsharp,但是不会用 还有没有其他的方法,有具体的例子也好,谢谢大家..

C# WinForm 中在窗口标题栏上加按钮

按钮 在窗口标题栏上加按钮本来不是什么新鲜事了,我在VC++下早也实现过了(相信很多人也都实现过了).今天一个朋友问我C# WinForm下可否实现,我就顺便拿C#写了一个.   原理是一样的,都是重写窗口过程(WndProc),处理一些非客户区消息(WM_NCxxxx),可以说本来没有什么新意,可是从写这个程序的过程中,我也学到了两个技巧:    1).C#中重写窗口过程不用再调用SetWindowLong API了,直接overide一个WndProc就可以了.    2).Windows

C# WinForm中在窗口标题栏上加按钮

在窗口标题栏上加按钮本来不是什么新鲜事了,我在VC++下早也实现过了(相信很多人也都实现过了).今天一个朋友问我C# WinForm下可否实现,我就顺便拿C#写了一个. 原理是一样的,都是重写窗口过程(WndProc),处理一些非客户区消息(WM_NCxxxx),可以说本来没有什么新意,可是从写这个程序的过程中,我也学到了两个技巧: 1).C#中重写窗口过程不用再调用SetWindowLong API了,直接overide一个WndProc就可以了. 2).Windows API中的HDC可以通

c#:winform鼠标拖动窗口大小时,设定窗口最小尺寸

winform 程序运行过程中,用户用鼠标拖动窗体大小时,如将窗体调整得极小,可能窗体上的控件就面目全非(或看不到了),用下面的代码可以设定窗口的最小尺寸,以防止这种情况 private void Form1_ResizeEnd(object sender, EventArgs e)        {            //this.Text = "2width:" + this.Width.ToString() + " height:" + this.Heig

winform (C#)Mdi窗口切换闪烁问题

问题描述 我(用VS2005(C#))做的一个MDI窗口,在打开几个子窗口的时候,切换不同窗口时出现很明显的闪烁.有那个高手能解决吗? 解决方案 解决方案二:是不是背景图片的问题?我也遇到过!把图片去掉就可以了~!解决方案三:鄙视楼主,0分还问问题!

winform点击窗口意外的位置关闭窗口

问题描述 --如题用窗体做一个图标的右键菜单..想点窗口意外的位置关闭窗口...本来放在窗口不是活动窗体的时候自动关闭--可是那样点任务栏和桌面时它不会关闭qwq 解决方案 解决方案二:看看能不能使用焦点失去事件来关闭窗口.解决方案三:根据某一变量的值来决定关闭哪个窗口,如n=1关闭窗口1......解决方案四:引用1楼liquoryellow的回复: 看看能不能使用焦点失去事件来关闭窗口. 不可以啊...那样点桌面和任务栏它不会改变.解决方案五:你用的是Deactivate事件吗?我试了下可以