Saltar al contenido

C# WinForm – pantalla de carga

Daniella, parte de nuestro equipo de trabajo, nos hizo el favor de crear esta crónica porque conoce perfectamente dicho tema.

Solución:

todo lo que necesita para crear un formulario como pantalla de inicio y mostrarlo antes de que comience a mostrar la página de inicio y cierre este inicio una vez que se cargue la página de inicio.

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;
            splashForm = new SplashScreen();
            Thread thread = new Thread(new ThreadStart(SplashForm.ShowForm));
            thread.IsBackground = true;
            thread.SetApartmentState(ApartmentState.STA);
            thread.Start();
        

        static private void ShowForm()
        
            if (splashForm != null) Application.Run(splashForm);
        

        static public void CloseForm()
        
            splashForm?.Invoke(new CloseDelegate(SplashForm.CloseFormInternal));
        

        static private void CloseFormInternal()
        
            if (splashForm != null)
            
               splashForm.Close();
               splashForm = null;
            ;
        
    

y la función principal del programa se ve así:

[STAThread]
static void Main(string[] args)

    SplashForm.ShowSplashScreen();
    MainForm mainForm = new MainForm(); //this takes ages
    SplashForm.CloseForm();
    Application.Run(mainForm);

No olvide agregar un evento de carga de formulario a su formulario principal:

private void MainForm_Load(object sender, EventArgs e)

    this.WindowState = FormWindowState.Minimized; 
    this.WindowState = FormWindowState.Normal;
    this.Focus(); this.Show();

Traerá el formulario principal al primer plano después de ocultar la pantalla de bienvenida.

Tuve problemas con todas las demás soluciones que encontré, especialmente aquellas que muestran salpicaduras en otros subprocesos que no sean gui y especialmente en Citrix.

Ejemplo:

  • Splash nunca cierra
  • Splash show en el monitor equivocado
  • Splash show ok pero mainform se muestra detrás de todas las demás ventanas

Terminé con esto y parece funcionar bien.

Forma de salpicadura:

public partial class Splash : Form

    public Splash()
    
        InitializeComponent();
    

    private void pictureBox1_Click(object sender, EventArgs e)
    

    

continuación del formulario de presentación:

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;

Principal:

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

Aquí puedes ver las comentarios y valoraciones de los usuarios

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *