1.需要添加对Microsoft.VisualBasic 引用,

2.准备frmMain,frmSplash两个窗口

说明:
        frmSplash在主线程上建立,但是在独立线程上进行消息循环
        当protected override void OnCreateMainForm  方法执行完毕,会隐藏frmSplash
        可以在OnCreateMainForm中执行预加载操作,或者在frmMain的构造里执行,不要在frmMain的OnLoad事件中进行
        当需要改边frmSplash窗体上控件属性时(如显示加载提示等)需要使用控件的Invoke

using System;
using System.Collections.Generic;
using System.Windows.Forms; namespace SplashLoader
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(String[] args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
new SplashApp().Run(args);
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.VisualBasic.ApplicationServices;
using System.Diagnostics;
using System.Windows.Forms;
using System.IO;
using System.Threading;
using System.Reflection;
using System.Configuration;
using ISplashLoader; namespace SplashLoader
{
public class SplashApp : WindowsFormsApplicationBase
{ private frmSplash _frmSplash = null; protected override void OnCreateSplashScreen()
{
//在主UI线程上运行
Console.WriteLine("OnCreateSplashScreen:" + Thread.CurrentThread.ManagedThreadId);
//这里调用是在主线程上的
//但是SplashForm的消息循环是在独立线程上的
//可以在SplashForm的OnLoad事件中看到是一个独立的线程
//因此OnCreateMainForm即使阻塞了,SplashForm也能正常绘制
//可以把数据初试化操作放在frmMain的构造函数中
//但是不要放在OnLoad事件中,因为在OnLoad时UI界面已经绘制完成
//如果在里面放置一些阻塞型的操作会导致界面卡死
//SplashForm在frmMain的OnLoad调用时隐藏(没有发现调用close事件--会有短暂延迟)
//
_frmSplash = new frmSplash();
SplashScreen = _frmSplash; SplashScreen.ShowInTaskbar = false;
SplashScreen.Cursor = System.Windows.Forms.Cursors.AppStarting;
} private bool CheckUpgrade()
{
if (this.CommandLineArgs.Count > )
{
if (string.Compare(CommandLineArgs[], "Upgrade:Skip", true) == )
{
return false;
}
}
return true;
}
protected override void OnCreateMainForm()
{
try
{ //在主UI线程上运行
Console.WriteLine("OnCreateMainForm:" + Thread.CurrentThread.ManagedThreadId); //注意使用SplashForm 后,可以在主窗体的构造中加载数据
//或者在SplashApp的OnCreateMainForm()中,不要放在frmMain的OnLoad事件中 if (CheckUpgrade())
{ _frmSplash.SetTips("检测是否有新的版本..."); Process pa = new Process();
pa.StartInfo.UseShellExecute = false;
pa.StartInfo.FileName = Path.Combine(Application.StartupPath, @"UpdateApp.exe");
pa.StartInfo.Arguments = "AppStart";
pa.Start();
while (!pa.HasExited) ; } String assembley = ConfigurationManager.AppSettings["MainAssembly"];
String type = ConfigurationManager.AppSettings["MainForm"];
MainForm = CreateForm(assembley, type, _frmSplash); }
catch (Exception e)
{
//处理动态加载过程中的异常
MessageBox.Show(e.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
} } /// <summary>
/// 动太加载窗体
/// </summary>
/// <param name="assembly">如:FIStudio.WinUI.(exe|dll)</param>
/// <param name="type">FIStudio.WinUI.UI.frmCooperatorMgr</param>
/// <returns></returns>
private Form CreateForm(String assembly,String type,ILoadTips loadTips)
{
String a = System.IO.Path.GetFileNameWithoutExtension(assembly);
Type t = Assembly.Load(a).GetType(type, true);
Form frm = Activator.CreateInstance(t, new Object[] { loadTips }) as Form;
return frm;
} }
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using ISplashLoader; namespace SplashLoader
{
public partial class frmSplash : Form ,ILoadTips
{
public frmSplash()
{
InitializeComponent();
BackgroundImageLayout = ImageLayout.Stretch;
FormBorderStyle = FormBorderStyle.None;
StartPosition = FormStartPosition.CenterScreen;
Console.WriteLine("SplashForm:" + Thread.CurrentThread.ManagedThreadId);
}
delegate void SetTipsHandle(String tips);
public void SetTips(String tips)
{
if (lblTips.InvokeRequired)
{
lblTips.Invoke(new SetTipsHandle(SetTips), tips);
}
else
{
lblTips.Text = tips;
}
}
private void frmSplash_Load(object sender, EventArgs e)
{
Console.WriteLine("SplashForm_Load:" + Thread.CurrentThread.ManagedThreadId);
}
}
}

Demo:参考华为网盘/软件测试与任务/引导窗体

使用WindowsFormsApplicationBase实现引导界面的更多相关文章

  1. App 引导界面

    App 引导界面 1.前言 最近在学习实现App的引导界面,本篇文章对设计流程及需要注意的地方做一个浅显的总结. 附上项目链接,供和我水平类似的初学者参考——http://files.cnblogs. ...

  2. android——利用SharedPreference做引导界面

    很久以前就接触过sharedPreference这个android中的存储介质.但是一直没有实际使用过,今天在看之前做的“民用机型大全”的app时,突然想到可以使用sharedPreference类来 ...

  3. 【Android UI设计与开发】第05期:引导界面(五)实现应用程序只启动一次引导界面

    [Android UI设计与开发]第05期:引导界面(五)实现应用程序只启动一次引导界面 jingqing 发表于 2013-7-11 14:42:02 浏览(229501) 这篇文章算是对整个引导界 ...

  4. Android UI开发第四十一篇——墨迹天气3.0引导界面及动画实现

    周末升级了墨迹天气,看着引导界面做的不错,模仿一下,可能与原作者的代码实现不一样,但是实现的效果还是差不多的.先分享一篇以前的文章,android动画的基础知识,<Android UI开发第十二 ...

  5. 【Android UI设计与开发】3.引导界面(三)实现应用程序只启动一次引导界面

    大部分的引导界面基本上都是千篇一律的,只要熟练掌握了一个,基本上也就没什么好说的了,要想实现应用程序只启动一次引导界面这样的效果,只要使用SharedPreferences类,就会让程序变的非常简单, ...

  6. 【Android】首次进入应用时加载引导界面

    参考文章: [1]http://blog.csdn.net/wsscy2004/article/details/7611529 [2]http://www.androidlearner.net/and ...

  7. SharedPreference 存储小量数据,一般首次启动显示引导界面就用这个。

    写://添加一个SharedPreference并传入数据SharedPreference sharedPreferences = getSharedPreferences("share_d ...

  8. 转-ViewPager组件(仿微信引导界面)

    http://www.cnblogs.com/lichenwei/p/3970053.html 这2天事情比较多,都没时间更新博客,趁周末,继续继续~ 今天来讲个比较新潮的组件——ViewPager ...

  9. 【笔记】WPF实现ViewPager引导界面效果及问题汇总

    最近在开发项目的首次使用引导界面时,遇到了问题,引导界面类似于安卓手机ViewPager那样的效果,希望通过左右滑动手指来实现切换不同页面,其间伴随动画. 实现思路: 1.界面布局:新建一个UserC ...

随机推荐

  1. 【转】inittab文件

    原文网址:http://blog.csdn.net/shuaishuai80/article/details/6202482 一.inittab文件背景(1)init进程的作用   使用uboot下载 ...

  2. CentOS之NTP服务器配置

    本文使用CentOS 6.5作为搭建环境 一.服务器端配置 1.安装所需软件包 yum -y install ntp ntpdate---------------------------------- ...

  3. WinForm各浏览器内核控件

    WebKit.NET webkit-sharp CefSharp awesomium OpenWebKitSharp geckofx MozNet Web Component

  4. expect学习笔记及用法

    expect学习笔记及实例详解 expect的基本用法 expect用法

  5. Linux C 一些函数 所属头文件

    1. Linux中一些头文件的作用:<assert.h>:ANSI C.提供断言,assert(表达式)<glib.h>:GCC.GTK,GNOME的基础库,提供很多有用的函数 ...

  6. Oracle VM VirtualBox安裝Windows 2000失败

    问题: VirtualBox下安装Windows2000,设置网络后进入最后一步,复制组件……然后就是重启:再试还是重启!   解决: 在Oracle网站上查了一下资料:http://www.virt ...

  7. JavaScript(一) - 精简

    javascript一 javascript 是什么? 1. 运行在浏览器端 ,定义网页的行为, 2.所有的html页面都有js. 二 javascript 定义方式? 1 在html文件里 js 可 ...

  8. 新手之:SpringBoot ——Reids主从哨兵整合(CentOS7)

    一.Redis主从搭建(一台服务器模拟多个端口) 结构图:) 1.确保安装了Redis,我装在了/opt/redis目录下.可通过"whereis redis-cli"命令查看是否 ...

  9. 基于sersync海量文件实时同步

    项目需求:最近涉及到数百万张图片从本地存储迁移到云存储,为了使完成图片迁移,并保证图片无缺失,业务不中断,决定采用实时同步,同步完后再做流量切换.在实时同步方案中进行了几种尝试. 方案1:rsync+ ...

  10. FCCMBBTN.RES

    [ilink32 Error] Error: Unable to open file 'FCCMBBTN.RES' 用到了fc控件 添加路径到LibPath即可. 1st\1stClassStudio ...