Profiter du nouveau style visuel de Windows XP

AttentionArticle en cours de rédaction.

Explications

Avant Windows XP, il existait essentiellement 2 types de composants graphiques :
les contrôles utilisateurs de base : bouton, zone de texte, combo box, ... définis dans la dll User32.dll. Celle-ci étant automatiquement liée à un exécutable lors de son lancement, les composants standards sont donc directement accessibles à un programme les contrôles communs (common controls) : zone de texte enrichi, liste déroulante, onglets, ... nécessitant la liaison dynamique avec la dll ComCtl32.dll, c'est à dire d'inclure COMMCTRL.H et d'appeller explicitement InitCommonControls au lancement du programme.
Windows XP possède une nouvelle version de cette librairie : la version 6, qui apporte un nouveau style graphique à tous les composants, y compris les composants utilisateurs de base. ComCtl32.dll version 6 redéfinit donc les composants standards contenus dans User32.dll.
Pour profiter de ces nouveaux styles, une application doit obligatoirement utiliser cette dll. Or, de nombreux programmes possèdent une interface minimale dépourvue de tout composant commun, et ne font donc pas appel à cette librairie. Pour rester compatible, Windows XP possède donc aussi l'ancienne version de ComCtl32.dll, c'est à dire la version 5. Celle-ci est contient uniquement les composants communs pourvus de l'ancien style.
Par défaut, un programme utilise les composants utilisateurs classiques définis dans User32.dll et les composants communs définis dans l'ancienne version de ComCtl32.dll : la version 5.
La seule chose à faire pour profiter du nouveau style visuel de Windows XP est donc tout simplement de faire appel à ComCtl32.dll version 6 dans son programme. Il n'y a donc aucune modification à faire dans le code d'un programme comme on pouraît le croire, si ce n'est à faire appel à InitCommonControls si ce n'était pas déjà fait.
En effet, spécifier la version à utiliser ne se fait pas programmaticalement. Il n'y a pas de fonction qui permette de spécifier la version à utiliser.
Ceci obligatoirement fait à l'aide d'un manifest. Un manifest est un fichier XML qui accompagne un fichier exécutable, et contient, entre autre, des informations sur l'exécutable (nom, version, ...) ainsi que sur la liaison / l'activation de librairies / composants COM. Ce type d'information était auparavant enregistrées dans la base de registre.
Voici un exemple de manifest pour le programme MonProgramme.exe :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
    version="1.0.0.0"
    processorArchitecture="X86"
    name="NomDeCompagnie.NomDeProduit.MonProgramme"
    type="win32"
/>
<description>Description de l'application.</description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="X86"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
</assembly>

Les partie à adapter sont le nom (name="NomDeCompagnie.NomDeProduit.MonProgramme") et la description (<description>Description de l'application.</description>).

Une fois que votre manifest est créé, il faut maintenant l'associer à votre exécutable. Pour se faire, il y a 2 solutions :
- Vous enregistrez votre manifest un fichier que vous appelez MonProgramme.exe.manifest et vous placez ce fichier dans le même répertoire que votre exécutable. Celui-ci sera automatiquement chargé par le système d'exploitation lors de l'exécution de votre programme. - Si le système d'exploitation ne trouve pas de manifest dans le répertoire, il vérifie alors que l'exécutable n'en contienne pas un dans ses ressources. La deuxième solution consiste donc à inclure directement le manifest dans les ressources. Ceci est fait en rajoutant cette ligne dans les fichiers .rc de votre projet :
1 24 "MonProgramme.exe.manifest"
en admettant que le manifest s'appelle MonProgramme.exe.manifest. Ceci va créer une ressource de type RT_MANIFEST (type 24 : nouveau type de ressource introduit avec Windows XP) avec l'identifiant 1. Cette ressource sera une copie conforme de votre fichier MonProgramme.exe.manifest.

#define CREATEPROCESS_MANIFEST_RESOURCE_ID 1
#define RT_MANIFEST 24

A suivre ...


Sommaire