web-dev-qa-db-fra.com

Comment construire un écran de démarrage dans l'application Windows Forms?

Je dois afficher l'écran de démarrage au démarrage de mon application pendant quelques secondes. Est-ce que quelqu'un sait comment mettre cela en œuvre?

Sera beaucoup apprécié pour l'aide.

53
mironych

Tout d’abord, créez votre écran de démarrage comme une forme immuable, sans bordure, avec votre image dessus, paramétré pour s’afficher initialement au centre de l’écran et coloré comme vous le souhaitez. Tout cela peut être défini depuis le concepteur; Plus précisément, vous voulez:

  • Définissez les propriétés ControlBox, MaximizeBox, MinimizeBox et ShowIcon du formulaire sur "False"
  • Définissez la propriété StartPosition sur "CenterScreen"
  • Définissez la propriété FormBorderStyle sur "Aucune"
  • Définissez MinimumSize et MaximumSize du formulaire sur la même taille que sa taille initiale.

Ensuite, vous devez décider où le montrer et où le rejeter. Ces deux tâches doivent être effectuées de part et d'autre de la logique de démarrage principale de votre programme. Cela pourrait être dans la routine main () de votre application, ou éventuellement dans le gestionnaire de charge de votre formulaire de demande principale; partout où vous créez de gros objets coûteux, lisez les paramètres du disque dur et prenez généralement beaucoup de temps pour effectuer des tâches en arrière-plan avant l'affichage de l'écran principal de l'application.

Ensuite, tout ce que vous avez à faire est de créer une instance de votre formulaire, Show (), et de conserver une référence à celle-ci pendant votre initialisation au démarrage. Une fois que votre formulaire principal a été chargé, fermez-le ().

Si votre écran de démarrage contient une image animée, la fenêtre devra également être "mise en tampon double", et vous devrez être absolument sûr que toute la logique d'initialisation se déroule en dehors du fil de l'interface graphique Logique de chargement dans le gestionnaire de chargement de mainform, vous devrez créer un BackgroundWorker ou une autre routine threadée.

70
KeithS

Voici quelques étapes à suivre ...

  1. Créez un formulaire sans bordure (ce sera votre écran de démarrage)
  2. Au démarrage de l'application, lancez une minuterie (avec un intervalle de quelques secondes)
  3. Montrez votre formulaire Splash
  4. Sur l'événement Timer.Tick, arrêtez le chronomètre et fermez le formulaire Splash - puis affichez votre formulaire de demande principal

Essayez-le et si vous êtes bloqué, revenez et posez des questions plus spécifiques sur vos problèmes.

7
musefan

solution simple et facile pour créer un écran de démarrage

  1. ouvrir un nouveau nom d’utilisation de formulaire "SPLASH"
  2. change l'image de fond comme tu veux
  3. sélectionner la barre de progression
  4. sélectionner la minuterie

maintenant mettre la minuterie en minuterie:

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

ajoutez un nouveau formulaire, utilisez le nom "FORM-1" et utilisez la commande suivante du FORMULAIRE 1.

remarque: le formulaire Splash fonctionne avant d'ouvrir votre formulaire1

  1. ajouter cette bibliothèque

    using System.Threading;
    
  2. créer une fonction

    public void splash()
    {     
        Application.Run(new splash());
    }
    
  3. utilisez la commande suivante en initialisation comme ci-dessous.

    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/

5
Hani Mehdi

Il y a un très bon écran de démarrage plus sur CodeProject.

Il est livré avec

  • Fondu
  • Barre de progression
  • Étiquette de statut
  • Disparaître
  • Double Clic pour rejeter

L'auteur a récemment parcouru et mis à jour le code. C'est vraiment un travail considérable, une collaboration entre de nombreux développeurs ayant de bonnes idées.

3
jp2code

créer des éclaboussures

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

Puis dans votre application

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

Les autres réponses ici couvrent bien cela, mais il est bon de savoir qu'il existe une fonctionnalité intégrée pour les écrans de démarrage dans Visual Studio: Si vous ouvrez les propriétés du projet pour l'application de formulaire Windows et que vous consultez l'onglet Application, il existe un "écran de démarrage". : "option en bas. Vous choisissez simplement le formulaire de votre application que vous souhaitez afficher en tant qu'écran de démarrage. Celui-ci se chargera de l'afficher au démarrage de l'application et de le masquer une fois votre formulaire principal affiché.

