C# Winform欢迎窗体实现()
方法一、program.cs 中先启动欢迎窗体,然后注册程序运行空闲去执行主程序窗体相应初始化代码
static void Main(string[] args)
{
Application.EnableVisualStyles(); //样式设置
Application.SetCompatibleTextRenderingDefault(false); //样式设置 UIForm.WelcomeForm sp = new UIForm.WelcomeForm(); //启动窗体
sp.Show(); //显示启动窗体
context = new ApplicationContext();
context.Tag = sp;
Application.Idle += new EventHandler(Application_Idle); //注册程序运行空闲去执行主程序窗体相应初始化代码
Application.Run(context);
}
//初始化等待处理函数
private static void Application_Idle(object sender, EventArgs e)
{ Application.Idle -= new EventHandler(Application_Idle);
if (context.MainForm == null)
{
MainForm mw = new MainForm(_args);
context.MainForm = mw;
mw.InitForm(); //主窗体要做的初始化事情在这里,该方法在主窗体里应该申明为public
UIForm.WelcomeForm sp = (UIForm.WelcomeForm)context.Tag;
sp.Close(); //关闭启动窗体
mw.Show(); //启动主程序窗体
} }
方法二、实现一个Splasher类,由主窗体操作欢迎窗体(受益于大神:键盘敲击者cncxz http://www.cnblogs.com/cncxz/archive/2006/07/14/450987.html)
首先创建一个名为ISplashForm的接口,该接口包含一个名为SetStatusInfo的方法以用来在启动屏幕上设置系统加载状态,代码如下:
public interface ISplashForm
{
void SetStatusInfo(string statusInfo);
}
然后实现一个Splasher类,负责欢迎窗体的Show、Close和Status更新,代码如下:
public class Splasher
{
private static Form splashForm = null;
private static ISplashForm splashInterface = null;
private static System.Threading.Thread splashThread = null;
private static string tempStatus = string.Empty; public static void Show(Type splashFormType)
{
if (splashThread != null)
{
return;
}
if (splashFormType == null)
{
throw new Exception("必须设置启动窗体");
}
splashThread = new System.Threading.Thread(new System.Threading.ThreadStart(delegate()
{
createInstance(splashFormType);
Application.Run(splashForm);
}));
splashThread.IsBackground = true;
splashThread.SetApartmentState(System.Threading.ApartmentState.STA);
splashThread.Start();
}
public static void Close()
{
if (splashThread == null || splashForm == null) return;
try
{
splashForm.Invoke(new MethodInvoker(splashForm.Close));
}
catch (Exception ex)
{
Controller.MessageConsole.WriteLog(ex);
HttpProxy.LogProxy.DoTask(ex, Controller.SQLiteController.Biz.GetAuthor());
}
splashThread = null;
splashForm = null;
}
public static string Status
{
set
{
{
if (splashInterface == null || splashForm == null)
{
tempStatus = value;
return;
}
splashForm.Invoke(
new splashStatusChangedHandle(delegate(string str) { splashInterface.SetStatusInfo(str); }),
new object[] { value }
);
}
}
}
private static void createInstance(Type FormType)
{
object obj = FormType.InvokeMember(null, System.Reflection.BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.CreateInstance, null, null, null);
splashForm = obj as Form;
splashInterface = obj as ISplashForm;
if (splashForm == null)
{
throw new Exception("启动窗体类型必须是System.Windows.Forms.Form的子类");
}
if (splashInterface == null)
{
throw new Exception("启动窗体必须实现ISplashForm接口");
}
if (!string.IsNullOrEmpty(tempStatus))
{
splashInterface.SetStatusInfo(tempStatus);
}
}
private delegate void splashStatusChangedHandle(string NewStatusInfo);
}
欢迎窗体代码如下:
public partial class WelcomeForm : DevExpress.XtraEditors.XtraForm, ISplashForm
{
public WelcomeForm()
{
InitializeComponent();
this.FormBorderStyle = FormBorderStyle.None;//取消窗体边框
this.ShowInTaskbar = false;//取消任务栏图标显示
} public void SetStatusInfo(string statusInfo)
{
this.lbInfo.Text = statusInfo;
}
}
主窗体需要初始化的地方调用代码如下:
Splasher.Status = "正在初始化窗体...";
InitializeComponent();
//一系列初始化操作。。。
//为Splasher.Status复制实现消息通知
Splasher.Close();
program.cs Main函数中实现代码如下:
UI.UIForm.Splasher.Show(typeof(UIForm.WelcomeForm));
Application.Run(new MainForm(args));
C# Winform欢迎窗体实现()的更多相关文章
- Winform子窗体刷新父窗体
调用窗体(父):Form1,被调用窗体(子):Form2方法1: 所有权法//Form1://需要有一个公共的刷新方法public void Refresh_Method(){//...} ...
- Winform跨窗体操作控件(使用委托)
Winform跨窗体操作控件是winform开发中很常见的形式,最常见且简单有效的方式便是使用委托的方式来进行操作,下面我将通过一个小实例来说明如何使用委托跨窗体实现控件操作. 实例介绍:两个窗体,F ...
- WinForm 设置窗体启动位置在活动屏幕右下角
WinForm 设置窗体启动位置在活动屏幕右下角 在多屏幕环境下, 默认使用鼠标所在的屏幕 1. 设置窗体的 StartPosition 为 FormStartPosition.Manual. 2. ...
- WinForm之窗体应用程序
WinForm之窗体应用程序 基本简单数据库操作(增删改查) using System; using System.Collections.Generic; using System.Windows. ...
- WinForm开发,窗体显示和窗体传值相关知识总结
主窗体中代码: public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void b ...
- C# winform中 窗体缩放自适应的方法(不同电脑/不同分辨率)
C# winform中 窗体缩放自适应的方法(不同电脑/不同分辨率) 窗体缩放是一个困扰我多时的问题,为了解决这个问题,我从网上找了很多相关的资料,很多人说用Anchor和Dock属性,但是我试了 ...
- winform圆角窗体实现
winform圆角窗体实现 1.窗体的FormBorderStyle设置成None,不要控制边框 2.TransparencyKey和BackColor颜色设置成相同的,这样,窗体就透明了 3.以此为 ...
- C# WinForm 父窗体 子窗体 传值
C# WinForm 父窗体 子窗体 传值 本次示例效果如下:Form1为父窗体(包含textBox1.button1)Form2为子窗体(包含textBox2.button2) 父窗体给子窗体传值= ...
- c#winform自定义窗体,重绘标题栏,自定义控件学习
c#winform自定义窗体,重绘标题栏 虽然现在都在说winform窗体太丑了,但是我也能尽量让桌面应用程序漂亮那么一点点话不多说,先上图 重绘标题栏先将原生窗体设置成无边框,FormBoderSt ...
- winform基础窗体设置及基础控件
WinForm - 也叫做C/S 客户端 另:B/S是 网页端 客户端应用程序 - 是需要安装在用户电脑上才可以使用的程序 特点: 不需要联网也可以打开使用部分功能,但是现在的情况是许多功能依然需要 ...
随机推荐
- jslint报错太多的解决方式
当jslint 一个js的时候,有时候太多“错误”,导致报错:“Too many errors. (53% scanned).”而停止检查 js文件,此时我们还是想把整个js文件检查完毕的. 所以,看 ...
- 在Azure New Portal上创建基于ARM的带SLB的VM
目前Azure的New Portal在国内已经上线了.本文将介绍最常见的一种场景:通过Azure的New Portal创建带有Server Load Balance的多台虚拟机. 1 创建Resour ...
- 第十课 go语言函数
1 内置函数 len() 函数可以接受不同类型参数并返回该类型的长度. 如果我们传入的是字符串则返回字符串的长度, 如果传入的是数组,则返回数组中包含的元素个数. 2 自定义函数 // 函数返回单个 ...
- PowerDesignerPDM中搜寻表名或字段名
Option Explicit ValidationMode = True InteractiveMode = im_Batch Dim mdl '当前model '获取当前活 ...
- 在Google Colab中导入一个本地模块或.py文件
模块与单个.py文件的区别,模块中含有__init__.py文件,其中函数调用使用的是相对路径,如果使用导入.py文件的方法在Google Colab中导入模块 会报错:Attempted relat ...
- Linux 正文处理命令及tar vi 编辑器
root 用户不受权限设置 如果文件有x 就可以执行 对目录的权限 r:可以查看目录下面的文件名 w:可以在该目录下新建,删除,修改文件名 x:可以cd进入目录 对于文件: 可执行的文件来说需要有可读 ...
- Shell编程进阶 1.3data命令
date命令是显示日期时间的命令 date 2016年 01月 01日 星期五 15:05:01 CST 修改时间的选项是 -s date -s "2016-01-01 12:56:10&q ...
- Android远程服务(AIDL)实现步骤
AIDL是安卓接口定义语言的缩写 由于笔者使用的是android studio所以建立AIDL文件的位置也需要注意,要在APPNAME->main->aidl->packagenam ...
- js中FOR循环的陷阱
//闭包解决 循环输出的问题 for(var i=0;i<rows.length;i++) {( function (i) { })(i);
- js 控制标记样式
做一个变色的标签 鼠标移入变为灰色,移除变回原来的颜色,点击变成黑色,再点击变回,如果变成黑色不受移入移除影响. <body> <div class="bt1" ...