Gewusst wie: Erstellen von nicht rechteckigen Windows Forms-Anwendungen

Aktualisiert: November 2007

Bisher war das Erstellen nicht rechteckiger Formulare ein zeitaufwendiger und arbeitsintensiver Vorgang, der API-Aufrufe beinhaltete und einen beträchtlichen Programmieraufwand bedeutete. Dies ist nun nicht mehr der Fall.

Hinweis:

Bei diesem Vorgang müssen große Mengen von Grafiken verarbeitet werden. Je nachdem, über wie viel Speicher und welche Grafikkarte der jeweilige Computer verfügt, kann dies zu unterschiedlichen Ergebnissen führen. Wenn eine Anwendung benutzerdefiniertes Zeichnen beinhaltet, sollten Sie deren Leistung vor der Bereitstellung für den Benutzer immer mit unterschiedlichen Videokarten überprüfen.

Der Vorgang des Erstellens nicht rechteckiger Formulare besteht aus zwei Teilen: Erstellen des Formulars in einer bestimmten Form sowie Codieren von Programmierlogik zum Verschieben und Schließen des Formulars. Dieser zweite Schritt ist erforderlich, da ein Formular mit einer benutzerdefinierten Form nicht über eine Titelleiste verfügt und keine Funktionen enthält (z. B. die Möglichkeit, das Formular auf dem Bildschirm zu verschieben und zu schließen). Daher ist es erforderlich, diese Features durch geschriebenen Code zu replizieren. Weitere Informationen über das Erstellen von nicht rechteckigen Formularen und Steuerelementen finden Sie unter Gewusst wie: Erstellen von geformten Windows Forms.

Das Erstellen eines nicht rechteckigen Formulars besteht aus drei Schritten:

  • Erstellen einer Bitmap, die als Oberfläche des Formulars dient. (Dabei wird die gewünschte Form des Formulars aus einem Rechteck "ausgeschnitten".)

  • Erstellen eines Windows-Anwendungsprojekts und Einstellen der Eigenschaften, um die Titelleiste zu entfernen und die Bitmap als Hintergrund des Formulars zu verwenden.

  • Eingeben von Code, der die Funktionen der Titelleiste wie Verschieben und Schließen des Formulars neu erstellt.

Hinweis:

Je nach den aktiven Einstellungen oder der verwendeten Version können sich die angezeigten Dialogfelder und Menübefehle von den in der Hilfe beschriebenen unterscheiden. Klicken Sie im Menü Extras auf Einstellungen importieren und exportieren, um die Einstellungen zu ändern. Weitere Informationen hierzu finden Sie unter Visual Studio-Einstellungen.

So erstellen Sie ein Formular mit einer bestimmten Form

  1. Erstellen Sie eine Bitmap mit einer nicht rechteckigen Form in einer bestimmten Farbe und einem deutlich abgehobenen Hintergrund in einer anderen Farbe. Verwenden Sie dazu ein beliebiges Zeichenprogramm. Die von Ihnen gezeichnete Form bildet später das Formular. Sie sollten sie daher in ausreichender Größe zeichnen.

    Hinweis:

    Wählen Sie eine Hintergrundfarbe, die Sie sich leicht merken können, z. B. Blau, da dies im weiteren Verlauf von Bedeutung sein wird.

  2. Erstellen Sie in Visual Studio ein neues Windows-Anwendungsprojekt. Weitere Informationen hierzu finden Sie unter Gewusst wie: Erstellen eines Windows-Anwendungsprojekts.

  3. Gehen Sie im Eigenschaftenfenster wie folgt vor:

    • Legen Sie die FormBorderStyle-Eigenschaft auf Keine fest.

      Dadurch wird die Titelleiste aus dem Formular entfernt. (Gleichzeitig werden die entsprechenden Funktionen der Titelleiste entfernt, einschließlich der Möglichkeit, das Formular zu schließen oder zu verschieben. Diese Unzulänglichkeit wird jedoch im Folgenden durch einzufügenden Code wieder ausgeglichen.)

    • Legen Sie für die BackgroundImage-Eigenschaft des Formulars die zuvor erstellte Bitmapdatei fest. Es ist nicht erforderlich, die Datei dem Projektsystem hinzuzufügen. Dies geschieht automatisch, wenn sie als Hintergrundbild festgelegt wird.

      Diese Eigenschaft legt fest, dass das Bitmapbild als Hintergrund des Formulars dient. (Wenn diese Eigenschaft zusammen mit der nachfolgend festgelegten TransparencyKey-Eigenschaft verwendet wird, bestimmt sie die Form des Formulars.)

    • Legen Sie für die TransparencyKey-Eigenschaft die Hintergrundfarbe der Bitmapdatei fest.

      Diese Eigenschaft bestimmt, welche Teile des Formulars transparent sein sollen.

      Hinweis:

      Bei Monitoren mit einer Farbtiefe von mindestens 24 Bits können Probleme mit der Anzeige auftreten, sodass einzelne Teile des Formulars trotz der Einstellung der TransparencyKey-Eigenschaft möglicherweise nicht transparent angezeigt werden. Um dieses Problem zu vermeiden, sollte gewährleistet sein, dass die Farbtiefe des Monitors unter Anzeige in der Systemsteuerung auf einen Wert unter 24 Bits eingestellt ist. Beim Entwickeln von Anwendungen, die mit dieser Transparenz arbeiten, sollten Sie daran denken, die Benutzer auf dieses Problem hinzuweisen.

