Da in letzter Zeit des Öfteren nach Aero-Design und Controls in der Non-Client Area (Titelbar) gefragt wird, habe ich beschlossen, ein Tutorial dazu zu schreiben.
Grundlagen
Im Grunde genommen ist jede WinForm in zwei Bereiche unterteilt. In einen Client-Bereich (Den Bereich, den man im Designer mit Controls, etc. gestalten kann) und
in einen Non-Client Bereich (Titelleiste; Der Programmierer kann nicht ohne Weiteres darauf zugreifen).
Um überhaupt in die Titelleiste zeichnen zu können, muss der Client Bereich der Form erweitert werden.
Im Allgemeinen wird dazu die 'DWMAPI.dll' benötigt.
Grundcode
Um die Form zu erweitern und die Möglichkeit zu bieten, Controls in die Titelleiste zu zeichnen, greife ich auf folgenden Code zurück: [vb@rchiv]Toolstrip-Elemente in der Titelleiste
Mit diesem Code wird der obere Teil (ca. 25 Pixel) der Form beim starten automatisch in die Titelleiste eingefügt. D.h. die oberen 25 Pixel der Form können ganz normal im Designer gestaltet werden und werden beim Start in der Titelleiste angezeigt.
Im Beispiel des Grundcodes ist ein ToolStrip genommen worden. Fügt euch ebenfalls ein (leeres) ToolStrip mit dem Namen tsNCToolStrip ein, damit es keine Fehler gibt, wenn der Grundcode kopiert wird (auf welchen ich jetzt nicht mehr näher eingehen werde).
Ich erkläre euch jedoch, wie man sich einen HeaderMenuButton (wie in Firefox 4) machen kann.
Design
Dazu müssen wir zuerst ein Bild des Buttons haben und zwar in 3-facher Ausführung: Normal, Hover, Pressed (Evtl. noch ein 4. für Disabled)
Diese 3 Bilder habe ich hier mal in der Farbe grün angehängt. Ihr solltet diese Bilder in die Ressourcen des Programms importieren.
Nun muss eine Picturebox mit folgenden Eigenschaften erstellt werden:
Location: 6;1
Size: 88; 19
Image: Das Bild vom "Normalzustand" des Buttons
Nun könnt ihr das Programm mal starten. Ihr solltet nun folgendes sehen:
Wie ihr sicher bemerkt habt, wird kein Form Text angezeigt, selbst wenn ihr einen angegeben habt.
Das ist auch klar, weil die ganze Titelleiste überschrieben wird. Also muss der Text ebenfalls selber gezeichnet werden (Mit Glass-/Glow-Effekt). Da kann ich euch das GlassLabel-Control von diesem Toolkit empfehlen.
Das GlassLabel sollte folgende Eigenschaften haben:
Location: [(Breite der Form - Breite des Labels) / 2]; -6
Size: 56; 23
Padding: 10; 10; 10; 0
Code
Damit der Text mittig angezeigt wird, muss folgender Code ins Size_Changed Event der Form:
Damit der Button bei einer Mausberührung heller wird (Hover) und bei einem Mausklick dunkler (Pressed), müssen folgende Codeteile eingefügt werden:
Wobei "PictureBox1" der Button ist.
Desweiteren kann man sehen, dass die Position der Controls bei der maximierten Form nicht mehr stimmen. Deshalb muss bei einem Resize noch geprüft werden, ob die Form maximiert wurde, um ggf. die Position des Buttons und des Labels anzupassen:
Beim Label wird zusätzlich noch die Schriftfarbe geändert (Wie bei der originalen Form).
Nun wollen wir noch, dass sich beim Ändern des Formtextes auch der Text auf dem Glasslabel anpasst (Der Glasslabeltext wird auf der Form gezeigt, der Formtext in der Taskbar)
Text auf dem Button/Menu beim Buttonklick
Um einen Text auf den Button zuschreiben, muss auf GDI zurückgegriffen werden:
Um ein Menu beim Buttonklick aufpoppen zu lassen, kann ein einfaches ContextMenu verwendet werden.
Ich hoffe, dieses etwas längere Tutorial ist einigen von euch eine kleine Hilfe.
Ich bedanke mich schon einmal fürs Anschauen und durchlesen und würde mich über Kritik/Rückmeldungen freuen
Zum Schluss sollte die Form etwa so aussehen:
EDIT: Es gibt einen bekannten Bug, welchen ich nicht beheben konnte, nämlich, dass die 3 Buttons (Minimize, Maximize und Close) nicht angezeigt werden, wenn die Form maximiert ist.
Gruss
Pascal
Grundlagen
Im Grunde genommen ist jede WinForm in zwei Bereiche unterteilt. In einen Client-Bereich (Den Bereich, den man im Designer mit Controls, etc. gestalten kann) und
in einen Non-Client Bereich (Titelleiste; Der Programmierer kann nicht ohne Weiteres darauf zugreifen).
Um überhaupt in die Titelleiste zeichnen zu können, muss der Client Bereich der Form erweitert werden.
Im Allgemeinen wird dazu die 'DWMAPI.dll' benötigt.
Grundcode
Um die Form zu erweitern und die Möglichkeit zu bieten, Controls in die Titelleiste zu zeichnen, greife ich auf folgenden Code zurück: [vb@rchiv]Toolstrip-Elemente in der Titelleiste
Mit diesem Code wird der obere Teil (ca. 25 Pixel) der Form beim starten automatisch in die Titelleiste eingefügt. D.h. die oberen 25 Pixel der Form können ganz normal im Designer gestaltet werden und werden beim Start in der Titelleiste angezeigt.
Im Beispiel des Grundcodes ist ein ToolStrip genommen worden. Fügt euch ebenfalls ein (leeres) ToolStrip mit dem Namen tsNCToolStrip ein, damit es keine Fehler gibt, wenn der Grundcode kopiert wird (auf welchen ich jetzt nicht mehr näher eingehen werde).
Ich erkläre euch jedoch, wie man sich einen HeaderMenuButton (wie in Firefox 4) machen kann.
Design
Dazu müssen wir zuerst ein Bild des Buttons haben und zwar in 3-facher Ausführung: Normal, Hover, Pressed (Evtl. noch ein 4. für Disabled)
Diese 3 Bilder habe ich hier mal in der Farbe grün angehängt. Ihr solltet diese Bilder in die Ressourcen des Programms importieren.
Nun muss eine Picturebox mit folgenden Eigenschaften erstellt werden:
Location: 6;1
Size: 88; 19
Image: Das Bild vom "Normalzustand" des Buttons
Nun könnt ihr das Programm mal starten. Ihr solltet nun folgendes sehen:
Wie ihr sicher bemerkt habt, wird kein Form Text angezeigt, selbst wenn ihr einen angegeben habt.
Das ist auch klar, weil die ganze Titelleiste überschrieben wird. Also muss der Text ebenfalls selber gezeichnet werden (Mit Glass-/Glow-Effekt). Da kann ich euch das GlassLabel-Control von diesem Toolkit empfehlen.
Das GlassLabel sollte folgende Eigenschaften haben:
Location: [(Breite der Form - Breite des Labels) / 2]; -6
Size: 56; 23
Padding: 10; 10; 10; 0
Code
Damit der Text mittig angezeigt wird, muss folgender Code ins Size_Changed Event der Form:
Damit der Button bei einer Mausberührung heller wird (Hover) und bei einem Mausklick dunkler (Pressed), müssen folgende Codeteile eingefügt werden:
VB.NET-Quellcode
- Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
- PictureBox1.Image = My.Resources.HeaderGreen_pressed
- End Sub
- Private Sub PictureBox1_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles PictureBox1.MouseEnter
- PictureBox1.Image = My.Resources.HeaderGreen_hover
- End Sub
- Private Sub PictureBox1_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles PictureBox1.MouseLeave
- PictureBox1.Image = My.Resources.HeaderGreen_normal
- End Sub
- Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp
- PictureBox1.Image = My.Resources.HeaderGreen_normal
- End Sub
Desweiteren kann man sehen, dass die Position der Controls bei der maximierten Form nicht mehr stimmen. Deshalb muss bei einem Resize noch geprüft werden, ob die Form maximiert wurde, um ggf. die Position des Buttons und des Labels anzupassen:
VB.NET-Quellcode
- Private Sub Form2010_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SizeChanged
- GlassLabel1.Location = New Point((Me.Width - GlassLabel1.Width) / 2, 0)
- If Me.WindowState = FormWindowState.Maximized Then
- PictureBox1.Location = New Point(9, 6)
- GlassLabel1.Location = New Point((Me.Width - GlassLabel1.Width) / 2, 2)
- GlassLabel1.ForeColor = Color.White
- ElseIf Me.WindowState = FormWindowState.Normal Then
- PictureBox1.Location = New Point(6, 1)
- GlassLabel1.Location = New Point((Me.Width - GlassLabel1.Width) / 2, 0)
- GlassLabel1.ForeColor = Color.Black
- End If
- End Sub
Beim Label wird zusätzlich noch die Schriftfarbe geändert (Wie bei der originalen Form).
Nun wollen wir noch, dass sich beim Ändern des Formtextes auch der Text auf dem Glasslabel anpasst (Der Glasslabeltext wird auf der Form gezeigt, der Formtext in der Taskbar)
Text auf dem Button/Menu beim Buttonklick
Um einen Text auf den Button zuschreiben, muss auf GDI zurückgegriffen werden:
VB.NET-Quellcode
- Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
- e.Graphics.DrawString("Button", New Font("Segoe UI", 8.75, FontStyle.Bold), Brushes.White, 7, 0) 'ACHTUNG! Die Location kann entweder ausprobiert werden, damit der Text in der Mitte ist, oder man kann die MeasureString Funktion verwenden, worauf ich hier aber verzichtet habe
- End Sub
Um ein Menu beim Buttonklick aufpoppen zu lassen, kann ein einfaches ContextMenu verwendet werden.
Ich hoffe, dieses etwas längere Tutorial ist einigen von euch eine kleine Hilfe.
Ich bedanke mich schon einmal fürs Anschauen und durchlesen und würde mich über Kritik/Rückmeldungen freuen
Zum Schluss sollte die Form etwa so aussehen:
EDIT: Es gibt einen bekannten Bug, welchen ich nicht beheben konnte, nämlich, dass die 3 Buttons (Minimize, Maximize und Close) nicht angezeigt werden, wenn die Form maximiert ist.
Gruss
Pascal
Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Marcus Gräfe“ ()