BigBastis Blog

Tutorial: Windows Aero Glass in eigenen Projekten nutzen Teil 1

Introduction

user

Sebastian Gross

Sebastian Gross arbeitet in Bielefeld als Softwareentwickler für .NET und Java im Bereich Web.Als Fan der .NET-Plattform lässt er sich kein Userguppen Treffen und Community Event im Raum OWL entgehen.Dabei hat er eine besondere Vorliebe für das ASP.NET MVC Framework und für das Test Driven Development (TDD) entwickelt.


LATEST POSTS

Handling too long scrollspy menus 10th June, 2015

Java: Create ZIP archive 23rd March, 2015

.NET

Tutorial: Windows Aero Glass in eigenen Projekten nutzen Teil 1

Posted on .

In dieser Demo möchte ich euch zeigen wie man die Aero Effekte von Windows Vista in eigenen Projekten nutzen kann. Dieses Vorgehen habe ich vor einiger Zeit in einem anderem Blog gelesen, weis leider nicht mehr in welchem. Dort wurde eine Möglichkeit beschrieben wie man es unter WPF macht. Ich möchte dies hier anhand eines Visual Basic.NET Projekts demonstrieren mit Verwendung des .NET Frameworks 3.5

Eine neue Klasse Hinzufügen

Als erstes erstellt ihr ein neues Projekt für eine Windows Anwendung und fügt diesem Projekt eine neue Klasse hinzu. Diese Klasse habe ich hier „AeroForm“ getauft.

Man könnte sich diese Klasse natürlich auch sparen und alles direkt in die Form integrieren, dann würde man aber die

Eine Neue Klasse hinzufügen

Möglichkeit verlieren diese Funktionen auch in anderen Projekten zu benutzen. Also möchten wir diese Klasse möglichst Allgemein halten um den Wiederverwendungszweck zu steigern. Stichwort Polymorphie!

Aber nun zurück zu unserer neuen Klasse. Um die Übersichtlichkeit und die Lesbarkeit des Codes (für später) zu steigern erstellen wir erstmal einen Namespace „GlassCreator“ mit unserer Klasse AeroForm.

Namespace GlassCreator
Public Class AeroForm

End Class
End Namespace

Ränder VergrößernHier möchte ich kurz unser Vorgehen erläudern, wie wir das Fenster dazu bringen die Aero Transparenz zu „erlernen“. Wir werden nichts anderes amchen, als die Ränder des Formulars in die Client-Oberfläche zu vergrößern (Siehe Bild)

Dazu benötigen wir die Funktion „DWMExtendFrameIntoClientArea“ aus der Windows API, welche in der DLL „dwmapi.dll“ zu finden ist. Diese müssen wir nun also importieren:

Namespace GlassCreator

    Public Class AeroForm

        <DllImport("dwmapi.dll", PreserveSig:=False)> _

        Private Shared Sub DwmExtendFrameIntoClientArea_

            (ByVal hwnd As IntPtr, _

             ByRef margins As Integer)

        End Sub

    End Class

End Namespace

Wenn ihr euren Code nun erweitert habt werdet ihr feststellen, dass Visual Studio euch „DllImport“ unterstreicht. Dies tut es weil wir die System.Runtime.InteropServices nicht importiert haben. Holen wir das also schnell nach:

Imports System.Runtime.InteropServices

Namespace GlassCreator

    Public Class AeroForm

        <DllImport("dwmapi.dll", PreserveSig:=False)> _

        Private Shared Sub DwmExtendFrameIntoClientArea_

            (ByVal hwnd As IntPtr, _

             ByRef margins As Integer)

        End Sub

    End Class

End Namespace

Die frisch importierte Funktion benötigt zwei Parameter zum laufen, nämlich hwnd As IntPtr und ByRef margins As Integer. Wobei hwnd für das Handle des Fensters steht, auf welches die Aero Effekte angewendet werden sollen und margins für die neue Breite der Ränder des Fenstes!

Machen wir weiter. Erstellen wir die Funktion, die für uns später die Arbeit übernehmen wird. Diese ist sehr einfach aufgebaut:

Public Shared Function ExtendGlassFrame _
             (ByVal hwnd As IntPtr, _
              ByVal margin As Integer, _
              ByVal clr As Color) As Boolean

    System.Windows.Forms.Form.FromHandle(hwnd).BackColor = clr

    AeroForm.DwmExtendFrameIntoClientArea(hwnd, margin)

    Return True

End Function

Schauen wir uns diese Funktion mal etwas genauer an. Die Funktion, die ich „ExtendGlassFrame“ getauft habe erwartet drei Parameter zum laufen. Die ersten zwei Parameter sind uns dabei schon aus dem Import von „DwmExtendFrameIntoClientArea“ bekannt und haben sich nicht geändert! Der dritte Parameter „clr as Color“ ist einfach nur die Farbe, die das Zielfenster später haben soll. Schließlich sehen wir, dass diese Funktion als „as Boolean“ deklariert ist und einen Boolischen Wert zurückgeben wird. (Dies ist natürlich optional!)
Die Zeile 06 setzt die Farbe des Fensters, dessen Handle wir in der Variable hwnd bekommen auf die in clr übergebene Farbe.
Danach nutzen wir unsere importierte Funktion um die Ränder des Formulars zu vergrößern und übergeben die beiden benötigten Variablen!
Und am Ende geben wir noch den Wert „True“ zurück um dem Aufrufer zu Zeigen, dass alles glatt gelaufen ist!

