Xp aero glass

Soyez le premier à donner votre avis sur cette source.

Vue 47 661 fois - Téléchargée 3 155 fois

Description

Ceci est la VERSION 2.0 mise à jour le 18/12/2006 (voir détail à la fin)

Simulation de fenêtres AERO GLASS sous XP.

Le projet s'appuie exclusivement sur les possibilités offertes par VISUAL C# 2005 Express Edition.

Pour skinner la fenêtre, j'ai utilisé quelques unes des techniques utilisées dans WinLIFT et GDImage, plus une bonne pincée de code bas niveau Win32.

Les images du Skin sont réalisées avec zDraw et PhotoShop, dans l'esprit de Windows VISTA.

Ce que fait le code :

- Gestion d'un skin (gabarit) en mode 9-images.
- Gestion de zones transparentes et opaques au sein d'une même fenêtre.
- Gestion de l'ombre portée (drop shadow).
- Gestion de boutons de n'importe quel forme avec un bitmap a 5 états.
- Simulation complète du fonctionnement d'une fenêtre standard.
- Utilisation de code unsafe pour créer des régions à la volée.
- Utilisation de l'API bas niveau Win32.

Création d'un Skin en mode 9-images.
------------------------------------

Il y a une grande différence entre l'utilisation d'une forme détourée statique, et une fenêtre skinnée qui se comporte comme une fenêtre standard dont on peut modifier la taille à la volée.

Voici pas à pas la marche à suivre :

A - On commence par représenter la fenêtre skinnée dans un logiciel de dessin.
B - On utilise la couleur magenta (RGB 255,0,255) pour délimiter les zones transparentes du Skin (region).
C - On découpe le dessin en 9 parties distinctes, que l'on sauvegarde dans des fichiers individuels dans le répertoire "resources" de l'application, en respectant le schema ci-dessous :

+---+-----------------+---+
|.1.|........2........|.3.|
+---+-----------------+---+
|...|.................|...|
|.4.|........5........|.6.|
|...|.................|...|
+---+-----------------+---+
|.7.|........8........|.9.|
+---+-----------------+---+

1 - TopLeft.png (partie fixe)
2 - SideTop.png (partie étirée ou juxtaposée)
3 - TopRight.png (partie fixe)
4 - SideLeft.png (partie étirée ou juxtaposée)
5 - Center.png (partie étirée ou juxtaposée)
6 - SideRight.png (partie étirée ou juxtaposée)
7 - BottomLeft.png (partie fixe)
8 - SideBottom.png (partie étirée ou juxtaposée)
9 - BottomRight.png (partie fixe)

D - On créé les boutons system qui seront disposés dans la zone non-client, en utilisant un bitmap à 5-états qui représente les différents aspects (normal, enfoncé, inactif, focus, survol), on créé également le bouton par défaut.

E - On créé 2 petits bitmaps pour représenter le changement de focus sous forme de LED.C

On place chacun des 9 éléments du skin directement sur le fond de la fenêtre (form) en respectant le schéma ci-dessus et en utilisant le mode d'encrage approprié.

On ajoute les boutons système au bon endroit avec un encrage haut/drot.

On ajoute un control Panel qui servira de zone client et de conteneur pour tous les contrôles enfants de la fenêtre.

Region(s) dynamiques :
----------------------
C'est l'un des points les plus important, les régions qui délimitent les zones détourées de la fenêtre doivent pouvoir s'ajuster de façon dynamique au changement de taille de la fenêtre. Une bonne connaissance de l'API bas niveau est nécessaire pour y parvenir (voir BuildRegion et CombineRegion dans le code source).

Rendu de l'effet AERO-GLASS :
-----------------------------
Celui-ci est obtenu en combinant une fenêtre transparente (Layered) et une fenêtre fille de type popup que l'on maintent en dessous de la fenêtre principale pour délimiter une zone opaque comportant elle même des zones transparentes (regions).
Afin de maintenir la zone opaque en dessous de la zone transparente en TOUTES CIRSCONSTANCES on utilise l'API bas niveau SetWindowPos conjointement à MoveWindow.
J'ai passé beaucoup de temps sur cette partie du code, ainsi que sur la gestion dynamique des régions, je vous conseille de ne rien toucher si vous n'avez pas une parfaite connaissance de l'API Win32.

Ombre portée :
--------------
Le programme utilise l'API Win32 SetClassLong pour ajouter le style étendu CS_DROPSHADOW à la fenêtre principale.

J'espère que ces quelques explications vous aideront à mieux comprendre la marche à suivre pour créer de véritables fenêtres skinnées et non pas de simples splash screen basés sur une région statique.

NOUVEAUTES DE LA VERSION 2.00
-----------------------------

- SkinButton.cs
Cette classe prend en charge l'affichage et le gestion complète des boutons skinnés créés à partir d'un bitmap à 5 états.

Deux types de boutons sont supportés.
1 - Le mode "PushButton" (bouton dynamique)
Pour créer des boutons rectangulaire avec ou sans région, dont la taille peut être modifiée à volonté dans le "designer" de Visual Studio.
2 - Le mode "forme libre" (bouton statique)
Pour créer des boutons de n'importe quel forme, dont la taille correspond exactement à la dimension du resource bitmap à 5 états qui est utilisé.

- SkinCaption.cs
Cette classe est spécialement conçue pour skinner le caption d'une fenêtre.
Elle permet le déplacement par tirer déplacer, et détecte le double clic pour agrandir ou réduire la taille de la fenêtre.

- MsgBox_About.cs
Cette classe montre comment skinner une boîte de dialogue personnalisée avec ou sans ombre portée.

- SkinEngine.cs et Win32.cs
Ces deux classes ont été modifiées pour intégrer de nouvelles méthodes.

- Scintillement
Lors des redimensionnements, le programme gêle l'affichage de la zône client pour atténuer au maximum l'effet de clignotement (cf WM_SIZE).

- API Win32
Le programme est obligé de recourir massivement aux fonctions de L'API Win32 bas niveau,
car il n'est pas possible avec les seules fonctions DotNET de créer des fenêtres aussi personnalisées.

Conclusion :


Vous trouverez sur http://www.zapsolution.com (lien "C# corner")
une liste actualisée de mes codes sources C# classés par thème.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
15
Date d'inscription
samedi 2 janvier 2010
Statut
Membre
Dernière intervention
27 août 2011

Bonjours,
Cela serait compliquer si je voulais l'utiliser pour faire une fenêtre personnaliser ?
Est-ce qu'on peut y mettre des controls c# qu'on a créer sois même
Messages postés
78
Date d'inscription
mardi 31 décembre 2002
Statut
Membre
Dernière intervention
14 août 2010

>>J'ai un peu de mal à comprendre en quoi sont développées vos applis.
Mes applications sont développées avec différents langages, mais mon langage de prédilection est le PowerBASIC, avec lequel je développe toutes mes DLLs Win32 bas niveau, lesquelles s'interfacent avec tous les compilateurs Win32 ainsi que les langages managés de type DotNET.

>>Utilisez vous une librairie graphique
Oui, ma librairie graphique GDImage, dont les renseignements sont ici :
http://www.zapsolution.com/winlift/gdimage.htm

Patrice Terrier
www.zapsolution.com
Messages postés
33
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
30 juin 2008

Merci de votre réponse détaillée.

Je me suis inscrit sur le forum que mous m'avez indiqué parce que je suis très emballé par ce que vous y présentez.

Le fait est que je dois développer une ihm pour un player (plutôt reader, aucune gestion de playlist, contrôle minimaliste) qui se présente sous forme d'activeX.

Je me suis lancé dans cette ihm en win32 car je n'ai pas de recul sur les technologies à ma portée, et je ne sais pas vraiment laquelle utiliser. (tout frais sorti de la fac :) )

Actuellement, je suis cantonné à une interface à base de bitmaps, et ca m'a l'air peu efficace.

J'ai un peu de mal à comprendre en quoi sont développées vos applis.
Utilisez vous une librairie graphique ?

Cordialement.
Messages postés
78
Date d'inscription
mardi 31 décembre 2002
Statut
Membre
Dernière intervention
14 août 2010

Si vous travaillez en full mode Win32 (non managé) et que la programmation bas niveau SDK ne vous fait pas peur, alors je vous conseille d'étudier les différents code que j'ai posté sur le forum de José Roca (vous devez vous enregistrer sous votre nom réel pour pouvoir télécharger les sources) voir les différents liens ci-dessous :

- BassBox :
http://www.jose.it-berater.org/smfforum/index.php?topic=1364.0

- IconMenu :
http://www.jose.it-berater.org/smfforum/index.php?topic=1627.0

- MovieBox :
http://www.jose.it-berater.org/smfforum/index.php?topic=1586.0

- Carousel II
http://www.jose.it-berater.org/smfforum/index.php?topic=1327.0

Plus toute la série des SDK programming qui se trouve ici :
http://www.jose.it-berater.org/smfforum/index.php?board=151.0

Les codes sources ne sont pas écrits en C# mais en PowerBASIC, car je pratique plusieurs langages (y compris le W langage de WinDev).

Comme vous pourrez le constater les affichages sont parfaitement fluides, car je gère directement toute l'interface sans recourir a un moteur d'affichage comme dans VISUAL STUDIO.

Patrice Terrier
www.zapsolution.com
Messages postés
33
Date d'inscription
mercredi 12 septembre 2007
Statut
Membre
Dernière intervention
30 juin 2008

Je n'ai pas compris dans votre code comment sont dessinés les bords (dégradés verticaux) (je ne connais pas C#)

Comment faites vous pour que le dégradé soit recalculé après un resize ?

Cordialement.
Afficher les 24 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.