Forms Vs Resolucion de pantalla

17/08/2006 - 22:29 por Carlos Maggiotti | Informe spam
Buenas gente...

La vieja y ya mas que conocida pregnuta...
Como hago en Visual Studio 2005 para que mis WinForms se autoajusten a la
resolucion de la pantalla del usuario en forma automatica..?

Saludos y gracias de antemano...
CarlosMag

Preguntas similare

Leer las respuestas

#1 Carlos Gómez
18/08/2006 - 12:37 | Informe spam
Para adaptar un formulario a la resolución de la pantalla hay que
hacer 2 cosas:
Obtener la nueva resolución
Adaptar los controles a la nueva resolución.

Para lo primero mediante la clase my, puedes encontrar la resolución

Para lo segundo es más complicado:
Deberás cambiar los tamaños de las fuentes de los controles y a su
vez el tamaño del control
Despues deberas cambiar la localización del control
Por ejemplo, si tienes una resolución inicial de 1600 x 1200, y la
nueva resolución es de 800 x 600, para que un textbox tendrías que
hacer:

TextBox1.Location.X = TextBox1.Location.X \ 2
TextBox1.Location.Y = TextBox1.Location.Y \ 2
Dim Tamaño as Size = TextBox1.Size
Tamaño.Height = Tamaño.Height \ 4
Tamaño.Width = Tamaño.Width \ 4
TextBox1.Size = Tamaño

y para la fuente, si todos los controles usan la fuente heredada del
formulario, supongo que cambiado la fuente del formulario, se
producirá el cambio en cascada

Si esto lo tienes que hacer en muchos formularios, que a su vez
contienen contenedores con más controles (GroupBox, ...) te recomiendo
que hagas uso del patrón Composite (
http://www.dofactory.com/Patterns/P...osite.aspx )
, que te permitirá realizar estos cambios de forma cómoda y segura
Respuesta Responder a este mensaje
#2 Carlos Gómez
23/08/2006 - 01:23 | Informe spam
Tampoco es necesario buscar un componente externo,
más o menos sería asi:

' Variables Globales
Dim ResolucionPrevista as Size=New Size(1024,768) 'por ejemplo
Dim ResolucionActual as New Size(My.Computer.Screen.Bounds.Width,
My.Computer.Screen.Bounds.Height)

Dim alto As Double = CDbl(ResolucionPrevista.Height) /
CDbl(ResolucionActual.Height)
Dim ancho As Double = CDbl(ResolucionPrevista.Width) /
CDbl(ResolucionActual.Width)

' Load del formulario

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs)
Handles MyBase.Load
If ResolucionActual.Height <> ResolucionPredeterminada.Height _
Or ResolucionActual.Width <> ResolucionPredeterminada.Width Then
AdaptarResolucion(Me)
End If
End Sub

Private Sub AdaptarResolucion(ByRef Contenedor As Control)
Dim c As Control
Dim TamañoFuente As Single
Dim TamañoWidth As Double
Dim TamañoHeight As Double
Dim PosicionX As Double
Dim PosicionY As Double
For Each controlContenido In Contenedor.Controls
TamañoWidth = _controlContenido .Size.Width / ancho
TamañoHeight = _controlContenido .Size.Height / alto
PosicionX = _controlContenido .Location.X / ancho
PosicionY = _controlContenido .Location.Y / alto

If ancho > alto Then
TamañoFuente = CSng(_Control.Font.Size.ToString) / CSng(ancho)
Else
TamañoFuente = CSng(_Control.Font.Size.ToString) / CSng(alto)
End If

controlContenido.Size = New Size(CInt(TamañoWidth),
CInt(TamañoHeight))
controlContenido.Location = New Point(CInt(PosicionX),
CInt(PosicionY))
controlContenido.Font =New Font(controlContenido.Font.FontFamily,
TamañoFuente)

If controlContenido.HasChildren Then 'Se trata de un groupbox (por
ejemplo)
AdaptarResolucion(controlContenido)
End If
Next
End Sub


Claro que este código es mejor meterlo en una clase y así todos los
formulario lo podrán llamar, sino, tendrías que escribirlo en todos
los formularios

Si te sirve, por favor, dimelo
Respuesta Responder a este mensaje
#3 Carlos Maggiotti
25/08/2006 - 20:03 | Informe spam
No esta nada mal...

Pero la intención seria resolver esto sin tener que agregar codigo a cada
form.
Si bien la idea de llamar a este codigo via Singleton es muy buena, sigo
dependiendo de tener que agregarle codigo a cada form que agregue al
proyecto...

