Ajuste de controles a pantalla

Estoy haciendo una aplicación pero no logro hacer que al cambiar la resolución de pantalla en una o varias pc que tienen diferente resolución estos controles se ajusten a la pantalla por ejemplo a una de 800x600 que es la mínima y yo estoy haciendo mi aplicación en una resolución de 1280x800 y no se logran ajustar a otra mas pequeña, he utilizado la propiedad anchor en vb 2010 pero me da problemas, algún consejo o ayuda que me puedas brindar seria de mucha ayuda y te agradecería bastante por tu tiempo y molestia.

4 Respuestas

Respuesta
5

Puedes utilizar la siguiente clase en VB.NET para redimensionar tus formularios

Public Class clsResizeForm
    Dim f_HeightRatio As Single = New Single
    Dim f_WidthRatio As Single = New Single
    Public Sub ResizeForm(ObjForm As Form, DesignerWidth As Integer, DesignerHeight As Integer)
        Dim i_StandardHeight As Integer = DesignerHeight
        Dim i_StandardWidth As Integer = DesignerWidth
        Dim i_PresentHeight As Integer = Screen.PrimaryScreen.Bounds.Height
        Dim i_PresentWidth As Integer = Screen.PrimaryScreen.Bounds.Width
        f_HeightRatio = (CSng(i_PresentHeight) / CSng(i_StandardHeight))
        f_WidthRatio = (CSng(i_PresentWidth) / CSng(i_StandardWidth))
        ObjForm.AutoScaleMode = AutoScaleMode.None
        ObjForm.Scale(New SizeF(f_WidthRatio, f_HeightRatio))
        For Each c As Control In ObjForm.Controls
            If c.HasChildren Then
                ResizeControlStore(c)
            Else
                c.Font = New Font(c.Font.FontFamily, c.Font.Size * f_HeightRatio, c.Font.Style, c.Font.Unit, (CByte(0)))
            End If
        Next
        ObjForm.Font = New Font(ObjForm.Font.FontFamily, ObjForm.Font.Size * f_HeightRatio, ObjForm.Font.Style, ObjForm.Font.Unit, (CByte(0)))
    End Sub
    Private Sub ResizeControlStore(objCtl As Control)
        If objCtl.HasChildren Then
            For Each cChildren As Control In objCtl.Controls
                If cChildren.HasChildren Then
                    ResizeControlStore(cChildren)
                Else
                    cChildren.Font = New Font(cChildren.Font.FontFamily, cChildren.Font.Size * f_HeightRatio, cChildren.Font.Style, cChildren.Font.Unit, (CByte(0)))
                End If
            Next
            objCtl.Font = New Font(objCtl.Font.FontFamily, objCtl.Font.Size * f_HeightRatio, objCtl.Font.Style, objCtl.Font.Unit, (CByte(0)))
        Else
            objCtl.Font = New Font(objCtl.Font.FontFamily, objCtl.Font.Size * f_HeightRatio, objCtl.Font.Style, objCtl.Font.Unit, (CByte(0)))
        End If
    End Sub
End Class

En el evento Load de cada formulario tendrías algo mas o menos como el siguiente código donde tienes que poner la resolución original de los formularios. La clase se encargara de detectar la resolución de la pantalla en el que se esta ejecutando y calcular y ajustar las nuevas dimensiones en base a la resolución original.

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        Dim classResize As New clsResizeForm
        classResize.ResizeForm(Me, 1280, 800)
    End Sub
End Class

la verdad no entendí el código que pusiste, supongo que redimensiona el formulario pero solo eso, y pues para eso es mejor la propiedad anchor porque hace lo que estoy buscando pero gracias por tu tiempo en contestar.

Mira también encontré este código pero la verdad no se si funciona o no porque me sigue quedando de la misma forma y no lo puedo ajustar bien:

Public Class Form1
  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    Dim AnchoPantallaInicial As Integer = 1920
    Dim AltoPantallaInicial As Integer = 1080
    Dim ResolucionDestino As Size
    ResolucionDestino = System.Windows.Forms.SystemInformation.PrimaryMonitorSize
    Dim AnchoPantallaDestino As Integer = ResolucionDestino.Width
    Dim AltoPantallaDestino As Integer = ResolucionDestino.Height
    Dim AnchoFormularioInicial As Double = 600
    Dim AltoformularioInicial As Double = 600
    Dim AnchoFormularioDestino = CDbl((AnchoFormularioInicial / AnchoPantallaInicial) * AnchoPantallaDestino)
    Dim AltoFormularioDestino = CDbl((AltoformularioInicial / AltoPantallaInicial) * AltoPantallaDestino)
    Me.Width = AnchoFormularioDestino
    Me.Height = AltoFormularioDestino
  End Sub
End Class

Primero dices "supongo que redimensiona el formulario pero solo eso, y pues para eso es mejor la propiedad anchor", después muestras un código que hace justamente lo que dices que no te sirve es decir que solo redimensiona el formulario. También dices que el código que muestras no te funciona, pero no te va a funcionar si no cambias la resolución de tu pantalla. Sobre la propiedad anchor solo te sirve para "anclar" los controles a una distancia a los bordes del formulario ya sea a la izquierda, derecha, arriba y/o abajo de forma que cuando redimensiones el formulario, los controles mantengan su distancia a los bordes del formulario, por ejemplo si "anclas" el control a la derecha, cuando redimensiones el formulario, el control cambiara su ancho (width) para conservar la distancia que tiene hacia el borde derecho del formulario; el detalle es que los textos de los controles no se verán completos en resoluciones inferiores.

El código que te puse, hace lo siguiente.

1) Detecta la resolución Destino

2) Calcula las dimensiones del formulario(width y height) de forma que se adapte a la nueva resolución.

3) Escala el formulario a las nuevas dimensiones, de esta forma todos los controles dentro del formulario también cambian su tamaño.

4) Ajusta el tamaño de letra de los controles(ya que cambiaron de tamaño) para que se ajusten a los nuevos tamaños de los controles.

En conclusión veo que no probaste el código que te puse, pues si hace lo que pides.

Para usar el código que te puse a tu proyecto solo debes agregar la clase (el primer código) y de esa forma puedes usarla para todos los formulario del proyecto que quieras con el código del evento load (segundo código).

Para probar si funciona tienes ir cambiando la resolución de tu pantalla a mayores y menores resoluciones e ir ejecutando el proyecto en cada resolución y ver si te ajusta el formulario a la resolución. Tal vez no se note mucho pero puedes hacer la prueba con un formulario que ocupe la mitad de tu pantalla en tu resolución actual y después cambiar la resolución y volver a ejecutar el proyecto y si el formulario sigue ocupando la mitad de tu pantalla entonces si funciona, pero si el formulario ocupa mas de la mitad de tu pantalla (si la resolución es menor), o menos de tu pantalla (si la resolución es mayor) entonces no esta funcionando.

Respuesta
1

Excelente código, funciona de maravilla. Todo lo reduce o adapta espectacularmente, funciona de maravilla, tenia años queriendo ver un código así..

Respuesta

Si funciona tu código, con el cual respondías, y lo combine con el segundo código, utilizando el width y el height de System. Windows. Forms. SystemInformation. PrimaryMonitorSize en vez de poner la resolución fija

Respuesta

Alberto Jimenez Cabrera, la verdad es que tu código es muy bueno. Y sobretodo muy limpio y se ajusta a cualquier otro código. Te admiro de verdad por ese conocimiento tan amplio, y más que nada por tomarte tu tiempo para compartirlo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas