使用WindowsFormsApplicationBase实现引导界面
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实现引导界面的更多相关文章
- App 引导界面
App 引导界面 1.前言 最近在学习实现App的引导界面,本篇文章对设计流程及需要注意的地方做一个浅显的总结. 附上项目链接,供和我水平类似的初学者参考——http://files.cnblogs. ...
- android——利用SharedPreference做引导界面
很久以前就接触过sharedPreference这个android中的存储介质.但是一直没有实际使用过,今天在看之前做的“民用机型大全”的app时,突然想到可以使用sharedPreference类来 ...
- 【Android UI设计与开发】第05期:引导界面(五)实现应用程序只启动一次引导界面
[Android UI设计与开发]第05期:引导界面(五)实现应用程序只启动一次引导界面 jingqing 发表于 2013-7-11 14:42:02 浏览(229501) 这篇文章算是对整个引导界 ...
- Android UI开发第四十一篇——墨迹天气3.0引导界面及动画实现
周末升级了墨迹天气,看着引导界面做的不错,模仿一下,可能与原作者的代码实现不一样,但是实现的效果还是差不多的.先分享一篇以前的文章,android动画的基础知识,<Android UI开发第十二 ...
- 【Android UI设计与开发】3.引导界面(三)实现应用程序只启动一次引导界面
大部分的引导界面基本上都是千篇一律的,只要熟练掌握了一个,基本上也就没什么好说的了,要想实现应用程序只启动一次引导界面这样的效果,只要使用SharedPreferences类,就会让程序变的非常简单, ...
- 【Android】首次进入应用时加载引导界面
参考文章: [1]http://blog.csdn.net/wsscy2004/article/details/7611529 [2]http://www.androidlearner.net/and ...
- SharedPreference 存储小量数据,一般首次启动显示引导界面就用这个。
写://添加一个SharedPreference并传入数据SharedPreference sharedPreferences = getSharedPreferences("share_d ...
- 转-ViewPager组件(仿微信引导界面)
http://www.cnblogs.com/lichenwei/p/3970053.html 这2天事情比较多,都没时间更新博客,趁周末,继续继续~ 今天来讲个比较新潮的组件——ViewPager ...
- 【笔记】WPF实现ViewPager引导界面效果及问题汇总
最近在开发项目的首次使用引导界面时,遇到了问题,引导界面类似于安卓手机ViewPager那样的效果,希望通过左右滑动手指来实现切换不同页面,其间伴随动画. 实现思路: 1.界面布局:新建一个UserC ...
随机推荐
- js setInterval每隔一段时间执行一次
js setInterval每隔一段时间执行一次setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式.setInterval() 方法会不停地调用函数,直到 clearI ...
- 给Linux内核增加一个系统调用的方法(转)
作者:chenjieb520 给Linux内核增加一个系统调用的方法 为了更加好地调试linux内核,笔者的实验均在mini6410的arm板上运行的.这样做的原因,第一是因为本人是学嵌入式的, ...
- springboot 有关拦截器遇到的问题
最近改造搜索服务,原来是用 ngx + lua 写的,虽然性能很高,带来的问题是可维护性不太方便,不是指lua语言方面,是因为团队就2个开发人员,另外一个开发人员的擅长语言是Java,于是准备将搜索服 ...
- coding github 配置ssl 免密拉取代码
详细介绍: https://www.cnblogs.com/superGG1990/p/6844952.html 注:其中检验过程与下述不同,可以先在对应git库使用 git pull 一次,选择信任 ...
- JAVA面向对象编程课程设计——web版斗地主
一.团队课程设计博客链接 JAVA面向对象编程课程设计--网络版单机斗地主 二.个人负责模块或任务说明 实体类的设计 斗地主规则的实现 人机自动出牌的算法 实现数据库的DAO模式 三.自己的代码提交记 ...
- bzoj4331: JSOI2012 越狱老虎桥
Description 这里,是美丽的南京:这里,是秀美的进香河:这里是安逸的老虎桥. 如果说进香河的美,美在其秀美的风光,倒不如说是美在了那惬意的南京古典小巷式生活.如果说进香河的迷人,在其淳朴的 ...
- 灵活运用SMART原则梳理目标
1:立刻行动 执行力是老生常谈了,提高执行力不拖延,源自于对目标的充分理解和超出常人的坚持. 如何深刻理解目标?一方面要有基础的知识.能力积累,另一方面要灵活运用SMART原则从不同维度梳理目标. 2 ...
- istio 配置https gateway
沒有親手實驗,参考官方文档: https://istio.io/docs/tasks/traffic-management/secure-ingress/
- 模板引擎文档 - layui.laytpl 介绍
<!DOCTYPE html> <html class="ui-page-login"> <head> <meta charset=&qu ...
- crs_register/crs_unregister 注册与移除RAC服务 --zhuanzai
crs_register命令主要是将资源注册到CRS.该方法通常结合crs_stat -p 或者crs_profile先创建配置文件.同时crs_register也具有更新CRS的功能.本文将描述cr ...