Ostatnio zainteresowałem się DWM(czyli Desktop Window Manager), a dokładniej Aero Glass. Postanowiłem bardziej poznać ten graficzny interfejs i Wam go opisać. Jeszcze nie wiem na ile uda mi się go poznać, ale jeśli nauczę się czegoś nowego to opiszę to na moim blogu. Część z tego najprawdopodobniej wykorzystam w moim programie. Dziś opiszę jak uzyskać efekt Aero Glass w oknie.
Program tworze w Microsoft Visual C# 2010 Express i dalej będę się posługiwał nazwami plików tworzonych domyślnie przez to IDE, podczas kreowania aplikacji WPF.
Wprowadzenie
Co to jest DWM? Jest to system GUI(Graphical User Interface) dostępny w Microsoft Windows Vista i Microsoft Windows 7. DWM umożliwia użycie w graficznym interfejsie użytkownika Windows Aero.
Zaczynajmy!
Oto jaki będzie efekt naszej pracy:
Jak to wykonać?
Najpierw stworzymy nową klasę i zincludujemy kilka funkcji z biblioteki dwmapi.dll:
1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Text;
5: using System.Runtime.InteropServices;
6:
7: [StructLayout(LayoutKind.Sequential)]
8: struct MARGINS
9: { 10: public int cxLeftWidth;
11: public int cxRightWidth;
12: public int cyTopHeight;
13: public int cyBottomHeight;
14: }
15:
16: namespace Aero_Glass
17: { 18: class MyAeroGlass
19: { 20: [DllImport("dwmapi.dll", PreserveSig = false)] 21: static extern void DwmExtendFrameIntoClientArea(
22: IntPtr hWnd, ref MARGINS pMarInset);
23:
24: [DllImport("dwmapi.dll", PreserveSig = false)] 25: static extern bool DwmIsCompositionEnabled();
26: }
27: }
W klasie MyAeroGlass zaimplementujemy teraz metodę ExtendGlassFrame. Po jej implementacji plik z klasą wygląda tak:
1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Text;
5: using System.Runtime.InteropServices;
6: using System.Windows;
7: using System.Windows.Interop;
8: using System.Windows.Media;
9:
10: [StructLayout(LayoutKind.Sequential)]
11: struct MARGINS
12: { 13: public MARGINS(Thickness myThickness)
14: { 15: cxLeftWidth = (int)myThickness.Left;
16: cxRightWidth = (int)myThickness.Right;
17: cyTopHeight = (int)myThickness.Top;
18: cyBottomHeight = (int)myThickness.Bottom;
19: }
20:
21: public int cxLeftWidth;
22: public int cxRightWidth;
23: public int cyTopHeight;
24: public int cyBottomHeight;
25: }
26:
27: namespace Aero_Glass
28: { 29: class MyAeroGlass
30: { 31: [DllImport("dwmapi.dll", PreserveSig = false)] 32: static extern void DwmExtendFrameIntoClientArea(
33: IntPtr hWnd, ref MARGINS pMarInset);
34:
35: [DllImport("dwmapi.dll", PreserveSig = false)] 36: static extern bool DwmIsCompositionEnabled();
37:
38: public static bool ExtendGlassFrame(Window window, Thickness thickness)
39: { 40: //Sprawdzmy, czy system jest starszy niż Windows Vista - jeśli tak
41: //to zwracamy false i kończymy pracę pętli
42: //Sprawdzmy także, czy kompozyty DWM są włączone - jeśli nie
43: //to zwracamy false i kończymy pracę pętli
44: if (Environment.OSVersion.Version.Major < 6 || !DwmIsCompositionEnabled()) return false;
45:
46: //Pobiermay uchwyt okna i sprawdzamy, czy ono(okno) istnieje
47: WindowInteropHelper hWnd = new WindowInteropHelper(window);
48: if (hWnd.Handle == IntPtr.Zero) return false;
49:
50: //Tło ustalamy na transparent
51: window.Background = Brushes.Transparent;
52: HwndSource.FromHwnd(hWnd.Handle).CompositionTarget.BackgroundColor = Colors.Transparent;
53:
54: MARGINS myMargins = new MARGINS(thickness);
55:
56: DwmExtendFrameIntoClientArea(HwndSource.FromHwnd(hWnd.Handle).Handle, ref myMargins);
57:
58: return true;
59: }
60: }
61: }
Następnie przesłaniamy metodę OnSourceInitialized:
1: protected override void OnSourceInitialized(EventArgs e)
2: { 3: base.OnSourceInitialized(e);
4:
5: bool mybool = MyAeroGlass.ExtendGlassFrame(this, new Thickness(-1));
6: }
Teraz plik MainWindow.xaml.cs wygląda tak:
1: using System;
2: using System.Windows;
3:
4: namespace Aero_Glass
5: { 6: /// <summary>
7: /// Interaction logic for MainWindow.xaml
8: /// </summary>
9: public partial class MainWindow : Window
10: { 11: public MainWindow()
12: { 13: InitializeComponent();
14: }
15:
16: protected override void OnSourceInitialized(EventArgs e)
17: { 18: base.OnSourceInitialized(e);
19:
20: bool mybool = MyAeroGlass.ExtendGlassFrame(this, new Thickness(-1));
21: }
22: }
23: }