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是 网页端 客户端应用程序 - 是需要安装在用户电脑上才可以使用的程序 特点: 不需要联网也可以打开使用部分功能,但是现在的情况是许多功能依然需要 ...
随机推荐
- poj 2096 , zoj 3329 , hdu 4035 —— 期望DP
题目:http://poj.org/problem?id=2096 题目好长...意思就是每次出现 x 和 y,问期望几次 x 集齐 n 种,y 集齐 s 种: 所以设 f[i][j] 表示已经有几种 ...
- nginx错误
在开发的时候遇到nginx错误 网上找了半天也没有找到解决方案: 先查看了一下nginx错误日志 cat /usr/local/nginx/logs/error.log 然后发现看不太懂 那么只能重启 ...
- 蓝桥杯 基础练习 BASIC-24 龟兔赛跑预测
基础练习 龟兔赛跑预测 时间限制:1.0s 内存限制:512.0MB 问题描述 话说这个世界上有各种各样的兔子和乌龟,但是研究发现,所有的兔子和乌龟都有一个共同的特点——喜欢赛跑.于是世界上各 ...
- 单片机RS485通信接口、控制线、原理图及程序实例
RS232 标准是诞生于 RS485 之前的,但是 RS232 有几处不足的地方: 接口的信号电平值较高,达到十几 V,使用不当容易损坏接口芯片,电平标准也与TTL 电平不兼容. 传输速率有局限,不可 ...
- 【OK210试用体验】进阶篇(2)视频图像采集之MJPG-streamer编译(arm移植)
上一篇([OK210试用体验]进阶篇(1)视频图像采集之MJPG-streamer编译(Ubuntu系统下))进行了MJPG-streamer在Ubuntu下的编译及测试,这一篇针对OK210,进行a ...
- 包学会之浅入浅出Vue.js:开学篇
2016年,乃至接下来整个2017年,如果你要问前端技术框架什么最火,那无疑就是前端三巨头:React.Angular.Vue.没错,什么jQuery,seaJs,gulp等都逐渐脱离了热点.面试的时 ...
- 关于RandomizedSearchCV 和GridSearchCV(区别:参数个数的选择方式)
# -*- coding: utf-8 -*- """ Created on Tue Aug 09 22:38:37 2016 @author: Administrato ...
- 类型:sqlserver;问题:版本;结果:sqlserver版本区分
LocalDB (SqlLocalDB)LocalDB 是 Express 的一种轻型版本,该版本具备所有可编程性功能,但在用户模式下运行,并且具有快速的零配置安装和必备组件要求较少的特点.如果您需要 ...
- 【Android 多媒体应用】使用 MediaPlayer 播放视频
1.MainActivity.java import android.media.AudioManager; import android.media.MediaPlayer; import andr ...
- apache server和tomcat集群配置二:垂直负载
垂直负载就是同一个机器中的不同服务器之间的负载.跟水平负载(ip不一样的服务器之间的负载)的最大区别就是要修改tomcat的端口号,避免引起冲突. 还要注意apache中workers.propert ...