Comment rendre vos applications transparentes sous Windows Vista ?
Introduction
Vous avez sûrement remarqué, les applications de Windows vista possèdent leurs bordures transparentes
Mais comment créer une application utilisant ce principe ? En fait c’est le Desktop Window Manager (DWM) qui est l’API permettant de réaliser cet effet. Cette API (dwmapi.dll) va donc nous permettre d’utiliser le look à la vista
On passe à l’action
- Tout d’abord assurons nous que notre application tourne bien sous Windows Vista pour cela on utilise les variables d’environnement :
if (Environment.OSVersion.Version.Major < 6) Application.Exit();
- Maintenant nous souhaitons utiliser l’API dwmapi.dll alors il suffit d’ajouter une référence !!! En fait non car cette API n’est pas écrite en .NET. Il faudra donc utilisé P/Invoke qui permet d’acceder à des fonctions de codes non managés.
1: using System.Runtime.InteropServices;
2:
3: //PreserveSig mit à true permet de traduire les valeurs de retour des fonctions en exceptions
4: [ DllImport(”dwmapi.dll”, PreserveSig = false) ]
5: public static extern bool DwmIsCompositionEnabled();
6: //Permet de vérifier si la transparence est activée sur le système
7:
8: //Redéclaration de la structure non gérée
9: public struct MARGINS {
10:
11: public int cxLeftWidth, cxRightWidth, cyTopHeight, cyBottomHeight;
12: public MARGINS(int left, int right, int top, int bottom)
13: {
14: cxLeftWidth = left;
15: cyTopHeight = top;
16: cxRightWidth = right;
17: cyBottomHeight = bottom;
18: }
19: }
20:
21: // Permet d’utiliser la transparence
22: public static extern void DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS pMargins);
On utilise la fonction externe qui permet de vérifier si on peux activer la transparence :
1: if (DwmIsCompositionEnabled()) //on peut activer la transparence
2: {
3: MARGINS marges = new MARGINS(-1, 0, 0, 0);
4: DwmExtendFrameIntoClientArea(this.Handle, ref marges);
5: this.Invalidate(); //On redessinne notre fenètre
6: }
- Pour finir on dois redefinir notre méthode OnPaint en utilisant un brush noir sur notre fenètre
1: protected override void OnPaint(PaintEventArgs e)
2: {
3: if (DwmIsCompositionEnabled())
4: {
5: e.Graphics.FillRectangle(Brushes.Black, this.ClientRectangle);
6: }
7: base.OnPaint(e);
8: }
Voilà c’est fini vous pouvez donner maintenant le look ‘n’ feel à la vista dans vos applications