Estos controles (como el SizeLib) prometen ajustar los forms en forma
automatica con cero codigo.
Existe la solucion .NET propia que resuelva esto de esa misma manera?

Saludos

CarlosMag

"Carlos Gómez" escribió en el mensaje
news:
Tampoco es necesario buscar un componente externo,
más o menos sería asi:

' Variables Globales
Dim ResolucionPrevista as Size=New Size(1024,768) 'por ejemplo
Dim ResolucionActual as New Size(My.Computer.Screen.Bounds.Width,
My.Computer.Screen.Bounds.Height)

Dim alto As Double = CDbl(ResolucionPrevista.Height) /
CDbl(ResolucionActual.Height)
Dim ancho As Double = CDbl(ResolucionPrevista.Width) /
CDbl(ResolucionActual.Width)

' Load del formulario

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs)
Handles MyBase.Load
If ResolucionActual.Height <> ResolucionPredeterminada.Height _
Or ResolucionActual.Width <> ResolucionPredeterminada.Width Then
AdaptarResolucion(Me)
End If
End Sub

Private Sub AdaptarResolucion(ByRef Contenedor As Control)
Dim c As Control
Dim TamañoFuente As Single
Dim TamañoWidth As Double
Dim TamañoHeight As Double
Dim PosicionX As Double
Dim PosicionY As Double
For Each controlContenido In Contenedor.Controls
TamañoWidth = _controlContenido .Size.Width / ancho
TamañoHeight = _controlContenido .Size.Height / alto
PosicionX = _controlContenido .Location.X / ancho
PosicionY = _controlContenido .Location.Y / alto

If ancho > alto Then
TamañoFuente = CSng(_Control.Font.Size.ToString) / CSng(ancho)
Else
TamañoFuente = CSng(_Control.Font.Size.ToString) / CSng(alto)
End If

controlContenido.Size = New Size(CInt(TamañoWidth),
CInt(TamañoHeight))
controlContenido.Location = New Point(CInt(PosicionX),
CInt(PosicionY))
controlContenido.Font =New Font(controlContenido.Font.FontFamily,
TamañoFuente)

If controlContenido.HasChildren Then 'Se trata de un groupbox (por
ejemplo)
AdaptarResolucion(controlContenido)
End If
Next
End Sub


Claro que este código es mejor meterlo en una clase y así todos los
formulario lo podrán llamar, sino, tendrías que escribirlo en todos
los formularios

Si te sirve, por favor, dimelo
Respuesta Responder a este mensaje
#4 Carlos Maggiotti
25/08/2006 - 20:14 | Informe spam
Carlos...

Me puse a pensarlo un poco y resolvi hacer un control propio (con tu codigo)
que va a ir pegado en cada form.

Este control estara atento a la captura del evento VisibleChanged del Form
contenedor...
Te parece que esto podria andar?

Saludos y gracias por la mano...
CarlosMag

"Carlos Gómez" escribió en el mensaje
news:
Tampoco es necesario buscar un componente externo,
más o menos sería asi:

' Variables Globales
Dim ResolucionPrevista as Size=New Size(1024,768) 'por ejemplo
Dim ResolucionActual as New Size(My.Computer.Screen.Bounds.Width,
My.Computer.Screen.Bounds.Height)

Dim alto As Double = CDbl(ResolucionPrevista.Height) /
CDbl(ResolucionActual.Height)
Dim ancho As Double = CDbl(ResolucionPrevista.Width) /
CDbl(ResolucionActual.Width)

' Load del formulario

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs)
Handles MyBase.Load
If ResolucionActual.Height <> ResolucionPredeterminada.Height _
Or ResolucionActual.Width <> ResolucionPredeterminada.Width Then
AdaptarResolucion(Me)
End If
End Sub

Private Sub AdaptarResolucion(ByRef Contenedor As Control)
Dim c As Control
Dim TamañoFuente As Single
Dim TamañoWidth As Double
Dim TamañoHeight As Double
Dim PosicionX As Double
Dim PosicionY As Double
For Each controlContenido In Contenedor.Controls
TamañoWidth = _controlContenido .Size.Width / ancho
TamañoHeight = _controlContenido .Size.Height / alto
PosicionX = _controlContenido .Location.X / ancho
PosicionY = _controlContenido .Location.Y / alto

If ancho > alto Then
TamañoFuente = CSng(_Control.Font.Size.ToString) / CSng(ancho)
Else
TamañoFuente = CSng(_Control.Font.Size.ToString) / CSng(alto)
End If

