Richedit avec support des thèmes xp

Description

Cette petite astuce permet aux Richedits d'avoir (enfin !) la gestion des thèmes de Windows XP. Il a été adapté à partir d'un code C++ dont je vous conseille la lecture, car il explique très bien comment gérer ces fameux thèmes, bien que je ne trouve pas son fonctionnement optimal : l'auteur utilise un sous-classement de chaque contrôle, alors que ma version super-classe tous les Richedits en un seul appel, au lancement du programme.

La gestion des thèmes est faite dynamiquement : le programme essaie de charger uxtheme.dll et s'il n'y arrive pas, entre en mode "compatibilité" et laisse le dessin par défaut (look "classique") se faire. Si cette librairie est chargée en revanche, il essaie d'ouvrir le thème courant, et s'il y arrive (les thèmes sont alors activés) il dessine la bordure du Richedit (look "XP), sinon il laisse le dessin par défaut se faire (les thèmes étant désactivés, restons cohérents).

Petit constat amusant : le dessin des thèmes XP se fait même si l'application n'intègre pas de manifest dans ses ressources, je ne sais pas comment corriger cela (peut-être en cherchant le manifest dans les ressources lors de l'appel de la fonction de sur-classement, mais il doit y avoir un moyen plus direct je pense). Ce n'est pas très gênant étant donné que si on se sert de cette fonction c'est qu'on veut les thèmes XP, mais c'est à savoir ;-)

Pour réutiliser ceci dans vos applications : ne conservez que richxp.h et richxp.c, et éditez ce dernier pour remplacer "config.h" par votre fichier de définitions globales (stdafx.h sous VC++, par exemple), puis faites un appel à LoadRichXP() au début de votre code (AVANT de créer une fenêtre ou une dialog !), et voilà. Vérifier le retour est facultatif, il ne renseigne que sur la présence ou l'absence de uxtheme.dll (évitez d'appeler la fonction plusieurs fois, çà ne servirait à rien et je ne l'ai pas protégée contre cette utilisation idiote).

Le code est entièrement compatible : ANSI et UNICODE, GCC/MinGW et MSVC (et sûrement d'autres), utilise un RichEdit 2.0 et a été écrit en C.

Un conseil : pour éviter des changements de styles superflus, créez vos Richedits avec 0 pour les styles étendus : le programme se charge d'activer ou non WS_EX_CLIENTEDGE en fonction des besoins (si vous mettez des styles étendus, Windows crée la fenêtre puis lui envoie un WM_STYLECHANGED dans la foulée, ce qui surcharge inutilement mon code d'initialisation - ce n'est pas gênant, juste un message inutile à traiter, qui en appelle plusieurs autres ensuite).

Ah aussi... Il n'y a aucun commentaire dans le code, simplement parce que je n'aime pas çà : je préfère avoir le plus de code utile possible devant moi. Le code (C++) à partir duquel j'ai travaillé est disponible ici, et est agrémenté d'explications parfaitement claires et très instructives sur la gestion des thèmes XP, je vous conseille vivement de le lire (comme je disais plus haut), ce code vous semblera limpide ensuite : http://www.codeguru.com/Cpp/W-P/win32/tutorials/article.php/c8729/

Conclusion :


Description des fichiers du ZIP :

config.h
définitions globales (unicode, macros, etc)

GNUmakefile
Makefile pour le GNU Make

main.c
le programme de test :
il crée deux richedit sur-classés,
un clic sur la fenêtre les active/désactive

resource.rc, manifest.xml
script de ressources et manifest pour les thèmes XP

richxp.h, richxp.c
définition de la fonction de sur-classage et de méthodes internes

mingw.exe, msvc.exe
deux binaires précompilés avec MinGW et MSVC
(comment, vous vous en doutiez ? lol)

Codes Sources

A voir également

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.