So schreiben Sie Code zum Schließen des Formulars

  1. Fügen Sie dem Formular ein Button-Steuerelement hinzu. Weitere Informationen hierzu finden Sie unter Gewusst wie: Hinzufügen von Steuerelementen zu Windows Forms.

  2. Fügen Sie Code hinzu, mit dem der Benutzer durch Aufrufen der Close-Methode das Formular schließen kann.

    Das folgende Beispiel demonstriert, wie Sie eine Schaltfläche hinzufügen, mit der das Formular geschlossen werden kann.

    Private Sub Button1_Click(ByVal sender As System.Object, _
       ByVal e As System.EventArgs) Handles Button1.Click
       Me.Close()
    End Sub
    
    private void button1_Click(object sender, System.EventArgs e)
    {
       this.Close();
    }
    
    C#-Hinweis:

    Stellen Sie sicher, dass Sie Code zum Aktivieren des Ereignishandlers hinzufügen. Wenn Sie dazu den Code des folgenden Beispiels verwenden, könnte dies in etwa so aussehen:

    this.Button1.Click += new System.EventHandler(this.button1_Click);
    

So schreiben Sie Code zum Verschieben des Formulars (optional)

  1. Erstellen Sie eine Prozedur zum Verschieben des Formulars, wenn es gezogen wird. Geben Sie Code zum Erstellen eines neuen Point-Objekts ein, der mit nachfolgendem Beispiel vergleichbar sein sollte. Dieses Objekt dient als Variable bei der Berechnung, wie das Formular verschoben werden soll. Mit dem isMouseDown-Feld wird erfasst, ob der Benutzer die Maustaste gedrückt hält. Das Formular sollte nur bei gedrückter Maustaste verschoben werden können.

    Private mouseOffset As Point
    Private isMouseDown As Boolean = False
    
    private Point mouseOffset;
    private bool isMouseDown = false;
    
  2. Erstellen Sie einen Ereignishandler für das MouseDown-Ereignis des Formulars. Fügen Sie im Handler Code hinzu, durch den der Benutzer an einer beliebigen Stelle auf das Formular klicken und es ziehen kann. Ausführliche Informationen zum Erstellen von Ereignishandlern finden Sie unter Gewusst wie: Erstellen von Ereignishandlern mithilfe des Designers.

    Geben Sie mit nachfolgendem Beispiel vergleichbaren Code ein, um der Variablen mouseOffset anhand der aktuellen Position des Mauszeigers Koordinaten zuzuordnen. Beachten Sie, dass die Offsetposition im unten stehenden Code mit Systemdaten zur Rahmenstärke (FrameBorderSize.Width) und zur Höhe der Titelleiste (CaptionHeight) berechnet wird. Diese müssen beim Testen des Offsets berücksichtigt werden, da einige Messungen mit dem Innenbereich und andere mit Bildschirmkoordinaten erfolgen. Der Offset entspricht daher der Summe aus Rahmenbreite, Überschriftengröße und Offset in den Innenbereich des Formulars.

    Private Sub Form1_MouseDown(ByVal sender As Object, _
        ByVal e As MouseEventArgs) Handles MyBase.MouseDown
        Dim xOffset As Integer
        Dim yOffset As Integer
    
        If e.Button = MouseButtons.Left Then
            xOffset = -e.X - SystemInformation.FrameBorderSize.Width
            yOffset = -e.Y - SystemInformation.CaptionHeight - _
                    SystemInformation.FrameBorderSize.Height
            mouseOffset = New Point(xOffset, yOffset)
            isMouseDown = True
        End If
    End Sub
    
    private void Form1_MouseDown(object sender, 
        System.Windows.Forms.MouseEventArgs e)
    {
        int xOffset;
        int yOffset;
    
        if (e.Button == MouseButtons.Left) 
        {
            xOffset = -e.X - SystemInformation.FrameBorderSize.Width;
            yOffset = -e.Y - SystemInformation.CaptionHeight - 
                SystemInformation.FrameBorderSize.Height;
            mouseOffset = new Point(xOffset, yOffset);
            isMouseDown = true;
        }    
    }
    
    C#-Hinweis:

    Stellen Sie sicher, dass Sie Code zum Aktivieren des Ereignishandlers hinzufügen. Wenn Sie dazu den Code des folgenden Beispiels verwenden, könnte dies in etwa so aussehen:

    this.MouseDown += new
       System.Windows.Forms.MouseEventHandler
       (this.Form1_MouseDown);
    
  3. Erstellen Sie einen Ereignishandler für das MouseMove-Ereignis des Formulars.

    Geben Sie mit folgendem Beispiel vergleichbaren Code ein: Wenn auf die linke Maustaste geklickt und die Maus gezogen wird, wird für die Location-Eigenschaft des Formulars die neue Position eingestellt.

    Private Sub Form1_MouseMove(ByVal sender As Object, _
        ByVal e As MouseEventArgs) Handles MyBase.MouseMove
        If isMouseDown Then
            Dim mousePos As Point = Control.MousePosition
            mousePos.Offset(mouseOffset.X, mouseOffset.Y)
            Location = mousePos
        End If
    End Sub
    
    private void Form1_MouseMove(object sender, 
        System.Windows.Forms.MouseEventArgs e)
    {
        if (isMouseDown) 
        {
            Point mousePos = Control.MousePosition;
            mousePos.Offset(mouseOffset.X, mouseOffset.Y);
            Location = mousePos;
        }
    }
    
    C#-Hinweis:

    Stellen Sie sicher, dass Sie Code zum Aktivieren des Ereignishandlers hinzufügen. Wenn Sie dazu den Code des folgenden Beispiels verwenden, könnte dies in etwa so aussehen:

    this.MouseMove += new
       System.Windows.Forms.MouseEventHandler
       (this.Form1_MouseMove);
    
  4. Erstellen Sie einen Ereignishandler für das MouseUp-Ereignis des Formulars. Geben Sie mit folgendem Beispiel vergleichbaren Code ein:

    Private Sub Form1_MouseUp(ByVal sender As Object, _
        ByVal e As MouseEventArgs) Handles MyBase.MouseUp
        ' Changes the isMouseDown field so that the form does
        ' not move unless the user is pressing the left mouse button.
        If e.Button = MouseButtons.Left Then
            isMouseDown = False
        End If
    End Sub
    
    private void Form1_MouseUp(object sender, 
        System.Windows.Forms.MouseEventArgs e)
    {
        // Changes the isMouseDown field so that the form does
        // not move unless the user is pressing the left mouse button.
        if (e.Button == MouseButtons.Left) 
        {
            isMouseDown = false;
        }
    }
    

Siehe auch

Aufgaben

Gewusst wie: Erstellen von geformten Windows Forms

Gewusst wie: Erstellen von transparenten Windows Forms

Referenz

Übersicht über Windows Forms