2011-10-31 33 views
46

Tôi cần hiển thị màn hình giật gân khi khởi động ứng dụng trong vài giây. Có ai biết làm thế nào để thực hiện điều này?Làm thế nào để xây dựng màn hình giật gân trong ứng dụng biểu mẫu cửa sổ?

Sẽ được nhiều người đánh giá cao vì sự trợ giúp.

+7

+1 vì không có ví dụ REAL của một splash tốt cho đến nay. Tôi đã tham gia vào một triển khai lộn xộn từ các blog và trang web khác nhau nhưng một trang web tốt đã xuất hiện sau nhiều rắc rối. Câu hỏi là rất tốt. –

+0

Có một tùy chọn khác không yêu cầu bạn sử dụng bộ hẹn giờ hoặc giữ tham chiếu biểu mẫu giật gân trong biểu mẫu chính hoặc ngược lại: http://stackoverflow.com/questions/7963275 – Veldmuis

+0

bản sao có thể có của [Ví dụ về màn hình giật gân] (http://stackoverflow.com/questions/2455703/splash-screen-example) –

Trả lời

64

Đầu tiên, tạo màn hình giật gân dưới dạng không biên giới, bất động với hình ảnh của bạn trên đó trung tâm của màn hình, tô màu theo cách bạn muốn. Tất cả điều này có thể được thiết lập từ bên trong nhà thiết kế; Cụ thể, bạn muốn:

  • Đặt thuộc tính ControlBox, MaximizeBox, MinimizeBox và ShowIcon của hình thức để "False"
  • Thiết lập thuộc tính StartPosition để "CenterScreen"
  • Thiết lập thuộc tính FormBorderStyle để "Không"
  • Đặt MinimumSize và MaximumSize của biểu mẫu giống với Kích thước ban đầu của biểu mẫu.

Sau đó, bạn cần quyết định vị trí hiển thị địa điểm và vị trí loại bỏ nó. Hai nhiệm vụ này cần phải xảy ra ở các mặt đối diện của logic khởi động chính của chương trình của bạn. Điều này có thể nằm trong thủ tục chính của ứng dụng() của bạn, hoặc có thể trong trình xử lý tải của biểu mẫu ứng dụng chính của bạn; bất cứ nơi nào bạn đang tạo ra các đối tượng đắt tiền, đọc cài đặt từ ổ cứng và thường mất nhiều thời gian để thực hiện các công cụ đằng sau hậu trường trước khi màn hình ứng dụng chính hiển thị.

Sau đó, tất cả những gì bạn phải làm là tạo một thể hiện biểu mẫu của bạn, Hiển thị() và giữ tham chiếu đến nó trong khi bạn khởi tạo khởi động. Khi biểu mẫu chính của bạn đã được tải, hãy đóng() nó.

Nếu màn hình giật gân của bạn sẽ có một hình ảnh động trên đó, cửa sổ sẽ cần phải được "đệm đôi" và bạn sẽ cần phải chắc chắn rằng tất cả logic khởi tạo xảy ra bên ngoài luồng GUI (có nghĩa là bạn không thể có logic tải chính của bạn trong trình xử lý tải của biểu mẫu chính, bạn sẽ phải tạo một BackgroundWorker hoặc một số thường trình luồng khác.

+3

Màn hình giật gân cũng nên chạy trên một chuỗi riêng biệt để có một tiến trình chạy ẩn để ứng dụng của bạn có thể làm việc trong khi được hiển thị (ví dụ: kết nối vào cơ sở dữ liệu của bạn, tải các tệp). Nó cho người dùng biết rằng ứng dụng của bạn đang chạy và nó không lãng phí thời gian của họ bằng cách chỉ ở đó cho X số giây. –

+1

+1 để biết chi tiết. Tôi đã tạo ra một giật gân ở đây bằng cách sử dụng một vòng lặp ứng dụng mới (Application.Run) cho nó và một cách tiếp cận singleton để tôi có thể tạo giật gân ngay từ đầu và đóng nó ngay trước khi biểu mẫu đăng nhập được hiển thị. –

+0

@ALMMa - Tôi thực tế cũng giống như việc xây dựng màn hình giật gân, bao gồm khả năng ẩn hoặc "vịt" một cách rõ ràng bằng lệnh hoặc nếu một số loại cửa sổ nhất định (ike Windows Security dialog dialog) được phát hiện. – KeithS

6

Dưới đây là một số bước hướng dẫn ...

  1. Tạo một hình thức không biên giới (điều này sẽ được màn hình của bạn)
  2. On bắt đầu ứng dụng, bắt đầu một giờ (với khoảng vài giây)
  3. Hiện Mẫu Splash bạn
  4. Mở sự kiện Timer.Tick, hẹn giờ và hình thức Splash gần dừng lại - sau đó hiển thị dưới dạng ứng dụng chính của bạn

Hãy thử điều này và nếu bạn gặp khó khăn, hãy quay trở lại và hỏi thêm các câu hỏi cụ thể liên quan đến vấn đề của bạn

1

Trước tiên, bạn nên tạo một hình thức có hoặc không có biên giới (cửa ít được ưa thích cho những việc này)

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(); 
    }  
} 