controlContenido.Size = New Size(CInt(TamañoWidth),
CInt(TamañoHeight))
controlContenido.Location = New Point(CInt(PosicionX),
CInt(PosicionY))
controlContenido.Font =New Font(controlContenido.Font.FontFamily,
TamañoFuente)

If controlContenido.HasChildren Then 'Se trata de un groupbox (por
ejemplo)
AdaptarResolucion(controlContenido)
End If
Next
End Sub


Claro que este código es mejor meterlo en una clase y así todos los
formulario lo podrán llamar, sino, tendrías que escribirlo en todos
los formularios

Si te sirve, por favor, dimelo
Respuesta Responder a este mensaje
#5 Carlos Gómez
25/08/2006 - 22:23 | Informe spam
Carlos Maggiotti ha escrito:

Carlos...

Me puse a pensarlo un poco y resolvi hacer un control propio (con tu codigo)
que va a ir pegado en cada form.




????
¿Un control propio?

No entiendo lo que quieres decir.

Una posible solución es crear una clase tal que sí:

Public Class HerramientasFormularios
Private Alto as Double
Private Ancho as Double

Public Sub New(ByVal ResolucionPrevista As Integer, _
ByVal ResolucionActual As Integer)
alto = CDbl(ResolucionPrevista.Height) / CDbl(ResolucionActual.Height)
ancho = CDbl(ResolucionPrevista.Width) / CDbl(ResolucionActual.Width)
End Sub

Public Sub AdaptarResolucion(ByRef Contenedor As Control)
' El código que te pase
End Sub

End Class

y ahora en el evento Load de cada uno de los formularios:

If ResolucionActual.Height <> ResolucionPredeterminada.Height _
Or ResolucionActual.Width <> ResolucionPredeterminada.Width Then
dim p as new HerramientasFormulario(ResolucionPrevista,
ResolucionActual)
p.AdaptarResolucion(Me)
End If


Este control estara atento a la captura del evento VisibleChanged del Form
contenedor...
Te parece que esto podria andar?


No.
El evento VisibleChange se produce cuando cambia la propiedad Visible
del formulario, no cuando cambia la resolución de pantalla.
De todas formas, no es habitual que un usuario cambie cada 2 por 3 la
resolución. si la cambia con el programa funcionando, no tengo ni idea
de como detectar esto de forma automática, pero aun así, en el
momento de que cierre un formulario y abra otro ya si se cambiara la
apariencia.


Saludos y gracias por la mano...
CarlosMag

"Carlos Gómez" escribió en el mensaje
news:
Tampoco es necesario buscar un componente externo,
más o menos sería asi:

' Variables Globales
Dim ResolucionPrevista as Size=New Size(1024,768) 'por ejemplo
Dim ResolucionActual as New Size(My.Computer.Screen.Bounds.Width,
My.Computer.Screen.Bounds.Height)

Dim alto As Double = CDbl(ResolucionPrevista.Height) /
CDbl(ResolucionActual.Height)
Dim ancho As Double = CDbl(ResolucionPrevista.Width) /
CDbl(ResolucionActual.Width)

' Load del formulario

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs)
Handles MyBase.Load
If ResolucionActual.Height <> ResolucionPredeterminada.Height _
Or ResolucionActual.Width <> ResolucionPredeterminada.Width Then
AdaptarResolucion(Me)
End If
End Sub

Private Sub AdaptarResolucion(ByRef Contenedor As Control)
Dim c As Control
Dim TamañoFuente As Single
Dim TamañoWidth As Double
Dim TamañoHeight As Double
Dim PosicionX As Double
Dim PosicionY As Double
For Each controlContenido In Contenedor.Controls
TamañoWidth = _controlContenido .Size.Width / ancho
TamañoHeight = _controlContenido .Size.Height / alto
PosicionX = _controlContenido .Location.X / ancho
PosicionY = _controlContenido .Location.Y / alto

If ancho > alto Then
TamañoFuente = CSng(_Control.Font.Size.ToString) / CSng(ancho)
Else
TamañoFuente = CSng(_Control.Font.Size.ToString) / CSng(alto)
End If

controlContenido.Size = New Size(CInt(TamañoWidth),
CInt(TamañoHeight))
controlContenido.Location = New Point(CInt(PosicionX),
CInt(PosicionY))
controlContenido.Font =New Font(controlContenido.Font.FontFamily,
TamañoFuente)

If controlContenido.HasChildren Then 'Se trata de un groupbox (por
ejemplo)
AdaptarResolucion(controlContenido)
End If
Next
End Sub


Claro que este código es mejor meterlo en una clase y así todos los
formulario lo podrán llamar, sino, tendrías que escribirlo en todos
los formularios

Si te sirve, por favor, dimelo
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida