2011-10-31 105 views
46

我需要在我的應用程序啓動時顯示啓動屏幕幾秒鐘。有誰知道如何實現這個?如何在windows窗體應用程序中創建啓動畫面?

非常感謝您的幫助。

+7

1,因爲有一個很好的防濺沒有實際例子至今。我已經從不同的博客和網站進行了一個混亂的實施,但很好的一個經歷了很多麻煩後纔出現。這個問題真的很好。 –

+0

還有一個選項不需要你使用計時器或在你的主窗體中保存你的飛濺窗體的引用,反之亦然:http://stackoverflow.com/questions/7963275 – Veldmuis

+0

[啓動屏幕示例]的可能重複( http://stackoverflow.com/questions/2455703/splash-screen-example) –

回答

64

首先,創建你的啓動畫面作爲一個無邊界,不可移動的形式與它的圖像,設置爲初始顯示在屏幕中心,以您想要的方式着色。所有這些都可以從設計師那裏設置;具體而言,你希望:

  • 設置窗體的控制框,MaximizeBox,MinimizeBox和ShowIcon屬性設置爲「假」
  • 設置中StartPosition屬性設置爲「中心屏幕」
  • 將FormBorderStyle屬性設置爲「無」
  • 將窗體的MinimumSize和MaximumSize設置爲與其初始大小相同。

然後,您需要決定在哪裏顯示它以及在哪裏解除它。這兩項任務需要在程序的主要啓動邏輯的兩側進行。這可能在您的應用程序的main()例程中,或者可能在您的主應用程序表單的Load處理程序中;無論您在哪裏創建大型昂貴物體,從硬盤驅動器讀取設置,並且在主應用程序屏幕顯示之前通常需要很長時間才能在幕後執行任何操作。然後,你所要做的就是創建一個你的窗體的實例,Show()它,並在你啓動初始化的時候保存對它的引用。一旦你的主窗體加載完畢,關閉()它。

如果你的啓動畫面上有一個動畫圖像,窗口也需要「雙緩衝」,你需要確保所有的初始化邏輯發生在GUI線程之外(這意味着你在mainform的Load處理程序中不能擁有主加載邏輯;您必須創建BackgroundWorker或其他線程例程。

+3

啓動畫面還應該運行在一個單獨的線程上,讓進程在後臺運行,以便應用程序可以在顯示時進行工作(例如,連接到你的數據庫,加載文件)。它告訴用戶您的應用程序正在運行,並且不會因爲停留在那裏幾秒鐘而浪費時間。詳情請致電 –

+1

+1。我使用一個新的應用程序循環(Application.Run)爲它創建了一個啓動畫面,並使用單例方法,因此我可以在啓動時創建啓動畫面,並在顯示登錄窗體之前將其關閉。 –

+0

@ALMMa - 我在構建啓動屏幕實現方面做了幾乎相同的事情,包括通過命令或如果檢測到特定類型的窗口(ike Windows安全登錄對話框)顯式隱藏或「隱藏」它的能力。 – KeithS

6

這裏有一些指導步驟...

  1. 創建一個無國界的形式(這將是您的閃屏)
  2. 在應用程序啓動,啓動一個定時器(有幾秒鐘的時間間隔)
  3. 顯示你飛濺形式
  4. 在Timer.Tick事件,停止定時器並關閉飛濺形式 - 然後顯示您的主申請表

放棄這一步,如果你卡住,然後回來,並提出更具體的問題相關的問題

1

首先,你應該創建一個表單有或無邊界(境少優先爲這些事情)

public class SplashForm : Form 
{ 
    Form _Parent; 
    BackgroundWorker worker; 
    public SplashForm(Form parent) 
    { 
     InitializeComponent(); 
     BackgroundWorker worker = new BackgroundWorker(); 
     this.worker.DoWork += new System.ComponentModel.DoWorkEventHandler(this.worker _DoWork); 
     backgroundWorker1.RunWorkerAsync(); 
     _Parent = parent; 
    } 
    private void worker _DoWork(object sender, DoWorkEventArgs e) 
    { 
     Thread.sleep(500); 
     this.hide(); 
     _Parent.show(); 
    }  
} 

在主,你應該使用

static class Program 
     { 
      [STAThread] 
      static void Main() 
      { 
       Application.EnableVisualStyles(); 
       Application.SetCompatibleTextRenderingDefault(false); 
       Application.Run(new SplashForm()); 
      } 
     } 
+1

這很糟糕。這將使您的SplashForm,您的應用程序的主要形式。這意味着當你關閉它時,應用程序將停止 –

2

創建飛濺

private void timer1_Tick(object sender, EventArgs e) 
{ 
    counter++; 
    progressBar1.Value = counter *5; 
    // label2.Text = (5*counter).ToString(); 
    if (counter ==20) 
    { 
     timer1.Stop(); 
     this.Close(); 
    } 
} 
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
this.BackColor = System.Drawing.SystemColors.GradientInactiveCaption; 
this.ClientSize = new System.Drawing.Size(397, 283); 
this.ControlBox = false; 
this.Controls.Add(this.label2); 
this.Controls.Add(this.progressBar1); 
this.Controls.Add(this.label1); 
this.ForeColor = System.Drawing.SystemColors.ControlLightLight; 
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; 
this.Name = "Splash"; 
this.ShowIcon = false; 
this.ShowInTaskbar = false; 
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; 
this.ResumeLayout(false); 
this.PerformLayout(); 

然後在您的應用程序中

sp = new Splash(); 
sp.ShowDialog(); 
1

這裏的其他答案涵蓋了這一點,但值得一提的是Visual Studio中的啓動畫面的功能已經內置:如果您打開Windows窗體應用程序的項目屬性並查看應用程序選項卡,底部是一個「閃屏:」選項。您只需選擇您想要顯示的應用程序中的哪個表單作爲啓動屏幕,並在應用程序啓動時顯示它,並在顯示主窗體後隱藏它。

您仍需要設置窗體如上所述(用正確的邊界,定位,大小等)

+0

這聽起來很理想,但我看不到這個選項(在VS 2013中)。我可以在網上找到的唯一參考僅適用於Visual Basic,因此可能僅支持該參數? – Giles

+1

Hi @Giles,很可能是這種情況,我只在VB應用上使用它 – tomRedox

2

A Pretty Good Splash Screen在CodeProject上。

它配備了

  • 淡入
  • 進度條
  • 狀態標籤
  • 淡出
  • 雙擊駁回

筆者通過最近消失了,更新了代碼。這確實是一項相當大的工作,並且是許多不同開發人員之間的合作,並且有很好的想法。

10

以下來自Telerik的示例使用ShapedForm控件,但是將其更改爲正常的Windows窗體。這是迄今爲止我見過的最簡單也是最好的方式。

http://www.telerik.com/support/kb/winforms/forms-and-dialogs/details/add-splashscreen-to-your-application

+1

這實際上比接受的答案更具信息性,帶有示例代碼,儘管它只是一個鏈接唯一的答案。 – Kaitlyn

+0

我在這裏遇到的問題是當窗體打開時,窗體在所有其他窗體的背面打開,我似乎無法弄清楚如何將它放在前面。似乎沒有任何工作。有什麼建議麼? – JSON

+0

我想通了。在其他人遇到同樣問題的情況下,將這兩行添加到mainForm_Load方法((Form1)發件人的末尾).TopMost = true; ((Form1)sender).BringToFront(); – JSON

4

簡便解決方案創建閃屏

  1. 開放的新形式使用的名稱「撲通」任何你想要的
  2. 選擇進度條
  3. 選擇
  4. 變化的背景圖片定時器

現在設置計時器滴答定時器:

private void timer1_Tick(object sender, EventArgs e) 
{ 
    progressBar1.Increment(1); 
    if (progressBar1.Value == 100) timer1.Stop();   
} 

添加新的形式使用的名稱 「FORM-1」,並按照表格1命令使用。

注:飛濺形式打開你的Form1中之前的作品

  1. 在初始化添加此庫

    using System.Threading; 
    
  2. 創建功能

    public void splash() 
    {  
        Application.Run(new splash()); 
    } 
    
  3. 使用下面的命令如下圖所示。

    public partial class login : Form 
    {  
        public login() 
        { 
         Thread t = new Thread(new ThreadStart(splash)); 
         t.Start(); 
         Thread.Sleep(15625); 
    
         InitializeComponent(); 
    
         enter code here 
    
         t.Abort(); 
        } 
    } 
    

http://solutions.musanitech.com/c-create-splash-screen/

+1

這是我找到的最簡單,最好的例子。完美工作。 –

+0

@TylerDurden,*最簡單*和*最好*?檢查[這一個](http://stackoverflow.com/a/15836105/1997232),而不是(我會仔細地稱它*自己好)。 – Sinatr

+0

謝謝@Sinatr,下次我可能會使用該實現,它看起來更加靈活。當我拿起c#時,這個解決方案更簡單了,我最初正在尋找一個簡單的解決方案,它不需要委託和過多的線程。我還了解到,在學習新方法時,_best solution_會發生變化;)感謝分享 –

0

試試這個代碼

public partial class ssplashscreen : Form 
    { 
     public ssplashscreen() 
     {     
      InitializeComponent();  
     } 

     private void timer1_Tick(object sender, EventArgs e) 
     { 
      progressBar1.Increment(1); 
      if (progressBar1.Value == 100) 
      { 
       timer1.Stop(); 
       this.Hide(); 
       Form frm = new login(); 
       frm.Show(); 
      } 
     } 
    } 
+1

這個答案可以使用一些解釋。 – Raidri

相關問題