Vous devez toujours configurer votre formulaire comme décrit ci-dessus (avec les bordures, le positionnement, le dimensionnement, etc. corrects)

2
tomRedox

Je voulais un écran de démarrage pouvant être affiché jusqu'à ce que le formulaire du programme principal soit prêt à être affiché. Les minuteries, etc. Je voulais aussi que ce soit aussi simple que possible . Mon application commence par (abrégé):

static void Main()
{
    Splash frmSplash = new Splash();
    frmSplash.Show();
    Application.Run(new ReportExplorer(frmSplash));
}

Ensuite, ReportExplorer présente les éléments suivants:

public ReportExplorer(Splash frmSplash)
{
    this.frmSplash = frmSplash;
    InitializeComponent();
}

Enfin, après tout l'initialisation est terminée:

if (frmSplash != null) 
{
     frmSplash.Close();
     frmSplash = null;
}

Peut-être me manque quelque chose, mais cela semble beaucoup plus facile que de se faufiler avec des threads et des minuteries.

1
AndrewB

Tout d'abord, vous devez créer un formulaire avec ou sans bordure (sans bordure est préférable pour ces choses)

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

À Main, vous devriez utiliser ça

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

Peut-être un peu tard pour répondre, mais je voudrais partager mon chemin ... J'ai trouvé un moyen facile avec des threads dans le programme principal pour une application Winform.

Disons que vous avez votre formulaire "splashscreen" avec une animation et votre "main" qui contient tout votre code d'application.

 [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Thread mythread;
        mythread = new Thread(new ThreadStart(ThreadLoop));
        mythread.Start();
        Application.Run(new MainForm(mythread));           
    }

    public static void ThreadLoop()
    {
        Application.Run(new SplashScreenForm());           
    }

Dans votre formulaire principal dans le constructeur:

 public MainForm(Thread splashscreenthread)
    {
        InitializeComponent();

        //add your constructor code

        splashscreenthread.Abort();            
    }

De cette façon, l'écran de démarrage ne durera que le temps nécessaire au chargement de votre formulaire principal.

Votre formulaire d’écran d’ouverture doit avoir sa propre manière d’animer/d’afficher des informations ..__ Dans mon projet, mon écran d’ouverture affiche un nouveau fil, et toutes les x millisecondes, il modifie son image principale en une autre, ce qui donne l’illusion d’une rotation.

exemple de mon écran de démarrage:

int status = 0;
private bool IsRunning = false;
    public Form1()
    {
        InitializeComponent();
        StartAnimation();
    }

    public void StartAnimation()
    {
        backgroundWorker1.WorkerReportsProgress = false;
        backgroundWorker1.WorkerSupportsCancellation = true;
        IsRunning = true;
        backgroundWorker1.RunWorkerAsync();
    }


    public void StopAnimation()
    {
        backgroundWorker1.CancelAsync();
    }

    delegate void UpdatingThreadAnimation();
    public void UpdateAnimationFromThread()
    {

        try
        {
            if (label1.InvokeRequired == false)
            {
                UpdateAnimation();
            }
            else
            {
                UpdatingThreadAnimation d = new UpdatingThreadAnimation(UpdateAnimationFromThread);
                this.Invoke(d, new object[] { });
            }
        }
        catch(Exception e)
        {

        }
    }

 private void UpdateAnimation()
    {
    if(status ==0) 
    {
    // mypicture.image = image1
     }else if(status ==1)
     {
    // mypicture.image = image2
     }
    //doing as much as needed

      status++;
        if(status>1) //change here if you have more image, the idea is to set a cycle of images
        {
            status = 0;
        }
        this.Refresh();
    }

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;
        while (IsRunning == true)
        {
            System.Threading.Thread.Sleep(100);
            UpdateAnimationFromThread();
        }
    }

J'espère que cela aidera certaines personnes .. Désolé de m'être trompé. L'anglais n'est pas ma langue maternelle.

0
Ornithorix