.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
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
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
Hier 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 NamespaceWenn 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 NamespaceDie 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 FunctionSchauen 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
Kommen 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 ClassHier 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 ClassStarten wir nun das Programm und klicken auf den Button erhalten wir ein Glasklares Fenster in Aero Optik!
Übrigens, wenn wir als Farbe System.Drawing.Color.DeepPink ¸bergeben färbt sich die Clientoberfläche in Pink.
Ihr 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
geht 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
Sebastian Gross
http://www.bigbasti.comSebastian 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.
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!