2010-07-14 11 views
2

Est-ce que quelqu'un sait comment obtenir la largeur et la hauteur du texte dans un contrôle TRichEdit, de la même manière que vous utiliseriez TextWidth et TextHeight sur un TCanvas?Comment obtenir l'extension de texte de RichEdit dans Delphi

La raison pour laquelle je dois savoir cela est que j'ai un RichEdit sur une forme non visible dont je copie le contenu dans un canevas en utilisant Richedit.Perform (EM_FORMATRANGE, ...). Le problème est que le EM_FORMATRANGE nécessite un paramètre de type TFormatRange dans lequel le rect cible est spécifié, mais je ne sais pas ce que le rect devrait être car je ne connais pas à l'avance la taille du contenu de RichEdit. J'espère que cela a du sens.

+0

Je dois ajouter que je utilise Delphi 2007. –

Répondre

4

utiliser à nouveau EM_FORMATRANGE pour mesurer, voir EM_FORMATRANGE Message sur MSDN:

wParam Indique si le rendu le texte . Si ce paramètre est une valeur non nulle , le texte est rendu. Sinon, le texte est juste mesuré.

Généralement vous auriez déjà une zone de destination, qui a une largeur et une hauteur, où vous dessinez, comme imprimer sur un papier ou produire un aperçu sur une surface prédéfinie. Un exemple le plus simple pour une largeur prédéfinie pour obtenir la hauteur requise pourrait être;

var 
    Range: TFormatRange; 
    Rect: TRect; 
    LogX, LogY, SaveMapMode: Integer; 
begin 
    Range.hdc := ACanvas.Handle; 
    Range.hdcTarget := ACanvas.Handle; 

    LogX := GetDeviceCaps(Range.hdc, LOGPIXELSX); 
    LogY := GetDeviceCaps(Range.hdc, LOGPIXELSY); 

    Range.rc.Left := 0; 
    Range.rc.Right := RichEdit1.ClientWidth * 1440 div LogX; // Any predefined width 
    Range.rc.Top := 0; 
    Range.rc.Bottom := Screen.Height * 1440 div LogY; // Some big number 
    Range.rcPage := Range.rc; 
    Range.chrg.cpMin := 0; 
    Range.chrg.cpMax := -1; 
    RichEdit1.Perform(EM_FORMATRANGE, 0, Longint(@Range)); 

    ShowMessage(IntToStr(Range.rc.Bottom * LogY div 1440)); // Get the height 
    RichEdit1.Perform(EM_FORMATRANGE, 0, 0); // free cache 


Pour un exemple plus complet voir this article, ou en général tout RichEdit prévisualisation/code d'impression ...

+0

[Ce lien] (http://web.archive.org/web/20080723234245/http://www.delphi3000.com/articles/article_2987.asp) semble fonctionner pour l'instant. –