C# Winform欢迎窗体实现()

方法一、program.cs 中先启动欢迎窗体,然后注册程序运行空闲去执行主程序窗体相应初始化代码

 1  static void Main(string[] args)
 2         {
 3             Application.EnableVisualStyles();                       //样式设置
 4             Application.SetCompatibleTextRenderingDefault(false);   //样式设置
 5
 6
 7              UIForm.WelcomeForm sp = new UIForm.WelcomeForm();       //启动窗体
 8              sp.Show();                                              //显示启动窗体
 9              context = new ApplicationContext();
10              context.Tag = sp;
11              Application.Idle += new EventHandler(Application_Idle); //注册程序运行空闲去执行主程序窗体相应初始化代码
12              Application.Run(context);
13         }

 1     //初始化等待处理函数
 2         private static void Application_Idle(object sender, EventArgs e)
 3         {
 4
 5             Application.Idle -= new EventHandler(Application_Idle);
 6             if (context.MainForm == null)
 7             {
 8                 MainForm mw = new MainForm(_args);
 9                 context.MainForm = mw;
10                 mw.InitForm();                                  //主窗体要做的初始化事情在这里,该方法在主窗体里应该申明为public
11                 UIForm.WelcomeForm sp = (UIForm.WelcomeForm)context.Tag;
12                 sp.Close();                                 //关闭启动窗体
13                 mw.Show();                                  //启动主程序窗体
14             }
15
16
17         }

