Laden...

Yet another SplashScreenHelper

Letzter Beitrag vor 15 Jahren 3 Posts 4.685 Views
Yet another SplashScreenHelper

Features*beliebige Forms können als Splash- oder Main-Form verwendet werden - keine InterFaces oder Basisklassen zu berücksichtigen
Empfohlen ist aber, daß das SplashForm eine Methode zur Anzeige von Meldungen anbietet

*Sub Main kann Meldungen im SplashForm absetzen *Die Melde-Methode kann weiter gereicht werden, sodaß auch vom Main-Form aus Meldungen an den SplashScreen absetzbar sind. *Äh - 70 Zeilen, incl. Comments 😉

Eine Minimum-Anzeige-Zeit des Splashscreens ist nicht vorgesehen - Ich finde, wenn ein Programm schnell startet braucht es eh kein Splashscreen.
Könnte man hinzufügen, indem man ein entsprechendes Thread.Sleep() vors frmMain.Show() setzt.

Arbeitsweise:
Ein Nebenthread wird mit Erzeugung und Anzeige des SplashScreens beauftragt, während der MainThread blockiert wird. Dadurch hat die CPU maximale Ressourcen, den SplashScreen schnell anzuzeigen. Im SplashScreen_Shown() - Event wird der Mainthread entblockt, und die eigentliche Initialisierung beginnt. Während der Initialisierung können über einen extra Message-Delegaten Ausgaben im SplashScreen getätigt werden (threadübergreifende Aufrufe). Im frmMain_Shown-Event wird dann der SplashScreen ausgeknipst.

Hier mal eine Sub Main, die Meldungen an den Splash ausgibt, und außerdem den Melde-Delegaten ins Main-Form reinreicht:


      [STAThread]
      static void Main() {
         Application.EnableVisualStyles();
         Application.SetCompatibleTextRenderingDefault(false);

         // SplashScreen asynchron anzeigen
         var frmSplash = SplashHelper.RunSplash<frmSplashScreen>();

         // prinzipiell optional, aber normalerweise bietet ein SplashScreen eine Melde-Methode an
         var message = SplashHelper.GetAsyncMessenger(frmSplash.Message);

         message("Hello!");               //was melden
         Thread.Sleep(1000);
         message("starting wired Application-Inits");
         Thread.Sleep(1000);
         message("starting UI-Inits");
         var fMain = new frmMain();

         // optional: message-methode ins Mainform reinreichen 
         // (das Reinreichen könnte auch im MainForm-Konstruktor geschehen)
         fMain.splashLog = message;   
         SplashHelper.Combine(fMain, frmSplash);   // die An/Aus-Logik zw. Splash und Main klarmachen
         Application.Run(fMain);
      }

Schlagwörter: SplashScreen

Der frühe Apfel fängt den Wurm.

Ich würde den Splashscreen nich wie eine normale Form aussehen lassen. Da sonst der Benutzer denkt das die Anwendung schon gestartet sei. Sonst gefällts mir.

pdelvo

Ist ja deine Sache, wie du die Form aussehen lassen willst.

Shift to the left, shift to the right!
Pop up, push down, byte, byte, byte!

YARRRRRR!