… ist wahrscheinlich einfacher als mancher hier glaubt.
Natürlich gibt es keine fertige SplashScreen-Klasse im .NET Framework, was aber nicht weiter schlimm ist. Die Hälfte der Arbeit ist in der Form-Klasse mit der Eigenschaft Region schon fast erledigt. Mit dieser Eigenschaft wird festgelegt, wie das Control, in diesem Fall die Form, den aussehen soll. Also beschreiben wir die Form.
Dabei ist nichts weiter zu tun als vier Linien und vier Bögen zu zeichnen. Die Breite und Höhe der Form sind ja immer gegeben. Jetzt muss nur noch der Eckenradius verrechnet werden, die erzeugte Geometrie an die Eigenschaft Region übergeben werden und der Splashscreen ist fertig. Werfen wir also zunächst einen Blick auf den Code der SplashScreen-Klasse. Als erstes auf die Methode, welche die Formgrenzen erstellt.

private void CreateRoundedCorners(int radius)
{
    var path = new GraphicsPath();
    path.AddLine(radius, 0, this.Width - radius, 0);
    path.AddArc(this.Width - radius, 0, radius, radius, -90, 90);
    path.AddLine(this.Width, radius, this.Width, this.Height - radius);
    path.AddArc(this.Width - radius, this.Height - radius, radius, radius, 0, 90);
    path.AddLine(this.Width - radius, this.Height, radius, this.Height);
    path.AddArc(0, this.Height - radius, radius, radius, 90, 90);
    path.AddLine(0, this.Height - radius, 0, radius);
    path.AddArc(0, 0, radius, radius, 180, 90);
    this.Region = new Region(path);
}

Das gerundete Rechteck wird mit einer horizontalen Linie von der oberen linke Ecke, versetzt um die Größe des  Radius, begonnen und führt in die obere rechte Ecke ebenfalls um die Größe des Radius verkürzt. Anschließend ein Bogen um 90 Grad i, Uhrzeigersinn und dann weiter mit einer senkrechten nach unten. Im Anschluss daran wieder eine horizontale Linie. So geht es immer im Uhrzeigersinn weiter, bis das Rechteck geschlossen ist.
Nach der letzten Bewegung wir die erzeugte Begrenzung als Parameter an eine neue Instanz der Region-Klasse übergeben und diese als Wert in der Eigenschaft Region der Form gespeichert.
Was soll ich sagen; das war’s auch schon.
Um den Umgang mit der Klasse SplashScreen einfach zu halten, wird der Konstruktor der Form mit einem Parameter vom Typ int versehen der den Wert des Eckenradius entgegen nimmt. So ist der Aufruf des Splashscreen beim Programmstart mit zwei Zeilen Code erledigt. Zur besseren Übersicht, hier das komplette Listing der SplashScreen.cs:

namespace FormsSplashApplication
{
    using System.Drawing;
    using System.Drawing.Drawing2D;
    using System.Windows.Forms;
    public partial class SplashScreen : Form
    {
        public SplashScreen(int cornerRadius)
        {
            // Werte der Form setzen.
            this.FormBorderStyle = FormBorderStyle.None;
            this.Opacity = 0.8d;
            this.ShowInTaskbar = false;
            this.StartPosition = FormStartPosition.CenterScreen;
            this.TopMost = true;
            this.UseWaitCursor = true;
            InitializeComponent();
            // den Rand zeichnen lassen
            this.CreateRoundedCorners(cornerRadius);
        }
        private void CreateRoundedCorners(int radius)
        {
            var path = new GraphicsPath();
            // erste horizontale Line von oben links nach oben rechts
            path.AddLine(radius, 0, this.Width - radius, 0);
            // Bogen rechte obere Ecke
            path.AddArc(this.Width - radius, 0, radius, radius, -90, 90);
            // vertikale Linie von rechts oben nach unten
            path.AddLine(this.Width, radius, this.Width, this.Height - radius);
            // Bogen unten rechts
            path.AddArc(this.Width - radius, this.Height - radius, radius, radius, 0, 90);
            // horizontale Linie unten von rechts nach links
            path.AddLine(this.Width - radius, this.Height, radius, this.Height);
            // Bogen unten links
            path.AddArc(0, this.Height - radius, radius, radius, 90, 90);
            // vertikale Line links von unten nach oben
            path.AddLine(0, this.Height - radius, 0, radius);
            // letzter Bogen oben links; Kontur geschlossen
            path.AddArc(0, 0, radius, radius, 180, 90);
            // Begrenzung an Region übergeben
            this.Region = new Region(path);
        }
    }
}
Somit ist die Klasse SplashScreen erledigt.
Die Verwendung des Splashscreen ist denkbar einfach.
  • Eine Instanz der Splashscreen-Klasse erzeugen, mit dem gewünschten Eckenradius im Konstruktor.
  • Jetzt mit InitializeComponent die Komponenten der eigentlichen Form initialisieren.
  • Mit Show die Splashscreen-Instanz auf dem Bildschirm anzeigen.
  • Einmal Application.DoEvents aufrufen um anstehende Windowsmeldungen zu verarbeiten
  • Jetzt kann die eigentliche Ladearbeit der Form beginnen und der Splashscreen wird solange angezeigt, bis die Instanz mit Close wieder geschlossen wird.

Hierzu bietet sich das Load Ereignis der Form an, da in diesem Moment die Form geladen ist und auf dem Bildschirm ausgegeben wird. Es kann natürlich auch jedes spätere Ereignis verwendet werden. Je nachdem wie lange der Splashscreen angezeigt werden soll.
Im folgenden Beispiel habe ich, wie oben bereits angesprochen, das Load Ereignis gewählt um den Splashscreen zu schließen.

namespace FormsSplashApplication
{
    using System;
    using System.Threading;
    using System.Windows.Forms;
    public partial class Form1 : Form
    {
        private SplashScreen splashScreen;
        public Form1()
        {
            // neue Instanz der SplashScreen-Klasse
            // mit Eckenradius 15px initialisieren.
            this.splashScreen = new SplashScreen(15);
            InitializeComponent();
            // Splashscreen anzeigen
            this.splashScreen.Show();
            // Windowsmeldungen abarbeiten bevor blockiert wird.
            Application.DoEvents();
            // langer Ladevorgang…
            Thread.Sleep(5000);
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            // Form geladen, SplashScreen scließen
            this.splashScreen.Close();
            // und entsorgen
            this.splashScreen.Dispose();
        }
    }
}
Wie bereits Eingangs erwähnt; es ist einfacher als mancher glaubt.
Man kann natürlich auch das Aussehen des Splashscreen in der Form1-Klasse steuern. ohne weitern Code zu schreiben. Die nötigen Eigenschaften wie Breite, Höhe, Opacity udgl. sind per Design in Instanz-Membern zugänglich.

Interessierte können sich das Projekt herunterladen.

FormsSplashApplication.zip

Wenn ihnen der Artikel gefallen hat oder er für sie hilfreich war, bitten "kicken" sie ihn.
kick it on dotnet-kicks.de