Bonjour,
J'aimerai dans mon appli Delphi pouvoir utiliser les thèmes Windows (pour avoir un look "moins rétro" ;-)) tout en conservant la possibilité de changer la couleur de police. En effet l'utilisation des thèmes dans une application rend impossible le changement de couleur du texte pour certains composants (TGroupBox, TButton, etc...).
J'ai donc regardé rapidement l'implémentation de la VCL, il en ressort que ce sont principalement deux fonctions qui sont utilisées pour "dessiner le texte" lorsque le thème est actif :
- "UxTheme.DrawThemeText"
- "UxTheme.DrawThemeTextEx"
La première est un pointeur définie lors de l'appel à "InitThemeLibrary", il est donc très facile de modifier ce pointeur une fois l'appel effectué pour le rediriger vers ma fonction qui modifie le comportement comme je le souhaite.
J'ai par contre un problème avec "UxTheme.DrawThemeTextEx" qui est une fonction inline qui "appelle" la fonction correspondante de la librairie "uxtheme.dll".
J'ignore d'ailleurs à quoi elle sert réellement puisqu'elle ne fait qu'appeler la même fonction de la librairie et possède le même nom. Seule la convention d'appel change (stdcall pour la fonction de la dll, fastcall pour la fonction inline "englobante").
Comment puis-je modifier le comportement de cette fonction ?
Comme il s'agit d'une fonction "statique" je ne peux évidemment pas faire "TDrawThemeTextEx( Addr(UxTheme.DrawThemeTextEx)^ ):= MyDrawThemeTextEx" car cela entraîne une violation d'accès.
Puis-je "hooker" localement (sur le processus) cette fonction de la dll ? Je sais que cela peut se faire sur certaines fonctions de certaines dll mais j'ignore si dans mon cas cela est possible, et honnêtement je ne sais plus comment on fait.
Merci pour votre aide.
Partager