Gestion des thèmes XP [Résolu]

Signaler
Messages postés
787
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
-
Messages postés
787
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
-
Bonsoir,



Vous avez peut-être (ou pas) remarqué ma dernière source sur les
richedits avec apparence XP. Je souhaiterais corriger un bug qui fait
qu'une application sans manifest (et donc, non censée utiliser les
thèmes XP) dessine malgré tout les richedits avec l'apparence XP, ce
qui fait tâche au milieu des autres composants...



D'après la MSDN, je devrais utiliser la fonction IsAppThemed et/ou
IsThemeActive. Je les ai donc importées et utilisées lors de la
réception du message WM_THEMECHANGED mais elles retournent toujours
TRUE, indifféremment avec ou sans manifest...



http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/userex/functions/isappthemed.asp

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/userex/functions/isthemeactive.asp



Merci d'avance...



PS : rien à voir, mais çà serait bien de skinner cette boîte à partir
des couleurs du site, çà fait un peu tache ce bleu au milieu de ce...
euh, c'est quoi comme couleur d'ailleurs, les cadres de cppfrance ?

12 réponses

Messages postés
787
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1
Bon, j'ai finalement trouvé... Il "suffit" de vérifier la version de
comctl32.dll mappée dans notre processus : avec un manifest on a la
version 6 ou plus, sans manifest on a la version 5.



Merci pour ton aide
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
115
La fonction IsThemeActive te permet juste de savoir si le thème
WindowsXP est actif ou si l'utilisateur utilise ce bon vieil habillage
de Windows 98 ! Donc que ta fenêtre soit ou pas skinnée, elle te
renverra la même chose d'après les recherches que j'ai pu faire.

DarK Sidious

[Administrateur et responsable VB/API du site ProgOtoP]
Messages postés
787
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1
Certes mais IsAppThemed, tu ne trouves pas que sa description ressemble
à ce dont j'ai besoin (et pourtant, elle renvoie toujours TRUE elle
aussi) ?
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
115
Ben justement : ca renvoie si l'application utilise un thème ou pas...

DarK Sidious

[Administrateur et responsable VB/API du site ProgOtoP]
Messages postés
787
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1
Et elle renvoie TRUE que l'application utilise ou non un manifest (donc, avec ou sans thème activé)...
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
115
Le fait d'utiliser ou non un manifest n'empêche pas à la fenêtre
d'utiliser le thème XP si Windows utilise un thème (y'a qu'à voir la
barre de titre par exemple !). Applique le thème de Windows classique,
et rappelle ta fonction IsAppThemed et tu verra...

DarK Sidious

[Administrateur et responsable VB/API du site ProgOtoP]
Messages postés
787
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1
Ben non, sans manifest seuls les bords de la fenêtre sont "skinnés",
les contrôles (boutons, etc) ne le sont pas sauf mon richedit qui est
là comme un blaireau avec les thèmes XP... et IsAppThemed renvoie TRUE,
même dans ce contexte.



Voici comment je gère :

case WM_THEMECHANGED:

if (hTheme != NULL) {

pCloseThemeData(hTheme);

}

if (pIsThemeActive != NULL && pIsThemeActive() != 0 && pIsAppThemed() != 0) {

hTheme = pOpenThemeData(hWnd, L"EDIT");

} else {

hTheme = NULL;

}



Les p*** sont des pointeurs de fonctions sur les fonctions d'uxtheme.dll, ils sont initialisés comme suit :

pIsThemeActive = (ITA) GetProcAddress(hUxTheme, "IsThemeActive");

pIsAppThemed = (IAT) GetProcAddress(hUxTheme, "IsAppThemed");

pOpenThemeData = (OTD) GetProcAddress(hUxTheme, "OpenThemeData");

etc...



Et que l'application intègre ou non un manifest, les richedits se dessinent avec le style XP...
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
115
Oui, c'est ce que je dit : sans manifest, ton application utilise quand
même les thèmes ne serait-ce que pour la barre de titre de la fenêtre !
Maintenant, si les richedits utilise les API de l'uxtheme.dll pour se
tracer, forcément, il se tracera au look XP si le thème est actif, même
si l'application n'utilise pas de manifest !

DarK Sidious

[Administrateur et responsable VB/API du site ProgOtoP]
Messages postés
787
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1
Bon, on va tout récapituler depuis le début...



Avec manifest : http://athanatos.free.fr/temp/RichXP/avec.gif

Sans manifest : http://athanatos.free.fr/temp/RichXP/sans.gif



Ces deux applications utilisent le code que j'ai donné plus
haut, la seule différence concerne la présence ou l'absence du manifest
dans les ressources. Et ce que je voudrais, c'est savoir comment m'y
prendre pour détecter si je dois tracer les richedits avec ou sans les
thèmes XP, de manière à assortir leur apparence aux autres composants
(comme le montrent les deux screens) que les thèmes soient activés ou
non (en fonction des paramètres de l'application et non de Windows).
C'est en cela que je pensais utiliser IsThemeActive (global) et
IsAppThemed (local), mais çà foire...



Pour le moment, j'utilise uxtheme uniquement si les thèmes XP sont
activés, sinon je laisse le richedit faire sa bordure par défaut. Cela
fonctionne très bien si l'utilisateur a désactivé les thèmes XP, mais
lorsqu'ils sont activés cela ne prend pas en compte le manifest, et
voilà tout le problème (sans compter qu'on peut forcer la désactivation
des thèmes XP dans le raccourci de l'application, je n'ai pas encore
testé çà).



Désolé si je te semble agressif, mais çà commence à m'énerver quelque peu de tourner en rond
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
115
Lol, je te comprends !



As-tu essayé la fonction GetWindowTheme ? Car appliqué à ton
richtextbox, peut-être qu'il pourrait te donner l'information
cherchée...



Sache en plus que le richtextbox n'est pas le seul dans ce cas là : le
listbox par exemple ou le textbox classique affichent leurs scrollbar
en thème XP alors que leur bordure reste à la norme Win98 ! Et là, ca
fait encore plus louche ;)


DarK Sidious

[Administrateur et responsable VB/API du site ProgOtoP]
Messages postés
787
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1
Hum je ne pense pas que
GetWindowTheme
puisse grand chose pour moi, je stocke déjà le HTHEME dans une variable
statique pour conserver le retour de OpenThemeData. D'ailleurs c'était
sur cette fonction que je me basais avant pour savoir si les thèmes
étaient actifs : elle retourne NULL s'ils ne le sont pas, sauf dans le
cas d'un manifest (encore lui)...



Quand aux listbox/textbox, ils prennent les styles XP lorsque j'inclus
un manifest, seuls les richedits (toutes versions) semblent n'en faire
qu'à leur tête
Messages postés
787
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1
Bon j'ai essayé GetWindowTheme, rien de probant...



J'ai également testé IsThemeActive, IsAppThemed et GetThemeAppProperties, ainsi :

if (pIsThemeActive() != 0

&& pIsAppThemed() != 0

&& (pGetThemeAppProperties() & STAP_ALLOW_NONCLIENT) != 0

&& (pGetThemeAppProperties() & STAP_ALLOW_CONTROLS) != 0

) {

/* mode XP */

hTheme = pOpenThemeData(hWnd, L"EDIT");

} else {

/* mode classique */

hTheme = NULL;

}



Mais rien n'y fait, les richedits sont toujours dessinés avec le style XP malgré l'absence d'un manifest... C'est déprimant