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是 网页端 客户端应用程序 - 是需要安装在用户电脑上才可以使用的程序 特点: 不需要联网也可以打开使用部分功能,但是现在的情况是许多功能依然需要 ...
随机推荐
- Maven:Resource Path Location Type Project configuration is not up-to-date with pom.xml. Run project configuration update
Maven构建项目的时候提示: Description Resource Path Location Type Project configuration is not up-to-date with ...
- 7.Selenium+Python实现搜索百度的测试用例
1.导入测试用例需要的模块,unittest是python的内置模块,它提供了组织测试用例的框架 import unittest # 导入测试用例的模块 2.测试用例继承于unittest class ...
- wpf中为DataGrid添加checkbox支持多选全选
项目中用到DataGrid, 需要在第一列添加checkbox, 可以多选.全选. 其中涉及的概念DataTemplate, DataGridCellStyle, DataGridCellContro ...
- [转载]Linux C 字符串函数 sprintf()、snprintf() 详解
一.sprintf() 函数详解 在将各种类 型的数据构造成字符串时,sprintf 的强大功能很少会让你失望. 由于 sprintf 跟 printf 在用法上几乎一样,只是打印的目的地不同而已,前 ...
- Swing编程中为什么对Panel设置了位置后,它的lable位置也跟这变了呢?
总结: package com.da; //这里我不明白,我对每一个Panle里的按钮设置了位置BorderLayout.SOUTH.可是为什么Lable的位置和它一样同步设置了呢? //做一个界面 ...
- js页面埋点
页面埋点的作用,其实就是用于流量分析.而流量的意思,包含了很多:页面浏览数(PV).独立访问者数量(UV).IP.页面停留时间.页面操作时间.页面访问次数.按钮点击次数.文件下载次数等.而流量分析又有 ...
- AngularJS:依赖注入
ylbtech-AngularJS:依赖注入 1.返回顶部 1. AngularJS 依赖注入 什么是依赖注入 wiki 上的解释是:依赖注入(Dependency Injection,简称DI)是一 ...
- md5加密(1)
package com.js.ai.modules.pointwall.util; import java.security.MessageDigest; import java.security.N ...
- SEO中常用HTML代码大全,及权重排序
做SEO必须要懂HTML,说的是一点都没错,不过其实是不需要全部都懂,最重点的你懂了会用,基本上都是事半功倍了.可以这么说一个不懂代码的优化人员不算是一个合格的好优化.下面就总结一下做优化,必须要懂得 ...
- 使用jmx4perl和j4psh接管Jolokia
在ActiveMQ的API中,内置了Jolokia . 可以使用jmx4perl来安装: $ perl -MCPAN -e shell Terminal does not support AddHis ...