Mantener los tamaños y proporciones de los formularios y su contenido aunque cambie la resolución de la pantalla

 

Colaboración de Guillermo de Israel.


Este tema fue desarrollado usando VB 3.0 bajo Windows 3.1. Funciona perfectamente bajo Windows 95.
No lo he probado en VB 4.0, pero creo que con mínimas correcciones funcionara también.

El proceso de redimensionamiento y renunciación físicos de formularios y sus diversos objetos se basa en un articulo de origen ingles reproducido en MS Knowledge Base, que usaba, equivocadamente, el parámetro Twips Per Pixel (12 o 15 de acuerdo a la resolución de pantalla en pixels) para obtener un factor de conversión. El autor de esta serie de subrutinas descarto ese encare y usa el ancho y alto de pantalla, en twips, obtenibles durante la ejecución del proyecto por medio de la función SCREEN y sus propiedades Ancho y Alto.

Todas las subrutinas incluidas en este paquete, salvo esta parte que es solamente explicatoria, deben incluirse en un modulo de código (yo lo he llamado COMUNES.BAS), de modo que sean accesibles desde cualquier lugar del proyecto.

El autor uso originalmente una resolución de pantalla física de 9600 x 7200 twips.
El numero de twips por pixel no influye en el proceso, como se dijo antes.
Si la resolución de pantalla usada durante el diseño fuera distinta que estos números, habría que reemplazar dichos números en las líneas correspondientes en la subrutina factores.


'Incluir las tres declaraciones siguientes en la parte DECLARATIONS bajo GENERAL 
'del modulo COMUNES.BAS

 

Global presentForm As Form
Global FlagFlag As Integer 'bandera que indica el estado de cosas durante el proceso.
Global HorFactor As Single, VerFactor As Single 'multiplicadores para escala de adaptación

 

Sub CenterForm (x As Form)
	'Centra en la pantalla física el formulario llamado x
	Screen.MousePointer = 11
	x.Top = Screen.Height / 2 - x.Height / 2
	x.Left = Screen.Width / 2 - x.Width / 2
	Screen.MousePointer = 0
	'Exponer el formulario
	x.Show
End Sub

 

Sub ComboResizing (x As Control)
	'adapta medidas y ubicación de una caja combo
	x.Left = x.Left * HorFactor
	x.Top = x.Top * VerFactor
	x.Width = x.Width * HorFactor
	x.Height = x.Height * VerFactor
End Sub

 

Sub CommButtonResizing (x As Control)
	'Adapta medidas y ubicación de un botón de comando
	x.Left = x.Left * HorFactor
	x.Top = x.Top * VerFactor
	x.Width = x.Width * HorFactor
	x.Height = x.Height * VerFactor
	x.FontSize = x.FontSize * HorFactor
End Sub

 

Sub ControlsResizing (x As Control)
	'Redimensiona y reubica un control genérico
	x.Left = x.Left * HorFactor
	x.Top = x.Top * VerFactor
	x.Width = x.Width * HorFactor
	x.Height = x.Height * VerFactor
End Sub

 

Sub Factores ()
' El autor uso originalmente una resolución de pantalla fisica de 9600 x 7200 twips.
' El número de twips por pixel no influye en el proceso.
' Si fuera distinto habria que reemplazar dichos numeros en las lineas correspondientes
' más abajo.
' Se hace uso de la función Screen, accesible solamente durante el procesado
' del programa, que da el ancho y alto de la pantalla en twips.
	SizingFactor = 0
	HorFactor = Screen.Width / 9600
	VerFactor = Screen.Height / 7200
' Si la pantalla de uso tiene la misma resolución que la de diseño
' no habrá que hacer nada, lo cual indicamos con la bandera SizingFactor igual a 1.
	If HorFactor = 1 And VerFactor = 1 Then
		SizingFactor = 1
	End If
End Sub

 

Sub GaugeResizing (x As Control)
	'Redimensiona y reubica un instrumento de medición circular
	If x.Style = 3 Then
		DummyWidth = x.Width * HorFactor
		x.Left = x.Left * HorFactor + (DummyWidth - x.Width) / 2
		DummyHeight = x.Height * VerFactor
		x.Top = x.Top * VerFactor + (DummyHeight - x.Height) / 2
	ElseIf x.Style = 1 Then
		x.Left = x.Left * HorFactor
		x.Top = x.Top * VerFactor
		x.Height = x.Height * VerFactor
	End If
End Sub

 

