C # WinForm - ekran ładowania
Chciałbym zapytać, jak zrobić ekran ładowania (tylko zdjęcie lub coś), który pojawia się podczas ładowania programu i znika po zakończeniu ładowania programu.
W bardziej wyszukanych wersjach widziałem wyświetlany pasek procesu ( % ). jak możesz to mieć i jak obliczyć%, aby pokazać na nim?
Wiem, że istnieje Zdarzenie Form_Load (), ale nigdzie nie widzę zdarzenia Form_Loaded () ani % jako właściwości / atrybutu.
3 answers
Wszystko, czego potrzebujesz, aby utworzyć jeden formularz jako ekran powitalny i pokazać go przed głównym rozpoczęciem wyświetlania strony docelowej i zamknąć ten splash po załadowaniu strony docelowej.
using System.Threading;
using System.Windows.Forms;
namespace MyTools
{
public class SplashForm : Form
{
//Delegate for cross thread call to close
private delegate void CloseDelegate();
//The type of form to be displayed as the splash screen.
private static SplashForm splashForm;
static public void ShowSplashScreen()
{
// Make sure it is only launched once.
if (splashForm != null)
return;
Thread thread = new Thread(new ThreadStart(SplashForm.ShowForm));
thread.IsBackground = true;
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
}
static private void ShowForm()
{
splashForm = new SplashForm();
Application.Run(splashForm);
}
static public void CloseForm()
{
splashForm.Invoke(new CloseDelegate(SplashForm.CloseFormInternal));
}
static private void CloseFormInternal()
{
splashForm.Close();
splashForm = null;
}
}
}
A główna funkcja programu wygląda tak:
[STAThread]
static void Main(string[] args)
{
SplashForm.ShowSplashScreen();
MainForm mainForm = new MainForm(); //this takes ages
SplashForm.CloseForm();
Application.Run(mainForm);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-15 01:07:01
Jeśli masz zamiar pokazać SplashForm więcej niż jeden raz w aplikacji, pamiętaj, aby ustawić zmienną splashForm na null, w przeciwnym razie pojawi się błąd.
static private void CloseFormInternal()
{
splashForm.Close();
splashForm = null;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-12 17:00:51
Miałem problem ze wszystkimi innymi rozwiązaniami, które znalazłem, szczególnie tymi, które pokazują splash w innym wątku niż wątek gui, a szczególnie na Citrix.
Przykład:
- Splash nigdy się nie zamyka
- Splash show NA złym monitorze
- Splash show ok ale mainform jest wyświetlany za wszystkimi innymi oknami
Forma Splash:
public partial class Splash : Form
{
public Splash()
{
InitializeComponent();
}
private void pictureBox1_Click(object sender, EventArgs e)
{
}
}
Splash form cont:
partial class Splash
{
private System.ComponentModel.IContainer components = null;
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Splash));
this.pictureBox1 = new System.Windows.Forms.PictureBox();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.SuspendLayout();
//
// pictureBox1
//
this.pictureBox1.Dock = System.Windows.Forms.DockStyle.Fill;
this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image")));
this.pictureBox1.Location = new System.Drawing.Point(0, 0);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(512, 224);
this.pictureBox1.TabIndex = 0;
this.pictureBox1.TabStop = false;
this.pictureBox1.Click += new System.EventHandler(this.pictureBox1_Click);
//
// Splash
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(512, 224);
this.ControlBox = false;
this.Controls.Add(this.pictureBox1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.Name = "Splash";
this.ShowIcon = false;
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Splash";
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.PictureBox pictureBox1;
}
Główna:
[STAThread]
static void Main(string[] _args)
{
ShowSplash();
MainForm mainForm = new MainForm();
Application.Run(mainForm);
}
private static void ShowSplash()
{
Splash sp = new Splash();
sp.Show();
Application.DoEvents();
System.Windows.Forms.Timer t = new System.Windows.Forms.Timer();
t.Interval = 1000;
t.Tick += new EventHandler((sender, ea) =>
{
sp.BeginInvoke(new Action(() =>
{
if (sp != null && Application.OpenForms.Count > 1)
{
sp.Close();
sp.Dispose();
sp = null;
t.Stop();
t.Dispose();
t = null;
}
}));
});
t.Start();
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-25 09:19:31