Redimensionar un control de texto con el tamaño de su contenido

En ocasiones, trabajando con WinForms, nos encontramos con un control contenedor de un texto variable en el que, o nos sobra espacio o nos falta. La clase Graphics de System.Drawing nos proporciona un método tremendamente útil para saber el tamaño, en píxels, de una cadena de texto.
Veremos a continuación cómo redimensionar de forma dinámica un control dependiendo del tamaño del texto contenido. Para ello crearemos, por ejemplo, un TextBox al que llamaremos txtPrueba, y en el que albergaremos un texto, por ejemplo “Más vale pájaro en mano, que ciento volando”.


txtPrueba.Text = "Más vale pájaro en mano que ciento volando";

A continuación, declararemos dos variables enteras, una para el alto y otra para el ancho.

// Declaramos una variable entera para almacenar el nuevo ancho y el nuevo alto
int nuevoAncho = 0;
int nuevoAlto = 0;

Es ahora donde instanciaremos la clase Graphics a partir del control TextBox, y extraeremos la fuente que está utilizando.

// Creamos un objeto de tipo Graphics a partir del TextBox
Graphics g = txt.CreateGraphics();

// Extraemos la fuente del TextBox
Font fuente = txt.Font;

Obtenemos, a partir del objeto Graphics, su alto y ancho a partir del método MeasureString, que no hace otra cosa que medir, en pixels, el tamaño que ocupa la cadena con la fuente indicada.


nuevoAncho = (int)g.MeasureString(txt.Text, fuente).Width;
nuevoAlto = (int)g.MeasureString(txt.Text, fuente).Height;

Por último, asignamos los nuevos valores de alto y ancho y refrescamos el control.


txt.Width = nuevoAncho;
txt.Height = nuevoAlto;

txt.Refresh();

A partir de estos conceptos básicos, se pueden encontrar multitud de utilidades a este proceso, como por ejemplo, redimensionar el desplegable de un ComboBox al tamaño del mayor de sus elementos.

One Response to “Redimensionar un control de texto con el tamaño de su contenido”

  1. Jorge (Vigo) - Diciembre 24, 2009

    Hola. Muy buen post. Estoy leyendo el del combobox que crece al tamaño del mayor de sus elementos y es una cosa que ahora mismo me hacía falta. Ahora una duda …..
    Me estoy haciendo una aplic. con una pantalla MDI y otras hijas. La pantalla MDI tiene una barra tipo barra de inicio de Windows,y quiero que sus ventanas hijas al minimizarlas se minimizen en ellas. Ya lo tengo echo, pero quiero que hagan el efecto visual que se produce cuando se hace contra la barra de inicio de Win. Es decir, hacerse pequeña poco a poco e ir movíendose hacia la barra (y viceversa al volver a su estado normal). ¿Cómo me sugieres que lo haga?. Me faltan conocimientos de GDI. ….. Muchísimas gracias !!!!

Leave a Reply