Bonjour,
après quelques recherches non concluantes, je me retourne vers vous.
Je cherche à connaîtres la taille (Hauteur) en pixel du texte formaté d'un RichEdit.
Merci d'avance.
Bonjour,
après quelques recherches non concluantes, je me retourne vers vous.
Je cherche à connaîtres la taille (Hauteur) en pixel du texte formaté d'un RichEdit.
Merci d'avance.
Aucune idée...![]()
Allez, on va dire que c'est la question de la semaine. (J'aurai surement plus de chance)![]()
Comment avoir les dimensions (largeur/hauteur) en pixels d'un texte formaté (rtf) ?
Bonne chance![]()
Demain je t'envoie la solution, si si, elle est sur le PC de mon boulot![]()
[Mis à jour, Merci Portu !]
Salut et comme promis, voici la fonction "magique" qui permet :
- soit d'afficher le contenu d'un TRichEdit dans un TCanvas (mettre RenderIt à True, dans les limites d'un Rectangle donné Rect)
- soit de mesurer la taille du texte (RenderIt à False, dimensions du Rectangle donné renvoyées dans Rect)
Utilisation :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 function PrintToCanvas(ACanvas : TCanvas; FromChar, ToChar : integer; ARichEdit : TRichEdit; var ARect : TRect;RenderIt:boolean) : Longint; var Range : TFormatRange; begin //Précaution SendMessage(ARichedit.Handle, EM_FORMATRANGE, 0, 0); if not RenderIt then begin SetRect(ARect,0,0,ARichEdit.Width,ARichEdit.Height); end; FillChar(Range, SizeOf(TFormatRange), 0); Range.hdc := ACanvas.handle; Range.hdcTarget := ACanvas.Handle; Range.rc.left := ARect.Left * 1440 div Screen.PixelsPerInch; Range.rc.top := Arect.Top * 1440 div Screen.PixelsPerInch; Range.rc.right := ARect.Right * 1440 div Screen.PixelsPerInch; Range.rc.Bottom := ARect.Bottom * 1440 div Screen.PixelsPerInch; Range.chrg.cpMax := ToChar; Range.chrg.cpMin := FromChar; if RenderIt then Result := SendMessage(ARichedit.Handle, EM_FORMATRANGE, 1, Longint(@Range)) else begin Range.chrg.cpMax := ARichedit.GetTextLen; Result := SendMessage(ARichedit.Handle, EM_FORMATRANGE, 0, Longint(@Range)); ARect:=Range.rc; ARect.Bottom := Range.rc.Bottom * Screen.PixelsPerInch div 1440; end; SendMessage(ARichEdit.handle, EM_FORMATRANGE, 0,0); end;
ACanvas (TCanvas) :
Un Canvas qui sert à "dessiner" le texte formaté (celui d'un TBitmap que l'on a crée pour l'occasion par exemple)
FromChar, ToChar (integer) :
Index du premier et dernier Caractère du texte à prendre en compte pour mesurer le texte (mettre Tochar à -1 pour prendre le dernier caractère du texte)
ARichEdit (TRichEdit) :
Le TRichEdit qui contient le texte formaté
RenderIt (boolean) et var ARect (TRect) :
True : on dessine vraiment le texte formatté dans ACanvas, dans les limites du Rectangle Rect passé en paramètre.
False : on mesure le texte et on renvoi ses dimensions dans Rect
Exemple :
On mesure la taille complète du texte (index de 0 à -1)
J'ai construit cette fonction pour faire un composant qui permet d'afficher le texte formatté d'un champ d'une base de données dans un DBControlGrid , bien centré dans le Panel de ce dernier.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 var ARect:TRect; PrintToCanvas(Form1.Canvas,0,-1,RichEdit1,ARect,false);
![]()
tu es, sans conteste, le grand gagnant de la Question de la semaine![]()
Merci et a+
Un bout de code qui peut s'avérer TRES pratique
A mettre dans la FAQ Waskol ?
Section Delphi
La mine d'or: La FAQ, les Sources
Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
Notre revanche ? l'inverse est aussi vrai ;-)
Je m'en charge en ce momentEnvoyé par TicTacToe
Sinon, une précision :
La fonction retourne l'index du dernier caractère qui tient dans le Rectangle Rect plus 1 (donc Index_du_dernier_caractère+1).
voilà, voilà
Partager