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 ?
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