Tại Main bạn nên sử dụng mà

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

Điều này thật tệ. Điều này sẽ làm cho SplashForm của bạn, Biểu mẫu chính của ứng dụng của bạn. Điều này có nghĩa là khi bạn đóng ứng dụng, ứng dụng sẽ dừng lại –

2

tạo giật gân

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(); 

Sau đó, trong đơn đăng ký

của bạn
sp = new Splash(); 
sp.ShowDialog(); 
1

Các câu trả lời khác ở đây bao gồm điều này, nhưng nó là giá trị biết rằng có được xây dựng trong chức năng cho màn hình giật gân trong Visual Studio: Nếu bạn mở các thuộc tính dự án cho các ứng dụng hình thức cửa sổ và nhìn vào tab ứng dụng, có là một tùy chọn "Splash screen:" ở phía dưới. Bạn chỉ cần chọn biểu mẫu nào trong ứng dụng bạn muốn hiển thị dưới dạng màn hình giật gân và nó sẽ chú ý hiển thị nó khi ứng dụng bắt đầu và ẩn nó khi biểu mẫu chính của bạn được hiển thị.

Bạn vẫn cần phải thiết lập hình thức như đã mô tả ở trên (với biên giới đúng, vị trí, kích thước, vv)

+0

Điều này nghe có vẻ lý tưởng, nhưng tôi không thể thấy tùy chọn này (trong VS 2013). Các tài liệu tham khảo duy nhất tôi có thể tìm thấy trực tuyến chỉ dành cho Visual Basic, vì vậy có lẽ nó chỉ được hỗ trợ cho điều đó? – Giles

+1

Hi @Giles, điều đó cũng có thể là trường hợp, tôi chỉ sử dụng nó trên các ứng dụng VB – tomRedox

2

A Pretty Good Splash Screen qua trên CodeProject.

Nó đi kèm với

  • Fade In
  • Progress Bar
  • Status Label
  • Fade Out
  • Double Click để bỏ

Tác giả gần đây đã trải qua và đã cập nhật mã. Nó thực sự là một phần công việc và là sự hợp tác giữa nhiều nhà phát triển khác nhau với những ý tưởng hay.

10

Mẫu bên dưới từ Telerik sử dụng điều khiển Định dạng hình dạng tuy nhiên thay đổi thành dạng Windows thông thường. Đây là cách dễ nhất và tốt nhất mà tôi từng thấy.

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

+1

Điều này thực sự là nhiều thông tin hơn câu trả lời được chấp nhận, với mã mẫu, mặc dù nó là một câu trả lời chỉ liên kết. – Kaitlyn

+0

Vấn đề tôi có ở đây là khi biểu mẫu được mở ra, nó được mở ở phía sau của tất cả các cửa sổ khác và tôi dường như không thể tìm ra cách để đưa nó ra phía trước. Không có gì có vẻ hiệu quả. Bất kỳ đề xuất? – JSON

+0

Tôi đã tìm ra điều đó. Trong trường hợp bất kỳ ai khác đang gặp vấn đề tương tự, hãy thêm hai dòng này vào cuối phương thức mainForm_Load ((Form1)) .TopMost = true; ((Form1) người gửi) .BringToFront(); – JSON

4

đơn giản và giải pháp dễ dàng để tạo ra màn hình splash

  1. mở mới tên sử dụng hình thức "SPLASH"
  2. hình nền
  3. thay đổi bất cứ điều gì bạn muốn
  4. chọn thanh tiến trình
  5. chọn hẹn giờ

bây giờ thiết lập bộ đếm thời gian đánh dấu trong timer:

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

thêm mới tên sử dụng hình thức "MẪU-1" và sử dụng lệnh trong MẪU 1 sau.

lưu ý: hình thức Splash làm việc trước khi mở Form1 bạn

  1. thêm thư viện này

    using System.Threading; 
    
  2. tạo chức năng

    public void splash() 
    {  
        Application.Run(new splash()); 
    } 
    
  3. sử dụng lệnh sau đây trong phần khởi tạo như dưới đây.

    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

Đây là ví dụ đơn giản và tốt nhất mà tôi đã tìm thấy. Làm việc hoàn hảo. –

+0

@TylerDurden, * đơn giản nhất * và * tốt nhất *? Kiểm tra [this one] (http://stackoverflow.com/a/15836105/1997232) thay vào đó (và tôi cẩn thận gọi nó * đủ tốt * bản thân mình). – Sinatr

+0

Cảm ơn @Sinatr, tôi có lẽ sẽ sử dụng triển khai lần sau, có vẻ linh hoạt hơn nhiều. Giải pháp này đơn giản hơn khi tôi chọn C#, ban đầu tôi tìm kiếm một giải pháp đơn giản, không yêu cầu các đại biểu và quá nhiều luồng. Tôi cũng đã học được rằng _best solution_ thay đổi khi bạn học các phương pháp mới;) Cảm ơn bạn đã chia sẻ –

0

Hãy thử mã này

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

Câu trả lời này có thể sử dụng một số giải thích. – Raidri

Các vấn đề liên quan