Richedit avec support des thèmes xp

Soyez le premier à donner votre avis sur cette source.

Vue 7 005 fois - Téléchargée 639 fois

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

Ajouter un commentaire

Commentaires

victorcoasne
Messages postés
1100
Date d'inscription
jeudi 24 avril 2003
Statut
Membre
Dernière intervention
17 octobre 2012
3 -
Génial c'est ce que je cherchais, sauf que j'avais trouvé le code d'origine avant cette source (code que je ne comprenait pas).
Mais avec cette source c'est clair comme de l'eau de roche !
10 / 10 !
Encore merci,
Bonne prog,
@++,
Victor
badr07
Messages postés
53
Date d'inscription
mercredi 22 février 2006
Statut
Membre
Dernière intervention
15 novembre 2006
-
en c++
badr07
Messages postés
53
Date d'inscription
mercredi 22 février 2006
Statut
Membre
Dernière intervention
15 novembre 2006
-
salut,
Comment mettre un style(pas Xp)different dans une application(api windows) avec un manifest?
cs_Nebula
Messages postés
790
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1 -
Cherche EM_STREAMIN ici même, tu trouveras des réponses satisfaisantes. Sinon (alternative à la génération directe de texte enrichi), EM_EXSETSEL et tu modifies les attributs du texte manuellement.
minet03
Messages postés
415
Date d'inscription
samedi 4 janvier 2003
Statut
Membre
Dernière intervention
2 décembre 2005
-
Ton code m'intéressait dans le but de connaitre plus de message pour les richedit, genre mettre les couleurs. Mais je vois que dans ton code il n'y en a pas. Si tu pouvais me donner un lien (autre que http://msdn.microsoft.com) parce que je cherche, mais je ne trouve que des exemples pour les afficher, et non les afficher.

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.