Richedit avec support des thèmes xp

Soyez le premier à donner votre avis sur cette source.

Vue 7 372 fois - Téléchargée 3 268 fois

Description

Ce composant une extension du TRichEdit de la VCL, qui supporte les thèmes XP. Les fonctions gérant ces thèmes sont chargées dynamiquement à partir de uxtheme.dll, si elles ne sont pas trouvées (version de Windows antérieure à Windows XP) le composant se met en mode "compatibilité" et laisse le TRichEdit tracer ses bordures par défaut (look "classique"). Si elles sont trouvées, le composant décide de ce qu'il doit faire en fonction des préférences de l'utilisateur : si les thèmes sont activés, il dessine un look "XP", sinon il ne fait rien et affiche donc un look "classique".

J'ai pris comme base mon TRichEditEx posté plus tôt, ce composant supporte donc également les URLs dans le texte et la détection de leur activation par l'utilisateur, au programme ensuite de décider s'il lance le navigateur par défaut avec ShellExecute, ou s'il fait une action personnalisée.

Il y a un petit bug que je ne m'explique pas : lorsque le RichEdit est utilisé avec les scrollbars en ssBoth, le petit carré en bas à droite est mal dessiné : deux lignes de deux pixels semblent être "ignorées" et affichent le contenu de la fenêtre précédente si les thèmes sont activés (testez et vous comprendrez). Si quelqu'un sait comment résoudre ce truc, je suis preneur : j'ai testé plusieurs solutions qui sont restées sans effet... Peut-être un bug dû à Delphi 5, j'ai remarqué que les TStatusBar avaient aussi leur SizeGrip qui déconnait. Si quelqu'un pouvait le compiler avec Delphi 7 ou supérieur pour tester, ce serait sympa ;-) J'ai quand même un doute, car la personne qui a fait le code original (en C++) avait le même problème. En revanche, la version C en API pure fonctionne parfaitement, aucun bug à déplorer.

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 : http://www.codeguru.com/Cpp/W-P/win32/tutorials/article.php/c8729/

Conclusion :


Description des fichiers du ZIP :

MainUnit.dfm et MainUnit.pas
fenêtre principale du programme de démonstration
un clic dessus active/désactive les composants

RichEdits.rc et manifest.xml
ressources pour le support des thèmes XP avec Delphi 5 et antérieurs

RichEdits.dpr
le projet en lui même

RichXP.pas et TRichXP.bmp
le composant TRichXP et un exemple d'icône pour la palette de Delphi

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
82
Date d'inscription
jeudi 25 septembre 2003
Statut
Membre
Dernière intervention
20 avril 2010

Bonjour Tout le monde,

Tout d'abord je précise que je suis sous Win98se et Delphi 7 Studio.

Compo installé et enfin testé sur une petite bidouille = impec tout fonctionne parfaitement de chez parfaitement.
Aucun message d'erreur = nickel/chrôme !

Sauf que bien entendu, étant modestement sous Win98se, je n'ai pas l'avantage du look de TRichXP.

Question bug du ScrollBar, là c'est géant !

J'en avais pourtant essayé des trucs, d'ailleurs je me refusais à penser que c'était du domaine du possible, toutes sortes de TRichEditxxx me donnant également ce vilain bug.

Encore merci et bravo à Nebula !
Messages postés
790
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1
J'ai trouvé l'origine du bug des scrollbars : si une fenêtre est créée avec le style WS_CLIPCHILDREN (ce qui est le cas par défaut avec Delphi), certaines zones peuvent être mal repeintes par Windows... La correction est simple, il faut tout d'abord rajouter dans les déclarations protected de chaque Form qui utilise un de mes richedits (ex ou xp) :
procedure CreateParams(var Params: TCreateParams); override;

Et voici ce qu'il faut mettre dans l'implémentation de cette procédure :
procedure TMainForm.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.Style := Params.Style and not WS_CLIPCHILDREN;
end;

Et adieu le bug ;-)
Messages postés
790
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1
Encore une private joke çà ;-)
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
13
arf, Julio tout simple, c toujours le meme :) deja pas mal ke mon pseudo sois pas en rouge ici lol
Messages postés
790
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1
Jean-Pierre> c'est entendu, j'attend le résultat de tes tests :)

Merci Julio ;-) <joke> Je peux continuer à t'appeler Julio où je dois t'appeler "Monsieur" et te vouvoyer maintenant ? :p </joke>
Afficher les 7 commentaires

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.