winform picturebox绘制点_Winform下制作Splash启动画面

b07069228802cf451d16473549d61c3a.png

引言

当我们的软件加载资源比较多,需要耗费一定时间的时候,我们希望软件可以有一个类似于欢迎的加载界面,这样可以简单地显示当前的加载进度,使得用户体验更加友好。

开发准备

  • 首先创建一个Windows窗体应用项目,项目名称为thinger.com.SplashProject,并创建一个窗体,取名FrmMain,绘制一个简单的UI界面,用于表示主界面。

a3e1639e6d6fb03bbcb6032efe1e132c.png
  • 创建一个Splasher类,包含创建窗体实例、显示动态窗体、显示窗体状态和关闭动画窗体。
  1. 创建Splasher类
    public class Splasher
    {
    private delegate void SplashStatusChangedHandle(string NewStatusInfo);
    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;
    }
  2. 显示动画窗体
    public static void Show(Type splashFormType)
    {
    if (m_SplashThread != null)
    return;
    if (splashFormType == null)
    return;
    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();
    }
  3. 创建窗体实例
    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("动画窗体必须为Form窗体"));
    }
    if (m_SplashInterface == null)
    {
    throw (new Exception("动画窗体必须继承ISplashForm"));
    }
    if (!string.IsNullOrEmpty(m_TempStatus))
    m_SplashInterface.SetStatusInfo(m_TempStatus);
    }
  4. 显示窗体状态
    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 }
    );
    }
    }
  5. 关闭动画窗体
    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;
    }
创建一个ISplashForm接口,如下所示:
public interface ISplashForm
{
void SetStatusInfo(string NewStatusInfo);
}创建一个新窗体,取名为FrmSplash,添加一个状态Label标签,该窗体继承ISplashForm,并实现SetStatusInfo方法,代码如下:
void ISplashForm.SetStatusInfo(string NewStatusInfo)
{
lbStatusInfo.Text = NewStatusInfo;
}FrmSplash窗体做以下设置:
将FormBorderStyle属性设成None,即没有窗体边框 将StartPosition属性设成CenterScreen,即总是居中 将TopMost属性设成True,即总是在顶部 将UseWaitCursor属性设成Ture,即显示等待光标 增加一个PictureBox控件,Dock设置为Fill,选择一个好看的背景图片
UI界面设计如下所示:

9bb84a10520917d77c456a4b5b4f7b67.png

功能实现

  • 在Program程序入口处,加入一行代码Splasher.Show(typeof(FrmSplash)),用于显示SplashForm
    static class Program
    {/// <summary>/// 应用程序的主入口点。/// </summary>
    [STAThread]
    static void Main()
    {
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Splasher.Show(typeof(FrmSplash));
    Application.Run(new FrmMain());
    }
    }
  • 在FrmMain窗体的加载事件中,编写代码如下,这里使用Thread.Sleep来模拟处理相关信息
    private void FrmMain_Load(object sender, EventArgs e)
    {//模拟初始化相关信息
    Thread.Sleep(500);
    Splasher.Status = "正在加载系统模块......";
    Thread.Sleep(1000);
    Splasher.Status = "正在加载控件信息......";
    Thread.Sleep(1000);
    Splasher.Status = "正在加载配置文件......";
    Thread.Sleep(1000);
    Splasher.Status = "正在连接PLC设备......";
    this.Opacity = 0;
    this.Shown += FrmMain_Shown;
    }
  • 在FrmMain显示完成事件中,关闭SplashForm,代码如下所示:
    private void FrmMain_Shown(object sender, EventArgs e)
    {
    this.Opacity = 100;
    Splasher.Status = "初始化完毕......";
    Splasher.Close();
    }
  • 最终运行效果如下所示:

3aa36d9f497deb803e6e65274d1da845.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值