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);
-
Als Ergänzung ein Link zu ApplicationContext:
http://msdn2.microsoft.com/de-de/library/system.windows.forms.applicationcontext.aspx