A raíz de esta pregunta de TiammatMx he escrito una pequeña función que determine el ancho y alto de un texto multilínea, es decir la caja que lo contendrá. Lo he escrito con la API GetTextExtentPoint32 pero se podría haber hecho de otra manera. Simplemente tendremos que localizar el ancho de la línea mas larga y contar el número de líneas para multiplicarlo por el alto de una línea, con lo que obtenemos el ancho y alto de la caja.
La función sirve tanto para textos de una sola línea como de varias.
Esta es la función:
delphi
// Calcula el tamaño del cuadro que contiene un texto "Multiline" function GetTextExtentML(Canvas: TCanvas; Text: String): TSize; var Size: TSize; nLines, Ini, i, L: integer; begin nLines:= 0; Ini:= 1; L:= Length(Text); for i:=1 to L do begin if (Text[i] = #13) or (i = L) then begin GetTextExtentPoint32(Canvas.Handle, PCHAR(@Text[Ini]), i-Ini, Size); if Result.cx < Size.cx then Result.cx:= Size.cx; Ini:= i; inc(nLines); end; end; Result.cy:= Size.cy*nLines; end;
Un ejemplo de uso:
delphi
var Size: TSize; begin Size:= GetTextExtentML(Canvas, 'Hola'+#13#10+'Adios');
Saludos.
Edito para arreglar etiqueta de código alterada