Principales respuestas
Cómo puedo medir una cadena de texto de un control?

Pregunta
-
Un saludo compañeros. De nuevo paso por aquí solicitando su preciada ayuda.Se trata de un Label que tengo al que le asigno la fecha del sistema. Lo que quiero es ajustarlo al tamaño de esa cadena de texto, pero no tengo idea de cómo hacerlo. Estuve revisando unas respuestas del amigo SoftJaén (http://social.msdn.microsoft.com/Forums/es-ES/vbes/thread/e9a5e1a7-b410-4f18-a681-ffdb2271cd7e/) que supongo resuelven mi problema, pero la verdad no supe cómo aplicarlo a mi caso.Solo necesito eso: obtener la medida del Label.text para redimensionar el Label.Size.Podrán ayudarme? De verdad se los agradezco.
Si quieres APRENDER solo tienes que QUERER...domingo, 6 de diciembre de 2009 6:05
Respuestas
-
Hola:
Si sólo vas a mostrar en el control Label la fecha del sistema, no creo que sea necesario que apliques la técnica que expuse en el enlace que has indicado; eso sería para mostrar GRANDES CADENAS de caracteres en el control Label, pero la cadena que representa la fecha del sistema, no veo yo que sea una GRAN CADENA. :-)
Lo único que tienes que procurar es que la propiedad AutoSize del control Label se encuentra establecida en True:
' Indicamos que el control se redimensione automáticamente
Label1.AutoSize = True' Establecemos el color de fondo
Label1.BackColor = Color.AliceBlue' Indicamos un tamaño de fuente más grande.
Label1.Font = New Font(Label1.Font.FontFamily, 28.0F)' Mostramos la fecha del sistema
Label1.Text = DateTime.Now.ToShortDateString
Observa que si le aplicamos un tamaño de fuente más grande, el control se redimensionará para ajustarse al nuevo tamaño especificado.
Un saludo
Enrique Martínez [MS MVP - VB]- Propuesto como respuesta Enrique M. MontejoModerator domingo, 6 de diciembre de 2009 12:02
- Marcado como respuesta Enrique M. MontejoModerator viernes, 1 de julio de 2011 17:57
domingo, 6 de diciembre de 2009 12:02Moderador -
"Jason Friedman" escribió:
> Lo que pasa es que tengo el Label alineado al lado derecho del formulario, ...
¡Hombre! Eso se dice desde un primer momento, porque hasta la fecha, que yo sepa, no soy adivino. :-)
Si tienes el control Label pegado al lado derecho del formulario, aparte de anclarlo a dicho lado, tienes que calcular la nueva posición que tendrá.
Private Sub Form1_Load( _
ByVal sender As Object, _
ByVal e As EventArgs) Handles MyBase.Load' Anclamos el control Label al lado derecho del formulario.
Label1.Anchor = AnchorStyles.Right' Indicamos que el control se redimensione automáticamente
Label1.AutoSize = True' Establecemos el color de fondo
Label1.BackColor = Color.AliceBlue' Indicamos un tamaño de fuente más grande.
Label1.Font = New Font(Label1.Font.FontFamily, 28.0F)' Mostramos la fecha del sistema
Label1.Text = DateTime.Now.ToShortDateString' Añadimos el controlador para el evento Paint del control Label.
AddHandler Label1.Paint, AddressOf LabelOnPaintEnd Sub
Private Sub LabelOnPaint( _
ByVal sender As Object, _
ByVal e As PaintEventArgs)' Referenciamos el objeto Label
'
Dim lbl As Label = DirectCast(sender, Label)' Establecemos la nueva posición del control Label.
'
lbl.Location = New Point(Me.ClientSize.Width - lbl.Width, lbl.Height)End Sub
> Además, de verdad me interesa aprender a medir una cadena de texto pues me
> sería muy útil al aplicar efectos estéticos. Si pudieras mostrarme cómo hacerlo
> de verdad te lo agradecería.
Pues en el enlace que indicastes en tu primer mensaje, ahí lo explico con todo detalle. En lugar de utilizar un objeto RadioButton, sustituye las referencias por un objeto Label.
La clave para medir cadenas está en la propiedad MeasureString del objeto Graphics.
Recuerda marcar la respuesta o respuestas como satisfactorias, si te han servido para resolver el problema planteado. ¿OK?
Enrique Martínez [MS MVP - VB]- Propuesto como respuesta Enrique M. MontejoModerator domingo, 6 de diciembre de 2009 18:55
- Marcado como respuesta Enrique M. MontejoModerator viernes, 1 de julio de 2011 17:57
domingo, 6 de diciembre de 2009 18:52Moderador -
¡Pero, vamos a ver! ¿Tu problema no es posicionar el control Label en el lado derecho del formulario? Si éste es el problema que estás teniendo, creo que con mi anterior respuesta el asunto debería estar resuelto. Desde luego, no se me ocurre otra cosa que puedas hacer.
> no supe cómo llamar al evento que calcula la medida del texto.
Si te fijas bien en el ejemplo, tienes que utilizar el evento Paint del control Label. ¿Que no deseas añadir el controlador mediante la instrucción AddHandler? ¡Bien! Entonces tienes que declarar el siguiente evento:
Private Sub Label1_Paint( _
ByVal sender As Object, _
ByVal e As PaintEventArgs) Handles Label1.Paint' Referenciamos el objeto Label
'
Dim lbl As Label = DirectCast(sender, Label)' Establecemos la nueva posición del control Label.
'
lbl.Location = New Point(Me.ClientSize.Width - lbl.Width, lbl.Height)End Sub
Enrique Martínez [MS MVP - VB]- Marcado como respuesta Jeison Friedman lunes, 7 de diciembre de 2009 16:18
lunes, 7 de diciembre de 2009 7:17Moderador -
"Jason Friedman" preguntó:
> lo que no comprendí fue cómo desencadeno el evento Pain del control.
Tú no tienes que desencadenar ningún evento, ni el evento Paint ni cualquier otro. Los eventos se desencadenan solos, cuando sucede algo, en el caso del evento Paint, cuando se tiene que dibujar de nuevo el control Label, PictureBox, TextBox, Form, etc.
Tú te tienes que limitar a instalar el controlador para el evento Paint del control Label, utilizando cualquiera de las dos maneras que te he indicado, y escribir el código que deseas que se ejecute cuando se desencadene el evento Paint.
Cuando el control Label se tenga que dibujar, automáticamente se desencadenará el evento Paint y, por tanto, se ejeuctará el código existente en dicho evento.
En cuando a la medida de las cadenas, ya te he dicho anteriormente que revises el enlace que indicastes en tu primer mensaje, donde creo explicarlo adecuadamente.
Para medir cadenas, tienes que utilizar la propiedad MeasureString del objeto Graphics. El objeto Graphcis lo puedes obtener del parámetro PaintEventArgs del evento Paint del control que deseas utilizar.
Por ejemplo, si deseas medir una cadena que se va a mostrar en el mismo formulario, en el evento Paint del formulario obtendrías el objeto Graphics correspondiente al formulario. Si es la cadena de un objeto Label, en el evento Paint del control Label obtendrías el objeto Graphics. ¿Comprendes?
Enrique Martínez [MS MVP - VB]- Marcado como respuesta Enrique M. MontejoModerator viernes, 1 de julio de 2011 17:58
lunes, 7 de diciembre de 2009 16:34Moderador -
"Jason Friedman" preguntó:
> Por eso me interesa saber en qué momento tengo disponible ese valor para darle uso.
El evento Paint se desencadena CADA VEZ QUE SE TENGA QUE DIBUJAR EL CONTROL, por ejemplo, cuando se muestra el formulario por primera vez.
Como parece ser que ya no te interesa la posición del control Label (la que decías que estaba al lado derecho del formulario), aquí tienes el ejemplo del famoso enlace para ser utilizado con un control Label:
Public Class Form1Private Sub Form1_Load( _
ByVal sender As Object, _
ByVal e As EventArgs) Handles MyBase.Load' Indicamos que el control se redimensione automáticamente
Label1.AutoSize = True' Establecemos el color de fondo
Label1.BackColor = Color.AliceBlue' Indicamos un tamaño de fuente más grande.
Label1.Font = New Font(Label1.Font.FontFamily, 28.0F)' Establecemos la propiedad Text del control.
Label1.Text = DateTime.Now.ToShortDateString' Añadimos el controlador para el evento Paint del control Label.
'
AddHandler Label1.Paint, AddressOf LabelOnPaintEnd Sub
Private Sub LabelOnPaint( _
ByVal sender As Object, _
ByVal e As PaintEventArgs)' Referenciamos el objeto Label
'
Dim lbl As Label = DirectCast(sender, Label)' Indicamos el tamaño máximo de diseño
'
Dim layoutSize As New SizeF(CSng(lbl.Width), 200.0F)' Establecemos el formato de la cadena.
'
Dim sf As New StringFormat(StringFormatFlags.DirectionVertical)' Medida del texto del control Label.
'
Dim linesFilled As Integer
Dim szf As SizeF = e.Graphics.MeasureString( _
lbl.Text, lbl.Font, layoutSize, sf, lbl.Text.Length, linesFilled)' La nueva altura del control Label será el producto
' de multiplicar las líneas rellenas por el interlineado
' del objeto Font del control.
'
lbl.Size = New Size(lbl.Width, CInt(linesFilled * lbl.Font.GetHeight))End Sub
End Class
¿Observas en el evento Paint la variable llamada szf del tipo SizeF? Ahí tienes la medida de la cadena. ¿Que la quieres tener disponible en otras partes de tu formulario? En lugar de declarar la variable privada al evento Paint, declárala a nivel del propio formulario:
Private szf As SizeF
Y en el evento Paint, se quedaría así:
szf = e.Graphics.MeasureString( _
lbl.Text, lbl.Font, layoutSize, sf, lbl.Text.Length, linesFilled)
Estos son temas básicos de la programación con Visual Basic o con cualquier otro lenguaje de programación: el alcance o la visibilidad que tienen las variables declaradas. :-)
Ya puestos, digamos que tampoco es sumamente necesario utilizar el evento Paint para éstos propósitos, puesto que puedes crear un objeto Graphics llamando al método CreateGraphics del control Label, por ejemplo, dentro del evento Click de un control Button, tal y como muestra el siguiente ejemplo:
Private Sub Button1_Click( _
ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Button1.Click' Referenciamos el objeto Label
'
Dim lbl As Label = Label1' Creamos el objeto Graphics.
'
Dim grfx As Graphics = lbl.CreateGraphics' Indicamos el tamaño máximo de diseño
'
Dim layoutSize As New SizeF(CSng(lbl.Width), 200.0F)' Establecemos el formato de la cadena.
'
Dim sf As New StringFormat(StringFormatFlags.DirectionVertical)' Medida del texto del control Label.
'
Dim linesFilled As Integer
Dim szf As SizeF = grfx.MeasureString( _
lbl.Text, lbl.Font, layoutSize, sf, lbl.Text.Length, linesFilled)' La nueva altura del control Label será el producto
' de multiplicar las líneas rellenas por el interlineado
' del objeto Font del control.
'
lbl.Size = New Size(lbl.Width, CInt(linesFilled * lbl.Font.GetHeight))' Destruimos el objeto Graphics
'
grfx.Dispose()End Sub
Fíjate que en éste último supuesto, hay que destruir explícitamente el objeto Graphics. Por supuesto, no se te ocurra destruir el objeto Graphics del evento Paint, es decir, en éste evento, no ejecutes
e.Graphics.Dispose()
porque obtendrás una excepción tan grande como un camión.
En fín, vamos a ver si ya puedes obtener la medida de la cadena del control Label. :-)
Enrique Martínez [MS MVP - VB]- Propuesto como respuesta Enrique M. MontejoModerator lunes, 7 de diciembre de 2009 17:48
- Marcado como respuesta Enrique M. MontejoModerator viernes, 1 de julio de 2011 17:58
lunes, 7 de diciembre de 2009 17:46Moderador
Todas las respuestas
-
Hola:
Si sólo vas a mostrar en el control Label la fecha del sistema, no creo que sea necesario que apliques la técnica que expuse en el enlace que has indicado; eso sería para mostrar GRANDES CADENAS de caracteres en el control Label, pero la cadena que representa la fecha del sistema, no veo yo que sea una GRAN CADENA. :-)
Lo único que tienes que procurar es que la propiedad AutoSize del control Label se encuentra establecida en True:
' Indicamos que el control se redimensione automáticamente
Label1.AutoSize = True' Establecemos el color de fondo
Label1.BackColor = Color.AliceBlue' Indicamos un tamaño de fuente más grande.
Label1.Font = New Font(Label1.Font.FontFamily, 28.0F)' Mostramos la fecha del sistema
Label1.Text = DateTime.Now.ToShortDateString
Observa que si le aplicamos un tamaño de fuente más grande, el control se redimensionará para ajustarse al nuevo tamaño especificado.
Un saludo
Enrique Martínez [MS MVP - VB]- Propuesto como respuesta Enrique M. MontejoModerator domingo, 6 de diciembre de 2009 12:02
- Marcado como respuesta Enrique M. MontejoModerator viernes, 1 de julio de 2011 17:57
domingo, 6 de diciembre de 2009 12:02Moderador -
Gracias por responder, pero me temo que no me sirve lo que me sugieres. Lo que pasa es que tengo el Label alineado al lado derecho del formulario, y con la propiedad Autosize se expande hacia fuera, o sea que pasa los límites del formulario y no se ve la mitad del texto. Si estuviera del lado izquierdo no habría problema, pero no es el caso.Además, de verdad me interesa aprender a medir una cadena de texto pues me sería muy útil al aplicar efectos estéticos. Si pudieras mostrarme cómo hacerlo de verdad te lo agradecería.
Si quieres APRENDER solo tienes que QUERER...domingo, 6 de diciembre de 2009 18:29 -
"Jason Friedman" escribió:
> Lo que pasa es que tengo el Label alineado al lado derecho del formulario, ...
¡Hombre! Eso se dice desde un primer momento, porque hasta la fecha, que yo sepa, no soy adivino. :-)
Si tienes el control Label pegado al lado derecho del formulario, aparte de anclarlo a dicho lado, tienes que calcular la nueva posición que tendrá.
Private Sub Form1_Load( _
ByVal sender As Object, _
ByVal e As EventArgs) Handles MyBase.Load' Anclamos el control Label al lado derecho del formulario.
Label1.Anchor = AnchorStyles.Right' Indicamos que el control se redimensione automáticamente
Label1.AutoSize = True' Establecemos el color de fondo
Label1.BackColor = Color.AliceBlue' Indicamos un tamaño de fuente más grande.
Label1.Font = New Font(Label1.Font.FontFamily, 28.0F)' Mostramos la fecha del sistema
Label1.Text = DateTime.Now.ToShortDateString' Añadimos el controlador para el evento Paint del control Label.
AddHandler Label1.Paint, AddressOf LabelOnPaintEnd Sub
Private Sub LabelOnPaint( _
ByVal sender As Object, _
ByVal e As PaintEventArgs)' Referenciamos el objeto Label
'
Dim lbl As Label = DirectCast(sender, Label)' Establecemos la nueva posición del control Label.
'
lbl.Location = New Point(Me.ClientSize.Width - lbl.Width, lbl.Height)End Sub
> Además, de verdad me interesa aprender a medir una cadena de texto pues me
> sería muy útil al aplicar efectos estéticos. Si pudieras mostrarme cómo hacerlo
> de verdad te lo agradecería.
Pues en el enlace que indicastes en tu primer mensaje, ahí lo explico con todo detalle. En lugar de utilizar un objeto RadioButton, sustituye las referencias por un objeto Label.
La clave para medir cadenas está en la propiedad MeasureString del objeto Graphics.
Recuerda marcar la respuesta o respuestas como satisfactorias, si te han servido para resolver el problema planteado. ¿OK?
Enrique Martínez [MS MVP - VB]- Propuesto como respuesta Enrique M. MontejoModerator domingo, 6 de diciembre de 2009 18:55
- Marcado como respuesta Enrique M. MontejoModerator viernes, 1 de julio de 2011 17:57
domingo, 6 de diciembre de 2009 18:52Moderador -
Eso fue lo que hice cuando revisé tu respuesta, pero la verdad no supe cómo llamar al evento que calcula la medida del texto. Es ahí donde estoy parado.
Si quieres APRENDER solo tienes que QUERER...domingo, 6 de diciembre de 2009 21:31 -
¡Pero, vamos a ver! ¿Tu problema no es posicionar el control Label en el lado derecho del formulario? Si éste es el problema que estás teniendo, creo que con mi anterior respuesta el asunto debería estar resuelto. Desde luego, no se me ocurre otra cosa que puedas hacer.
> no supe cómo llamar al evento que calcula la medida del texto.
Si te fijas bien en el ejemplo, tienes que utilizar el evento Paint del control Label. ¿Que no deseas añadir el controlador mediante la instrucción AddHandler? ¡Bien! Entonces tienes que declarar el siguiente evento:
Private Sub Label1_Paint( _
ByVal sender As Object, _
ByVal e As PaintEventArgs) Handles Label1.Paint' Referenciamos el objeto Label
'
Dim lbl As Label = DirectCast(sender, Label)' Establecemos la nueva posición del control Label.
'
lbl.Location = New Point(Me.ClientSize.Width - lbl.Width, lbl.Height)End Sub
Enrique Martínez [MS MVP - VB]- Marcado como respuesta Jeison Friedman lunes, 7 de diciembre de 2009 16:18
lunes, 7 de diciembre de 2009 7:17Moderador -
pues puedes medirlo asi como sofjaen o lo aces mas metodico cosa q casi no sugiero por lo extenso del codigo pero es otra alternativa
mides el ancho del label final con esto:
dim ancho_label as integer ancho_label = Label1.Size.Width ahora declara el limite hasta donde llegara tu label dle lado izquierdo dim limite as integer = 200 ahora si viene el posicionamiento de manera horizontal por lo consecuente modificaremos al eje "X" y al eje "Y" lodejaremos intacto Label1.Location = New Point(limite-ancho_label, Label1.Location.Y) y listo sin importar cuanto mida su ancho no pasara de limite si te sirvio recueda marcar como respuesta jejeje saludos y listo sin importar cuanto mida su ancho no pasara de limite si te sirvio recueda marcar como respuesta jejeje saludos
lunes, 7 de diciembre de 2009 7:21 -
"J. Miguel" escribió:
> dim limite as integer = 200
>
> ahora si viene el posicionamiento de manera horizontal por lo consecuente
> modificaremos al eje "X" y al eje "Y" lodejaremos intacto
>
> Label1.Location = New Point(ancho_label-limite, Label1.Location.Y)
>
> y listo sin importar cuanto mida su ancho no pasara de limite
Como el valor de la variable ancho_label sea inferior al valor de la variable limite (200), yo creo que no va a poder ni tan siquiera visualizar el control Label, más aún sabiendo que Jason tiene posicionado el control Label casi en el borde derecho del formulario. :-)
Un saludo
Enrique Martínez [MS MVP - VB]lunes, 7 de diciembre de 2009 7:59Moderador -
jejejeje el limite =200, los 200 fue solo una cantidad de ejemplo si el ancho del formulario es de 800 entonces seria 800 o 780 o cualkiera q el desee donde poner el label, jejeje aunque tu eres superior en conocimientos y me has ayudado demasiado fue una sugerencia para darle una opcion mas jejeje, como dije antes fue una sugerencia a la cual yo optaria a la tuya por se mas corta, saludos.
por cierto softjaen tengo una duda jejejeje la posteare enseguida jejeje
y tienes razon seria limite-ancho_label ya lo e editado el postlunes, 7 de diciembre de 2009 8:34 -
De verdad que haciéndolo así puedo obtener el ancho del texto; le establezco la propiedad Autosize = True y luego mido el ancho del Label. A partir de ahí es fácil fijarlo donde quiero.
No obstante, debo decir que lo que de verdad quería saber era cómo medir una cadena de texto, sea por la razón que sea e independientemente de qué control sea. De hecho, fíjense que esa es la pregunta que formulé en este post. Sé que SoftJaén me dijo algo al respecto, pero lo que no comprendí fue cómo desencadeno el evento Pain del control.
Gracias de todos modos por sus respuestas.
Si quieres APRENDER solo tienes que QUERER...lunes, 7 de diciembre de 2009 16:17 -
"Jason Friedman" preguntó:
> lo que no comprendí fue cómo desencadeno el evento Pain del control.
Tú no tienes que desencadenar ningún evento, ni el evento Paint ni cualquier otro. Los eventos se desencadenan solos, cuando sucede algo, en el caso del evento Paint, cuando se tiene que dibujar de nuevo el control Label, PictureBox, TextBox, Form, etc.
Tú te tienes que limitar a instalar el controlador para el evento Paint del control Label, utilizando cualquiera de las dos maneras que te he indicado, y escribir el código que deseas que se ejecute cuando se desencadene el evento Paint.
Cuando el control Label se tenga que dibujar, automáticamente se desencadenará el evento Paint y, por tanto, se ejeuctará el código existente en dicho evento.
En cuando a la medida de las cadenas, ya te he dicho anteriormente que revises el enlace que indicastes en tu primer mensaje, donde creo explicarlo adecuadamente.
Para medir cadenas, tienes que utilizar la propiedad MeasureString del objeto Graphics. El objeto Graphcis lo puedes obtener del parámetro PaintEventArgs del evento Paint del control que deseas utilizar.
Por ejemplo, si deseas medir una cadena que se va a mostrar en el mismo formulario, en el evento Paint del formulario obtendrías el objeto Graphics correspondiente al formulario. Si es la cadena de un objeto Label, en el evento Paint del control Label obtendrías el objeto Graphics. ¿Comprendes?
Enrique Martínez [MS MVP - VB]- Marcado como respuesta Enrique M. MontejoModerator viernes, 1 de julio de 2011 17:58
lunes, 7 de diciembre de 2009 16:34Moderador -
Eso lo entendí, pero en qué momento obtengo la medida de la cadena? O sea, cuándo se desencadena el evento? Cuando el formulario se carga (Form_Load)? Porque entiendo que la variable que obtendrá ese valor está en el evento Paint. Por eso me interesa saber en qué momento tengo disponible ese valor para darle uso.
Si quieres APRENDER solo tienes que QUERER...lunes, 7 de diciembre de 2009 17:15 -
"Jason Friedman" preguntó:
> Por eso me interesa saber en qué momento tengo disponible ese valor para darle uso.
El evento Paint se desencadena CADA VEZ QUE SE TENGA QUE DIBUJAR EL CONTROL, por ejemplo, cuando se muestra el formulario por primera vez.
Como parece ser que ya no te interesa la posición del control Label (la que decías que estaba al lado derecho del formulario), aquí tienes el ejemplo del famoso enlace para ser utilizado con un control Label:
Public Class Form1Private Sub Form1_Load( _
ByVal sender As Object, _
ByVal e As EventArgs) Handles MyBase.Load' Indicamos que el control se redimensione automáticamente
Label1.AutoSize = True' Establecemos el color de fondo
Label1.BackColor = Color.AliceBlue' Indicamos un tamaño de fuente más grande.
Label1.Font = New Font(Label1.Font.FontFamily, 28.0F)' Establecemos la propiedad Text del control.
Label1.Text = DateTime.Now.ToShortDateString' Añadimos el controlador para el evento Paint del control Label.
'
AddHandler Label1.Paint, AddressOf LabelOnPaintEnd Sub
Private Sub LabelOnPaint( _
ByVal sender As Object, _
ByVal e As PaintEventArgs)' Referenciamos el objeto Label
'
Dim lbl As Label = DirectCast(sender, Label)' Indicamos el tamaño máximo de diseño
'
Dim layoutSize As New SizeF(CSng(lbl.Width), 200.0F)' Establecemos el formato de la cadena.
'
Dim sf As New StringFormat(StringFormatFlags.DirectionVertical)' Medida del texto del control Label.
'
Dim linesFilled As Integer
Dim szf As SizeF = e.Graphics.MeasureString( _
lbl.Text, lbl.Font, layoutSize, sf, lbl.Text.Length, linesFilled)' La nueva altura del control Label será el producto
' de multiplicar las líneas rellenas por el interlineado
' del objeto Font del control.
'
lbl.Size = New Size(lbl.Width, CInt(linesFilled * lbl.Font.GetHeight))End Sub
End Class
¿Observas en el evento Paint la variable llamada szf del tipo SizeF? Ahí tienes la medida de la cadena. ¿Que la quieres tener disponible en otras partes de tu formulario? En lugar de declarar la variable privada al evento Paint, declárala a nivel del propio formulario:
Private szf As SizeF
Y en el evento Paint, se quedaría así:
szf = e.Graphics.MeasureString( _
lbl.Text, lbl.Font, layoutSize, sf, lbl.Text.Length, linesFilled)
Estos son temas básicos de la programación con Visual Basic o con cualquier otro lenguaje de programación: el alcance o la visibilidad que tienen las variables declaradas. :-)
Ya puestos, digamos que tampoco es sumamente necesario utilizar el evento Paint para éstos propósitos, puesto que puedes crear un objeto Graphics llamando al método CreateGraphics del control Label, por ejemplo, dentro del evento Click de un control Button, tal y como muestra el siguiente ejemplo:
Private Sub Button1_Click( _
ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Button1.Click' Referenciamos el objeto Label
'
Dim lbl As Label = Label1' Creamos el objeto Graphics.
'
Dim grfx As Graphics = lbl.CreateGraphics' Indicamos el tamaño máximo de diseño
'
Dim layoutSize As New SizeF(CSng(lbl.Width), 200.0F)' Establecemos el formato de la cadena.
'
Dim sf As New StringFormat(StringFormatFlags.DirectionVertical)' Medida del texto del control Label.
'
Dim linesFilled As Integer
Dim szf As SizeF = grfx.MeasureString( _
lbl.Text, lbl.Font, layoutSize, sf, lbl.Text.Length, linesFilled)' La nueva altura del control Label será el producto
' de multiplicar las líneas rellenas por el interlineado
' del objeto Font del control.
'
lbl.Size = New Size(lbl.Width, CInt(linesFilled * lbl.Font.GetHeight))' Destruimos el objeto Graphics
'
grfx.Dispose()End Sub
Fíjate que en éste último supuesto, hay que destruir explícitamente el objeto Graphics. Por supuesto, no se te ocurra destruir el objeto Graphics del evento Paint, es decir, en éste evento, no ejecutes
e.Graphics.Dispose()
porque obtendrás una excepción tan grande como un camión.
En fín, vamos a ver si ya puedes obtener la medida de la cadena del control Label. :-)
Enrique Martínez [MS MVP - VB]- Propuesto como respuesta Enrique M. MontejoModerator lunes, 7 de diciembre de 2009 17:48
- Marcado como respuesta Enrique M. MontejoModerator viernes, 1 de julio de 2011 17:58
lunes, 7 de diciembre de 2009 17:46Moderador -
Jeje! Ok. Gracias por seguir respondiendo! Ya mismo lo voy a probar.
Si quieres APRENDER solo tienes que QUERER...lunes, 7 de diciembre de 2009 19:11 -
Pues si te es útil ésta última respuesta, no olvides marcarla también como satisfactoria. ¿OK?
Enrique Martínez [MS MVP - VB]lunes, 7 de diciembre de 2009 19:17Moderador