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. jcardona32000@hotmail.com (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

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

Resolución automática en forms

Publicado por Joselo2002 (3 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
0
Comentar