Il y a eu des discussions sur Internet sur l'implémentation du style XP via la programmation, mais il n'existe pas de solution parfaite pour implémenter le style XP via la programmation VB. L’auteur a finalement révélé le secret au cours de N jours et nuits d’études approfondies. Ce qui suit est divisé en trois aspects à partager avec vous.
Cliquez pour télécharger le fichier de code source
un. Utiliser des fichiers manifestes pour obtenir le style XP
Dans des circonstances normales, sur les systèmes Windows XP, seule la barre de titre de la fenêtre d'une application développée avec VB6 a le style XP, et les boutons, zones de texte et autres contrôles du formulaire affichent toujours le style Windows traditionnel. Comme le montre la figure 1 :
En consultant le chapitre Style visuel dans MSDN, nous savons que Windows XP utilise Comctl32.dll (version 6) pour charger les composants avec le style XP, et l'application informe le système de le faire via un fichier de ressources XML. Le contenu du fichier XML est le suivant :
<?version xml=encodage 1.0=UTF-8 autonome=oui ?>
<assembly xmlns=urn:schemas-microsoft-com:asm.v1 manifestVersion=1.0>
<assemblyIdentity
nom = manifeste de style XP
architecture du processeur = x86
version=1.0.0.0
tapez=win32/>
<dépendance>
<Assemblagedépendant>
<assemblyIdentity
tapez = win32
nom = Microsoft.Windows.Common-Controls
version=6.0.0.0
architecture du processeur = x86
publicKeyToken=6595b64144ccf1df
langue=*
/>
</assemblydépendant>
</dépendance>
</assemblage>
Supposons que le nom de votre programme compilé final est abc.exe et que le répertoire de travail est d:/vbxp. Copiez le contenu XML ci-dessus et enregistrez-le sous forme de fichier texte. Renommez ensuite le fichier abc.exe.manifest (notez que l'extension .txt doit être supprimée). Dans le programme VB, nous devons appeler la fonction InitCommonControlsEx pour initialiser la classe de composant à partir de comctl32.dll (version 6) avant que tous les formulaires ne soient chargés. La fonction API InitCommonControlsEx et les constantes et types de données associés sont déclarés comme suit :
Fonction de déclaration privée InitCommonControlsEx Lib comctl32.dll _
(iccex Comme tagInitCommonControlsEx) Comme booléen
Type privé tagInitCommonControlsEx
lngSize Aussi longtemps
lngICC aussi longtemps
Type de fin
Const privée ICC_USEREX_CLASSES = &H200
Ici, nous écrivons une fonction pour encapsuler l'opération d'initialisation :
Fonction publique InitCommonControlsVB() en tant que booléen
En cas d'erreur, reprendre ensuite
Dim iccex Comme tagInitCommonControlsEx
Avec icex
.lngSize = LenB (iccex)
.lngICC = ICC_USEREX_CLASSES
Terminer par
InitCommonControlsExiccex
InitCommonControlsVB = (Err.Number = 0)
En cas d'erreur, allez à 0
Fonction de fin
Notez que l'action d'initialisation doit être terminée avant que tous les formulaires ne soient chargés, les instructions pertinentes doivent donc être placées dans Sub Main() et le projet doit être démarré à partir de Sub Main(). Le code est le suivant :
Sous-principal()
InitCommonControlsVB
Form1.Afficher
Fin du sous-marin
À ce stade, votre abc.exe compilé aura le style XP, comme le montre la figure 2 :