Damit wäre unsere Klasse auch schon fertig:

Imports System.Runtime.InteropServices

Namespace GlassCreator
    Public Class AeroForm
 _
        Private Shared Sub DwmExtendFrameIntoClientArea _
                                  (ByVal hwnd As IntPtr, _
                                   ByRef margins As Integer)
        End Sub

        Public Shared Function ExtendGlassFrame(ByVal hwnd As IntPtr, _
                                  ByVal margin As Integer, _
                                  ByVal clr As Color) As Boolean

            System.Windows.Forms.Form.FromHandle(hwnd).BackColor = clr

            AeroForm.DwmExtendFrameIntoClientArea(hwnd, margin)

            Return True

        End Function

    End Class

End Namespace

Einen neuen Button erstellenKommen wir also zu dem Formular. Öffnen Sie die „Form1.vb“ (Oder wie ihr es auch genannt habt) und erstellt einen neuen Button. Doppelklickt auf den Button damit Visual Studio für euch das Button1_Click Event erzeugt:

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, _
                              ByVal e As System.EventArgs) _
                              Handles Button1.Click

    End Sub

End Class

Hier müssen wir nurnoch die Funktion aus unserer frisch gebackenen Klasse aufrufen:

GlassCreator.AeroForm.ExtendGlassFrame(Me.Handle, _
		1, _
		System.Drawing.SystemColors.ActiveCaptionText)

Der zweite Parameter „1“ ist in diesem Fall völlig egal! Ihr könnt hier jede beliebige Integer Zahl wählen! Warum das so ist werde ich in dem 2ten Teil dieses Tutorials erklären!

Der Dritte Parameter (System.Drawing.SystemColors.ActiveCaptionText) ist ¸brigens die Farbe, die unser Fenster haben soll. ActiveCaptionText heiflt nur, dass das Fenster die aktuelle Standardfarbe der Fenster bekommen soll. Hier hätten wir auch jede beliebige andere Farbe nehmen können! (Siehe Unten)

Und das Wars auch schon:

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, _
                ByVal e As System.EventArgs) _
                Handles Button1.Click

	GlassCreator.AeroForm.ExtendGlassFrame(Me.Handle, _
		1, _
		System.Drawing.SystemColors.ActiveCaptionText)
    End Sub

End Class

Starten wir nun das Programm und klicken auf den Button erhalten wir ein Glasklares Fenster in Aero Optik!
Vorher
Übrigens, wenn wir als Farbe  System.Drawing.Color.DeepPink ¸bergeben färbt sich die Clientoberfläche in Pink.

NachherIhr Könnt auch jede andere Farbe aus dem  System.Drawing.Color.* Sortiment aussuchen.

Soviel zu dem ersten Teil dieses Tutorials. In dem Zweiten werde ich euch zeigen, wie Ihr Detailierter an die Sache fensterpinkgeht und weitere Möglichkeiten zeigen um jeden Rand persönlich anzusprechen. Und man kann auch fremde Fenster mit der Aero-Optik schmücken!

Bitte gebt mir Feedback damit ich die nächsten Tutorials besser und/oder verständlicher gestalten kann!

Ihr könnt euch dieses Demo-Projekt auch schon fertig runterladen: Dieses Demo Projekt herunterladen

Lesen Sie auch Teil 2 dieses Tutorials

profile

Sebastian Gross

http://www.bigbasti.com

Sebastian Gross arbeitet in Bielefeld als Softwareentwickler für .NET und Java im Bereich Web.Als Fan der .NET-Plattform lässt er sich kein Userguppen Treffen und Community Event im Raum OWL entgehen.Dabei hat er eine besondere Vorliebe für das ASP.NET MVC Framework und für das Test Driven Development (TDD) entwickelt.

Comments
user

Author Michael

Posted at 12:20 8. November 2009.

Gefällt mir:
* Einblicke in tiefere vb.net Programmierpraxis
* Einfach gehalten
* leicht verständlich
* Bilder zu den Erklährungen (für selbstkontrolle)

Verbesserungsvorschläge:
* leider keine (obwohl diese Kritik eigentlich wichtiger ist)
* der Downloadlink funktioniert bei mir nicht. Anstatt dessen bekomme ich so eine Nachricht: „Deprecated: Assigning the return value of new by reference is deprecated in /customers/bigbasti.com/bigbasti.com/httpd.www/blog/wp-settings.php on line 520“ …… u.s.w.
* Nachdem ich das Tutorial angewendet habe, gibt es bei mir einen Fehler:
Das Form wird wie bei dir auf dem letzten Bild angezeigt… nur mit einem unterschied. Ganz links am Anfang (der eigentlichen Form die ja jetzt weck ist) beginnt das Form und hört gleich wieder auf. Also ein dicker Strich von oben nach unten.

In zwei Worten: Tolles Tutorial!

Kommentar verfassen

View Comments (1) ...
Navigation