Visual Basic - Resolución automática en forms

Life is soft - evento anual de software empresarial
 
Vista:
Imágen de perfil de Julian C.

Resolución automática en forms

Publicado por Julian C. (14 intervenciones) el 11/08/2014 17:49:00
Buen día a todos, alguien me puede ayudar sobre el tema de resolución y ajuste automático de resolución de pantalla en VB .NET 2008?


El problema:
Se requiere hacer una aplicación que pueda funcionar con distintas resoluciones de pantalla a partir de 1024 X 768 y posteriores...


Algún código con el que pueda llevar a cabo esta operación?
Estaría muy agradecido si alguien hace un aporte puntual.
"Software es conocimiento y compartir conocimiento es construir la nueva sociedad"

Gracias!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Resolución automática en forms

Publicado por Pico (114 intervenciones) el 11/08/2014 21:56:11
Para saber la resolución de pantalla hay que usar el objeto Screen, y para cambiarla, la función ChangeDisplaySettings, tal y como pone ahí http://www.elguille.info/vb/API/resolucionpantalla.htm#especial2

Mal se construye una nueva sociedad si resulta que unos pocos tienen el conocimiento y la mayoría se dedica a copiar y pegar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Julian C.

Resolución automática en forms

Publicado por Julian C. (14 intervenciones) el 13/08/2014 17:39:08
Gracias por la buena disposición con la que me has contestado Pico, se me olvidó especificar algo... La aplicación debería detectar la resolución de la pantalla, no es la aplicación la que debería cambiar la resolución de la pantalla sino adaptar el formulario a ella.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Joselo2002

Resolución automática en forms

Publicado por Joselo2002 (4 intervenciones) el 13/08/2014 21:23:18
Te paso uno pero es para vb6,

Quizás cambiando los eventos de los controles a los de .net logras hacerlo funcionar.

colocar el codigo en un modulo.

Option Explicit

Dim MyForm As FRMSIZE
Dim DesignX As Integer
Dim DesignY As Integer

Public FactorX, FactorY As Single


Sub Resize_For_Resolution(ByVal SFX As Single, ByVal SFY As Single, MyForm As Form)

Dim i As Integer
Dim SFFont As Single
Dim X As Integer
SFFont = (SFX + SFY) / 2 'Escala media
    'Tamaño de los controles para la nueva resolución
On Error Resume Next

With MyForm
For i = 0 To .Count - 1

If TypeOf .Controls(i) Is ComboBox Or TypeName(.Controls(i)) = "DriveListBox" Or _
TypeOf .Controls(i) Is DataCombo Then
'No se puede cambiar Altura
.Controls(i).left = .Controls(i).left * SFX
.Controls(i).top = .Controls(i).top * SFY
.Controls(i).width = .Controls(i).width * SFX

Else
If TypeName(.Controls(i)) = "Timer" Or TypeName(.Controls(i)) = "ImageList" Or TypeName(.Controls(i)) = "CommonDialog" Or TypeName(.Controls(i)) = "Skinner" Or TypeName(.Controls(i)) = "ctxHookMenu" Or TypeName(.Controls(i)) = "Line" Or TypeName(.Controls(i)) = "Calendar" Or TypeName(.Controls(i)) = "Menu" Or TypeName(.Controls(i)) = "Winsock" Or TypeName(.Controls(i)) = "WhoIs" Then

Else

If TypeName(.Controls(i)) = "DataGrid" Then
.Controls(i).Move .Controls(i).left * SFX, .Controls(i).top * SFY, .Controls(i).width * SFX, .Controls(i).height * SFY
For X = 0 To .Controls(i).Splits(0).Columns.Count - 1
.Controls(i).Splits.Item(0).Columns.Item(X).width = .Controls(i).Splits.Item(0).Columns.Item(X).width * SFX
Next

ElseIf TypeName(.Controls(i)) = "ListView" Or TypeName(.Controls(i)) = "SSTab" Or TypeName(.Controls(i)) = "MSHFlexGrid" Then
.Controls(i).Move .Controls(i).left * SFX, .Controls(i).top * SFY, .Controls(i).width * SFX, .Controls(i).height * SFY
If TypeName(.Controls(i)) = "ListView" Then
For X = 1 To .Controls(i).ColumnHeaders.Count
.Controls(i).ColumnHeaders.Item(X).width = .Controls(i).ColumnHeaders.Item(X).width * SFX
Next
End If
If TypeName(.Controls(i)) = "MSHFlexGrid" Then
For X = 1 To .Controls(i).Cols - 1
If .Controls(i).ColWidth(X) > 0 Then
.Controls(i).ColWidth(X) = .Controls(i).ColWidth(X) * SFX
End If
Next
End If
Else
.Controls(i).Move .Controls(i).left * SFX, .Controls(i).top * SFY, .Controls(i).width * SFX, .Controls(i).height * SFY
End If
End If
End If
'Asegúrese de cambiar el tamaño y la posición antes de cambiar el FontSize
If TypeName(.Controls(i)) = "StatusBar" Or TypeName(.Controls(i)) = "Toolbar" Or _
TypeName(.Controls(i)) = "Shape" Or TypeName(.Controls(i)) = "Image" Or _
TypeName(.Controls(i)) = "ImageList" Or TypeName(.Controls(i)) = "Menu" Or _
TypeName(.Controls(i)) = "Skinner" Or TypeName(.Controls(i)) = "ctxHookMenu" Or _
TypeName(.Controls(i)) = "McToolBar" Or _
TypeName(.Controls(i)) = "ProgressBar" Or TypeName(.Controls(i)) = "Line" Or _
TypeName(.Controls(i)) = "Calendar" Or TypeName(.Controls(i)) = "DataList" Or _
TypeName(.Controls(i)) = "VerticalMenu" Or TypeName(.Controls(i)) = "SkinYahoo" Or _
TypeName(.Controls(i)) = "WhoIs" Or TypeName(.Controls(i)) = "vbalGrid" Or _
TypeName(.Controls(i)) = "RichTextBox" Or TypeName(.Controls(i)) = "CoolBar" Or _
TypeName(.Controls(i)) = "MSChart" Or TypeName(.Controls(i)) = "Timer" Or _
TypeName(.Controls(i)) = "TabStrip" Or TypeName(.Controls(i)) = "Winsock" Or _
TypeName(.Controls(i)) = "WebBrowser" Then


