HowTo: Splashscreen mit einer WindowsForms Anwendung



  • Hierbei handelt es sich um eine (angepasste) implementierung eines Splashscrees aus folgender Quelle:

    http://www.codeproject.com/csharp/applicationcontextsplash.asp:

    SplassAppContext.h:

    #pragma once
    
    using namespace System;
    using namespace System::Windows::Forms;
    
    ref class SplashAppContext : public ApplicationContext
    {
    	Form ^ mainForm;
    	Form ^ splashForm;
    	Timer ^ splashTimer ;
    
    	System::Void			SplashTimeUp(System::Object ^ sender, System::EventArgs ^ e);
    
    protected:
    	virtual  System::Void   OnMainFormClosed(System::Object  ^ sender, System::EventArgs ^ e) override;  
    
    public:
    	SplashAppContext(Form ^ mainForm, Form ^ splashForm,int seconds);
    };
    

    SplashAppContext.cpp:

    #include "StdAfx.h"
    #include "SplashAppContext.h"
    
    	/************************************************************************
    	* 
    	************************************************************************/                                                                
    	SplashAppContext::SplashAppContext(Form ^ MainForm, Form ^ SplashForm,int seconds) : ApplicationContext(SplashForm)
    	{
    		splashTimer = gcnew Timer;
    		mainForm = MainForm;
    		splashForm = SplashForm;
    
    		splashTimer->Tick += gcnew System::EventHandler(this,&SplashAppContext::SplashTimeUp);
    		if(seconds > 0)
    		{
    			splashTimer->Interval = seconds * 1000;
    			splashTimer->Enabled = true;
    		}
    	}
    
    	/************************************************************************
    	* 
    	************************************************************************/                                                                
    	System::Void SplashAppContext::SplashTimeUp(System::Object ^ sender, System::EventArgs ^e)
    	{
    		splashTimer->Enabled = false;
    
    		ApplicationContext::MainForm->Close();        
    	}
    
    	/************************************************************************
    	* 
    	************************************************************************/                                                                
    	System::Void SplashAppContext::OnMainFormClosed(System::Object  ^ sender, System::EventArgs ^ e)
    	{
    		if(sender->Equals(splashForm))
    		{
    			ApplicationContext::MainForm = mainForm;
    			ApplicationContext::MainForm->Show();
    		}
    		else if(sender->Equals(mainForm))
    		{
    			ApplicationContext::OnMainFormClosed(sender,e);
    		}
    	}
    

    Mit Hilfe dieser Klasse kann man nun einen Context erstellen in dem 2 Fenster angegeben werden können.

    int main(array<System::String ^> ^args)
    {
    	// Aktivieren visueller Effekte von Windows XP, bevor Steuerelemente erstellt werden
    	Application::EnableVisualStyles();
    	Application::SetCompatibleTextRenderingDefault(false); 
    
             // Hauptfenster,Splashfenster,Zeit in Sekunden
    	SplashAppContext ^appcontext = gcnew SplashAppContext(gcnew Form1,gcnew SplashScreen,2);
    
    	Application::Run(appcontext);
    
    	return 0;
    }
    

    Nachdem das Splashfenster geschlossen wurde, wird das Hauptfenster angezeigt.

    Als abwandlung zur Vorlage gibt es einen dritten Parameter, der die Anzeigezeit in Sekunden erlaubt. 0 bedeutet endlos - das Splashfenster muss sich selbst mit Close(); schliessen. (So kann man Initialisierungen erledigen ohne das man unter Zeitdruck gerät).

    Im Artikel von Codeproject sind die ganzen Hintergründe beschreiben - so schön schaff ich den Text nicht 🤡



  • Für das Splashfenster bietet es sich an, den den FormBorderStyle auf none zu setzen.

    Um einen schwarzen Rahmen um das Fenster zu zeichnen , kann man im Paint Event folgende Zeilen verwenden:

    System::Drawing::Pen ^ myPen = gcnew System::Drawing::Pen(Color::Black);
    		e->Graphics->DrawRectangle(myPen,0,0,this->Width-1,this->Height-1);