方法二、实现一个Splasher类,由主窗体操作欢迎窗体(受益于大神:键盘敲击者cncxz http://www.cnblogs.com/cncxz/archive/2006/07/14/450987.html)

首先创建一个名为ISplashForm的接口,该接口包含一个名为SetStatusInfo的方法以用来在启动屏幕上设置系统加载状态,代码如下:

1  public interface ISplashForm
2     {
3         void SetStatusInfo(string statusInfo);
4     }

然后实现一个Splasher类,负责欢迎窗体的Show、Close和Status更新,代码如下:

 1   public class Splasher
 2     {
 3         private static Form splashForm = null;
 4         private static ISplashForm splashInterface = null;
 5         private static System.Threading.Thread splashThread = null;
 6         private static string tempStatus = string.Empty;
 7
 8         public static void Show(Type splashFormType)
 9         {
10             if (splashThread != null)
11             {
12                 return;
13             }
14             if (splashFormType == null)
15             {
16                 throw new Exception("必须设置启动窗体");
17             }
18             splashThread = new System.Threading.Thread(new System.Threading.ThreadStart(delegate()
19             {
20                 createInstance(splashFormType);
21                 Application.Run(splashForm);
22             }));
23             splashThread.IsBackground = true;
24             splashThread.SetApartmentState(System.Threading.ApartmentState.STA);
25             splashThread.Start();
26         }
27         public static void Close()
28         {
29             if (splashThread == null || splashForm == null) return;
30             try
31             {
32                 splashForm.Invoke(new MethodInvoker(splashForm.Close));
33             }
34             catch (Exception ex)
35             {
36                 Controller.MessageConsole.WriteLog(ex);
37                 HttpProxy.LogProxy.DoTask(ex, Controller.SQLiteController.Biz.GetAuthor());
38             }
39             splashThread = null;
40             splashForm = null;
41         }
42         public static string Status
43         {
44             set
45             {
46                 {
47                     if (splashInterface == null || splashForm == null)
48                     {
49                         tempStatus = value;
50                         return;
51                     }
52                     splashForm.Invoke(
53                             new splashStatusChangedHandle(delegate(string str) { splashInterface.SetStatusInfo(str); }),
54                             new object[] { value }
55                         );
56                 }
57             }
58         }
59         private static void createInstance(Type FormType)
60         {
61             object obj = FormType.InvokeMember(null, System.Reflection.BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.CreateInstance, null, null, null);
62             splashForm = obj as Form;
63             splashInterface = obj as ISplashForm;
64             if (splashForm == null)
65             {
66                 throw new Exception("启动窗体类型必须是System.Windows.Forms.Form的子类");
67             }
68             if (splashInterface == null)
69             {
70                 throw new Exception("启动窗体必须实现ISplashForm接口");
71             }
72             if (!string.IsNullOrEmpty(tempStatus))
73             {
74                 splashInterface.SetStatusInfo(tempStatus);
75             }
76         }
77         private delegate void splashStatusChangedHandle(string NewStatusInfo);
78     }

欢迎窗体代码如下:

 1  public partial class WelcomeForm : DevExpress.XtraEditors.XtraForm, ISplashForm
 2     {
 3         public WelcomeForm()
 4         {
 5             InitializeComponent();
 6             this.FormBorderStyle = FormBorderStyle.None;//取消窗体边框
 7             this.ShowInTaskbar = false;//取消任务栏图标显示
 8         }
 9
10         public void SetStatusInfo(string statusInfo)
11         {
12             this.lbInfo.Text = statusInfo;
13         }
14     }

主窗体需要初始化的地方调用代码如下:

           Splasher.Status = "正在初始化窗体...";
            InitializeComponent();
            //一系列初始化操作。。。
            //为Splasher.Status复制实现消息通知
            Splasher.Close();

program.cs Main函数中实现代码如下:

1    UI.UIForm.Splasher.Show(typeof(UIForm.WelcomeForm));
2    Application.Run(new MainForm(args));

时间: 2025-01-07 08:27:23

C# Winform欢迎窗体实现()的相关文章

C# WinForm 父窗体 子窗体 传值

C# WinForm 父窗体 子窗体 传值 本次示例效果如下:Form1为父窗体(包含textBox1.button1)Form2为子窗体(包含textBox2.button2) 父窗体给子窗体传值==================1.点击Form1的button1 打开Form2  父窗体给子窗体传值 可以调用重载子窗体的构造函数 直接传入相关数值 public partial class Form1 : Form    {        public Form1()        {   

Winform跨窗体操作控件(使用委托)

Winform跨窗体操作控件是winform开发中很常见的形式,最常见且简单有效的方式便是使用委托的方式来进行操作,下面我将通过一个小实例来说明如何使用委托跨窗体实现控件操作. 实例介绍:两个窗体,Form1按钮打开Form2,然后在Form2的TextBox输入值在Form1的TextBox中显示出来. 一.项目结构 Form1窗体设计: Form2窗体设计: 二.代码实现 在Form2的代码中声明一个委托(写在Form2类外)-> public delegate void ChangeFor

winform 常用窗体属性

WinForm常用窗体属性: Form常用属性 AutoSizeMode属性 :值是: GrowAndShrink不能调整窗体大小 :值是:GrowOnly 可以改变大小 (1)Name属性:用来获取或设置窗体的名称. (2)WindowState属性:用来获取或设置窗体的窗口状态. (3)StartPosition属性:用来获取或设置运行时窗体的起始位置. (4)Text属性:该属性是一个字符串属性,用来设置或返回在窗口标题栏中显示的文字. (5)Width属性:用来获取或设置窗体的宽度. (

winform 的窗体美化的心酸

其实一直都很懒,很想做点什么.有时会为自己的一个目标狂热,但经常发觉激情过后更多的总是为自己找借口! 我想做一位狂热的程序猿粪子! 最近感觉奔三将近.逐有感而发,不能再这样下去了. 即拿出以前自己为那狂热好一阵的东西续断下去. 一直想为自己开发一套控件库,但感觉精力确实有限,也没那么多时间,逐当初就停止了这种热情. 这是套窗体皮肤,断断续续所花费的时间也不少. 下面我介绍下我的这套皮肤,其实也算不上一套,只算是个开始吧. 有人可能会想这不就是边框隐藏再绘制客户区么,这是目前大部人会选择的方案.但

WinForm开发,窗体显示和窗体传值相关知识总结

以前对WinForm窗体显示和窗体间传值了解不是很清楚最近做了一些WinForm开发,把用到的相关知识整理如下 A.WinForm中窗体显示显示窗体可以有以下2种方法:Form.ShowDialog方法 (窗体显示为模式窗体)Form.Show方法 (窗体显示为无模式窗体) 2者具体区别如下:1.在调用Form.Show方法后,Show方法后面的代码会立即执行2.在调用Form.ShowDialog方法后,直到关闭对话框后,才执行此方法后面的代码3.当窗体显示为模式窗体时,单击"关闭"

WinForm自定义窗体

public partial class Form3 : Form { const int WM_NCHITTEST = 0x0084; const int HT_LEFT = 10; const int HT_RIGHT = 11; const int HT_TOP = 12; const int HT_TOPLEFT = 13; const int HT_TOPRIGHT = 14; const int HT_BOTTOM = 15; const int HT_BOTTOMLEFT = 16

Winform子窗体刷新父窗体

调用窗体(父):Form1,被调用窗体(子):Form2方法1:   所有权法//Form1://需要有一个公共的刷新方法public   void   Refresh_Method(){//...}//在调用Form2时,要把Form2的所有者设为Form1Form2   f2   =   new   Form2()   ;f2.Owner   =   this;f2.ShowDialog()   ;//Form2://在需要对其调用者(父)刷新时Form1   f1   ;f1   =  

WinForm 子窗体在父窗体范围内移动,不能出父窗体 摘自于网络

详细解释:1, 主窗体Form1属性IsMdiContainer设为True,并添加ToolStrip控件, Toolstrip中添加一个按钮toolStripButton1.         2,添加新窗体Form2.           3,主窗体Form1中toolStripButton1的Click事件           private void toolStripButton1_Click(object sender, EventArgs e)         {          

WinForm 设置窗体启动位置在活动屏幕右下角

WinForm 设置窗体启动位置在活动屏幕右下角 在多屏幕环境下, 默认使用鼠标所在的屏幕 1. 设置窗体的 StartPosition 为 FormStartPosition.Manual. 2. 获取鼠标所在屏幕: var screen = Screen.FromPoint(new Point(Cursor.Position.X, Cursor.Position.Y)); 3. 计算并设置窗体位置坐标: var x = screen.WorkingArea.X + screen.Workin

WinForm 多窗体、菜单和工具栏

今天,我首先先学习了一下在WinForm程序开发中常遇到的问题——多窗体程序运行问题. 在开发多窗体程序时,常会遇到以下四个方面的问题: 一.哪个是主窗体 问题:主窗体隐藏了,关闭其它窗体后,没有将主窗体显示/关闭,那么程序就关不上了. 当遇到这个问题时,我们通常的解决办法是:构造函数传值,将窗体传到另一个窗体中去,进行关闭. 二.窗体只能打开一个 创建一个全局的泛型集合,为了放置全部打开的窗体.在窗体打开之前,判断集合中是否有name一致的窗体,如果有就说明已经打开了,就不要再打开了. 问题: