webentwicklung-frage-antwort-db.com.de

Wie erstelle ich einen Begrüßungsbildschirm in einer Windows Forms-Anwendung?

Ich muss den Startbildschirm für einige Sekunden auf dem Start meiner Anwendung zeigen. Weiß jemand, wie man das umsetzt?

Wird für die Hilfe sehr dankbar sein.

53
mironych

Erstellen Sie zunächst Ihren Begrüßungsbildschirm als randloses, unverrückbares Formular mit dem darauf befindlichen Bild. Legen Sie zunächst fest, dass er in der Mitte des Bildschirms in der gewünschten Farbe angezeigt wird. All dies kann vom Designer aus eingestellt werden. Sie möchten insbesondere:

  • Setzen Sie die Eigenschaften ControlBox, MaximizeBox, MinimizeBox und ShowIcon des Formulars auf "False".
  • Legen Sie die StartPosition-Eigenschaft auf "CenterScreen" fest.
  • Setzen Sie die FormBorderStyle-Eigenschaft auf "None".
  • Legen Sie MinimumSize und MaximumSize des Formulars auf die ursprüngliche Größe fest.

Dann müssen Sie entscheiden, wo Sie ihn zeigen und wo Sie ihn abweisen sollen. Diese beiden Aufgaben müssen auf gegenüberliegenden Seiten der Hauptstartlogik Ihres Programms ausgeführt werden. Dies kann sich in der Routine main () Ihrer Anwendung oder möglicherweise im Ladehandler Ihres Hauptanwendungsformulars befinden. Überall dort, wo Sie große, teure Objekte erstellen, Einstellungen von der Festplatte lesen und generell viel Zeit benötigen, um im Hintergrund Dinge zu erledigen, bevor der Hauptbildschirm der Anwendung angezeigt wird.

Dann müssen Sie nur noch eine Instanz Ihres Formulars Show () erstellen und einen Verweis darauf behalten, während Sie die Startinitialisierung durchführen. Sobald Ihr Hauptformular geladen wurde, schließen Sie es ().

Wenn auf Ihrem Begrüßungsbildschirm ein animiertes Bild angezeigt wird, muss das Fenster ebenfalls "doppelt gepuffert" sein, und Sie müssen absolut sicher sein, dass sich die gesamte Initialisierungslogik außerhalb des GUI-Threads befindet (dh, Sie können keinen Hauptbildschirm haben Ladelogik im Ladehandler des Hauptformulars: Sie müssen einen BackgroundWorker oder eine andere Threadroutine erstellen.

70
KeithS

Hier sind einige Richtlinienschritte ...

  1. Erstellen Sie ein randloses Formular (dies wird Ihr Startbildschirm sein)
  2. Starten Sie beim Start der Anwendung einen Timer (im Abstand von wenigen Sekunden).
  3. Zeigen Sie Ihr Splash-Formular
  4. Stoppen Sie den Timer beim Timer.Tick-Ereignis und schließen Sie das Splash-Formular. Zeigen Sie dann Ihr Hauptanwendungsformular an

Versuchen Sie es und wenn Sie stecken bleiben, dann kommen Sie zurück und stellen Sie genauere Fragen zu Ihren Problemen

7
musefan

einfache und einfache Lösung zum Erstellen eines Startbildschirms

  1. neues Formular mit dem Namen "SPLASH" öffnen
  2. hintergrundbild beliebig ändern
  3. fortschrittsbalken auswählen
  4. timer auswählen

jetzt Timer-Tick im Timer einstellen:

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

fügen Sie einen neuen Formularverwendungsnamen "FORM-1" hinzu und verwenden Sie den folgenden Befehl in FORM 1.

hinweis: Das Splash-Formular funktioniert, bevor Sie das Formular öffnen1

  1. fügen Sie diese Bibliothek hinzu

    using System.Threading;
    
  2. funktion erstellen

    public void splash()
    {     
        Application.Run(new splash());
    }
    
  3. verwenden Sie den folgenden Befehl bei der Initialisierung wie folgt.

    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

Es gibt einen ziemlich guten Splash-Bildschirm über CodeProject.

Es kommt mit

  • Einblenden
  • Fortschrittsanzeige
  • Statusbezeichnung
  • Ausblenden
  • Doppelklick zum Schließen

Der Autor hat den Code kürzlich durchgearbeitet und aktualisiert. Es ist wirklich eine ziemliche Arbeit und eine Zusammenarbeit zwischen vielen verschiedenen Entwicklern mit guten Ideen.

3
jp2code

splash erstellen

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

Dann in Ihrer Bewerbung

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

Die anderen Antworten hier behandeln dies gut, aber es ist wichtig zu wissen, dass in Visual Studio integrierte Funktionen für Begrüßungsbildschirme vorhanden sind: Wenn Sie die Projekteigenschaften für die Windows-Formular-App öffnen und auf die Registerkarte Anwendung sehen, wird der Bildschirm "Splash" angezeigt : "Option unten. Sie wählen einfach das Formular in Ihrer App aus, das Sie als Begrüßungsbildschirm anzeigen möchten. Es wird darauf achten, dass es beim Start der App angezeigt wird, und es ausgeblendet wird, sobald das Hauptformular angezeigt wird.

Sie müssen Ihr Formular immer noch wie oben beschrieben einrichten (mit den richtigen Rändern, Positionierung, Größenänderung usw.).

2
tomRedox

Ich wollte einen Begrüßungsbildschirm, der angezeigt wird, bis das Hauptprogrammformular angezeigt werden konnte. Timer usw. waren also für mich nicht von Nutzen. Ich wollte es auch so einfach wie möglich halten ... Meine Bewerbung beginnt mit (abgekürzt):

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

Dann hat ReportExplorer folgendes:

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

Schließlich ist die Initialisierung abgeschlossen:

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

Vielleicht fehlt mir etwas, aber das scheint viel einfacher zu sein, als mit Threads und Timern herumzuspielen.

1
AndrewB

Zuerst sollten Sie ein Formular mit oder ohne Rand erstellen (randlos wird für diese Dinge bevorzugt).

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

Bei Main sollten Sie das verwenden

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

Vielleicht etwas spät, um zu antworten, aber ich möchte gerne meinen Weg mitteilen ... Ich fand einen einfachen Weg mit Threads im Hauptprogramm für eine Winform-Anwendung.

Nehmen wir an, Sie haben Ihr Formular "Splashscreen" mit einer Animation und Ihr "Main", das Ihren gesamten Anwendungscode enthält.

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

In Ihrem Hauptformular im Konstruktor:

 public MainForm(Thread splashscreenthread)
    {
        InitializeComponent();

        //add your constructor code

        splashscreenthread.Abort();            
    }

Auf diese Weise hält der Begrüßungsbildschirm genau so lange, bis das Hauptformular geladen ist.

Ihr Splashscreen-Formular sollte seine eigene Art haben, Informationen zu animieren/anzuzeigen. In meinem Projekt startet ein Splashscreen einen neuen Thread, und alle x Millisekunden wechselt sein Hauptbild in ein anderes, das etwas anders aussieht, was die Illusion einer Drehung.

beispiel meines Splashscreen:

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

Ich hoffe, das hilft einigen Leuten ... Entschuldigung, wenn ich Fehler gemacht habe. Englisch ist nicht meine Muttersprache.

0
Ornithorix