Sub LabelResizing (x As Control)
	' Redimensiona y reubica un label
	x.Left = x.Left * HorFactor
	x.Top = x.Top * VerFactor
	x.Width = x.Width * HorFactor
	x.Height = x.Height * VerFactor
	x.FontSize = x.FontSize * VerFactor
End Sub

 

Sub LineResizing (x As Control)
	' Redimensiona (incluido grosor) y reubica una linea recta
	x.X1 = x.X1 * HorFactor
	x.X2 = x.X2 * HorFactor
	x.Y1 = x.Y1 * VerFactor
	x.Y2 = x.Y2 * VerFactor
	x.BorderWidth = x.BorderWidth * VerFactor
End Sub

 

Sub MainFrm_View ()
	' Esta subrutina la uso para descargar el formulario en uso,
	' y recargar la que contiene los menus del proyecto. No es imprescindible para
	' la tarea de redimensionar y reubicar formularios y sus objetos.
	presentForm.Hide
	Unload presentForm
	frmMain.Show
End Sub

 

Sub PictResizing (x As Control)
	'Redimensiona y reubica un objeto de tipo picture
	x.Top = Screen.Height / 2 - x.Height / 2
	x.Left = Screen.Width / 2 - x.Width / 2
End Sub

 

Sub SizeAdaptor (y As Form)
	' Esta es la rutina principal del proceso de redimensión y reubucación.
	' Debe ser invocada [call SizeAdaptor(NombreDelFormulario)] al cargar (Load)
	' cada formulario del programa a su turno.
	' Aca se recorren el formulario y todos los controles que contiene
	' para determinar el curso de accion a seguir para cada uno de ellos.
	HojaBlanca.Show 'Desplegamos un formulario vacio mientras efectua los cambios
	'El autor uso un formulario principal llamado frmMain conteniendo menus.
	If FlagFlag = 0 Then Unload frmMain
	' Invocar la rutina que calcula los factores de correccion de tamaño
	Call Factores
	' Si el uso y el diseño se realizan con una misma resolución de pantalla,
	' no hace falta corrección alguna y se puede salir de la subrutina.
	If SizingFactor = 1 Then
		y.Show
		Unload HojaBlanca
		Exit Sub
	End If
	' Si el uso y el diseño se realizan con resoluciones de pantalla distintas
	' hay que modificar las medidas y ubicación de cada componente.
	' Adaptar el formulario en si.
	' Esconder el formulario y su contenido mientras se hace la adaptación.
	y.Hide
	y.Left = 0
	y.Top = 0
	y.Height = Screen.Height
	y.Width = Screen.Width
	' La funcion Controls.Count permite saber cuantos controles hay en el formulario
	Ctl = y.Controls.Count - 1
	' Adaptar uno por uno todos los controles incluidos en el formulario, cada uno
	' de acuerdo a su naturaleza.
	For ii = 0 To Ctl
		If TypeOf y.Controls(ii) Is Line Then
			Call LineResizing(y.Controls(ii))
		ElseIf TypeOf y.Controls(ii) Is ComboBox Then
			Call ComboResizing(y.Controls(ii))
		ElseIf TypeOf y.Controls(ii) Is ListBox Then
			Call ComboResizing(y.Controls(ii))
		ElseIf TypeOf y.Controls(ii) Is CommandButton Then
			Call CommButtonResizing(y.Controls(ii))
		ElseIf TypeOf y.Controls(ii) Is TextBox Then
			Call TextBoxResizing(y.Controls(ii))
		ElseIf TypeOf y.Controls(ii) Is Label Then
			Call LabelResizing(y.Controls(ii))
		ElseIf TypeOf y.Controls(ii) Is Gauge Then
			Call GaugeResizing(y.Controls(ii))
		ElseIf TypeOf y.Controls(ii) Is PictureBox Then
			Call PictResizing(y.Controls(ii))
		ElseIf TypeOf y.Controls(ii) Is Timer Then
			' Aca se pueden agregar lineas para otros tipos de control que hubiere
		Else
			Call ControlsResizing(y.Controls(ii))
		End If
	Next ii
	' Una vez completado el proceso de adaptacion volvemos a mostrar el formulario
	' con todo su contenido.
	y.Show
	' Una vez desplegado nuevamente el formulario modificado,
	' podemos descargar el formulario vacio.
	Unload HojaBlanca
End Sub

 

Sub TextBoxResizing (x As Control)
	x.Left = x.Left * HorFactor
	x.Top = x.Top * VerFactor
	x.Width = x.Width * HorFactor
	x.Height = x.Height * VerFactor
	x.FontSize = x.FontSize * VerFactor
End Sub

ir al índice