ElseIf TypeName(.Controls(i)) = "ListView" Or TypeName(.Controls(i)) = "SSTab" Then
.Controls(i).Font.size = .Controls(i).Font.size * SFFont
ElseIf TypeName(.Controls(i)) = "DataGrid" Then
.Controls(i).HeadFont.size = .Controls(i).HeadFont.size * SFFont
.Controls(i).Font.size = .Controls(i).Font.size * SFFont
ElseIf TypeName(.Controls(i)) = "DataCombo" Then
.Controls(i).Font.size = .Controls(i).Font.size * SFFont
Else
.Controls(i).FontSize = .Controls(i).FontSize * SFFont
End If
Next i
If RePosForm Then
  'Nuevo Tamaño del Formulario
.Move .left * SFX, .top * SFY, .width * SFX, .height * SFY
End If

End With

End Sub

Function Centrar(Nombre As Form, Optional Ajustar As Boolean = True)

If Ajustar = True Then
AjusteVentana Nombre, Ajustar
Else
DoResize = False
End If

'** Centrar las pantallas
If FrmPrincipal.height <> Nombre.height Then
Nombre.top = (FrmPrincipal.height - Nombre.height) / 2
Nombre.left = (FrmPrincipal.width - Nombre.width) / 2
End If

End Function


Function AjusteVentana(Frm As Form, Optional Ajustar As Boolean = True)

Dim ScaleFactorX As Single, ScaleFactorY As Single ' Scaling factors
'Tamaño del Form en píxeles con una resolución de diseño
DesignX = 800
DesignY = 600
RePosForm = Ajustar 'Bandera para el posicionamiento del Formulario
DoResize = False 'Bandera de evento Resize
'Establecer los valores de la pantalla
Xtwips = Screen.TwipsPerPixelX
Ytwips = Screen.TwipsPerPixelY
XPixels = FrmPrincipal.width / Xtwips 'X Pixel Resolución
YPixels = FrmPrincipal.height / Ytwips 'Y Pixel Resolución

'Determinar los factores de escala
ScaleFactorX = (XPixels / DesignX)
ScaleFactorY = (YPixels / DesignY)
Frm.ScaleMode = 1 ' twips

Resize_For_Resolution ScaleFactorX, ScaleFactorY, Frm
MyForm.height = Frm.height 'Recordar el tamaño actual
MyForm.width = Frm.width

End Function


Function Resize(Frm As Form)

Dim ScaleFactorX As Single, ScaleFactorY As Single

If DoResize = False Then 'Para evitar bucle infinito
DoResize = True
Exit Function
End If


RePosForm = False
ScaleFactorX = Frm.width / MyForm.width '¿Cuánto cambio?
ScaleFactorY = Frm.height / MyForm.height
Resize_For_Resolution ScaleFactorX, ScaleFactorY, Frm
MyForm.height = Frm.height 'Recordar el tamaño actual
MyForm.width = Frm.width

End Function


Y en cada form en el load colocar

Centrar Me

el segundo parámetro es por si no quieres que se agrande es false, y solo se centra pero no agranda.

Atte, Joselo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 4
Ha aumentado su posición en 10 puestos en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Resolución automática en forms

Publicado por JOSE HUARIPATA (2 intervenciones) el 22/03/2021 07:10:16
Hola joselo he copiado tu código pero la definición del tipo de dato FRMSIZE para la variable MYFORM no existe, de donde o como has definido este tipo de dato, por favor tengo el mismo problema con mis sistemas en diferentes resoluciones de pantalla... te agradezco tu apoyo anticipadamente...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 1.259
Plata
Ha mantenido su posición en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Resolución automática en forms

Publicado por Antoni Masana (558 intervenciones) el 22/03/2021 16:15:23
El formulario tiene un evento que se llama Resize y es uno de los primero eventos que se ejecutan en el formulario y en general cada vez que cambia de tamaño.
Bien pues es aqui donde debes comprobar el tamaño de la pantalla, dimensionar el formulario y distribuir los elementos para ajustarlos al nuevo tamaño.
No tiene mayor secreto.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 4
Ha aumentado su posición en 10 puestos en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Resolución automática en forms

Publicado por José Luis (2 intervenciones) el 22/03/2021 22:34:23
Excelente, gracias Joselo por ahí unas modificaciones y funciona, gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 145
Ha aumentado 1 puesto en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Resolución automática en forms

Publicado por Sah1d Ra (191 intervenciones) el 22/03/2021 21:35:02
Agrega un Textbox

en VB6 seria
1
2
3
4
5
6
7
8
9
Private Sub form_load()'Aqui solo acomodo el control
 text1.height = 285
 Text1.top = 120
 Text1.left = 120
End sub
 
Private Sub Form_resize()
 text1.width = me.width -(text11.left +240)
end sub

ya después queda ajustar los label, textbox, command, etc etc...

es siempre una labor titanica a mi parecer, felices líneas de programac10n.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar