Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Resolución monitor

Estas en el tema de Resolución monitor en el foro de Visual Basic clásico en Foros del Web. Hola, estoy desarrollando una aplicación en visual basic en un pc con resolución 1024x768, sobre un monitor de 17 hasta aqui todo bien. Cuando la ...
  #1 (permalink)  
Antiguo 04/09/2005, 16:58
 
Fecha de Ingreso: julio-2005
Mensajes: 9
Antigüedad: 18 años, 9 meses
Puntos: 0
Resolución monitor

Hola,
estoy desarrollando una aplicación en visual basic en un pc con resolución
1024x768, sobre un monitor de 17 hasta aqui todo bien.
Cuando la instalo en otro ordenador con diferente resolución y tamaño de monitor , los formularios me salen desproporcionados.
¿alguien sabría como solucionar esto de una forma elegante, y no ir control a control cambiando sus dimensiones?
Si no hay más remedio que hacerlo manualmente control a control ,
¿alguien sabria de aluguna fuente de información para realizar el proceson con ciertas garantias?
Gracias de antemano
  #2 (permalink)  
Antiguo 05/09/2005, 14:01
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Pregunta

Cita:
Iniciado por hexx
Hola,
estoy desarrollando una aplicación en visual basic en un pc con resolución
1024x768, sobre un monitor de 17 hasta aqui todo bien.
Cuando la instalo en otro ordenador con diferente resolución y tamaño de monitor , los formularios me salen desproporcionados.
¿alguien sabría como solucionar esto de una forma elegante, y no ir control a control cambiando sus dimensiones?
Si no hay más remedio que hacerlo manualmente control a control ,
¿alguien sabria de aluguna fuente de información para realizar el proceson con ciertas garantias?
Gracias de antemano
¿Desproporcionados? no entiendo que es lo que quieres decir.....
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #3 (permalink)  
Antiguo 05/09/2005, 15:14
 
Fecha de Ingreso: julio-2005
Mensajes: 9
Antigüedad: 18 años, 9 meses
Puntos: 0
Re:Desproporcionados

Ciertamente no es desproporcionados la palabra , simplemente que no se ven algunos botones, el formulario no cabe en la pantalla, a eso me referia.
No mantiene el aspecto que yo le di en el diseño sobre 10024x768 en el monitor de 17.
Me gustaria que mantuviese el mismo aspecto sea cual sea resolución y el monitor.
Gracias
  #4 (permalink)  
Antiguo 05/09/2005, 15:21
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
De acuerdo

Cita:
Iniciado por hexx
Ciertamente no es desproporcionados la palabra , simplemente que no se ven algunos botones, el formulario no cabe en la pantalla, a eso me referia.
No mantiene el aspecto que yo le di en el diseño sobre 10024x768 en el monitor de 17.
Me gustaria que mantuviese el mismo aspecto sea cual sea resolución y el monitor.
Gracias
Ah, o sea que el formulario es más grande que la pantalla, entonces lo que debieras es ponerle que se inicie maximizado (y bloquear el restaurar) así el formulario se ajusta a la pantalla, y lo de los controles, pues puedes registrar en el Form_Load su dimensión real y en el Form_Resize realizar un cálculo para que se quede proporcional, si quieres te doy un ejemplo....
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #5 (permalink)  
Antiguo 05/09/2005, 15:39
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
De acuerdo

Esto es para que todos los controles se vuelvan proporcionales al tamaño del Formulario:
Código:
 
Private Dimensiones(4) As String
Private Sub Form_Load()
Dim Control
On Error Resume Next
For Control = 0 To Controls.Count - 1
	Set Actual = Controls(Control)
	Dimensiones(0) = Dimensiones(0) & CStr(Actual.Left) & ","
	Dimensiones(1) = Dimensiones(1) & CStr(Actual.Top) & ","
	Dimensiones(2) = Dimensiones(2) & CStr(Actual.Width) & ","
	Dimensiones(3) = Dimensiones(3) & CStr(Actual.Height) & ","
Next Control
Dimensiones(4) = CStr(Width) & "," & CStr(Height)
End Sub
Private Sub Form_Resize()
If WindowState = 1 Then Exit Sub
Dim Control
On Error Resume Next
For Control = 0 To Controls.Count - 1
	Set Actual = Controls(Control)
	Actual.Left = (CInt(GetIndex(Dimensiones(0), ",", Control)) * Width) / CInt(GetIndex(Dimensiones(4), ",", 0))
	Actual.Top = (CInt(GetIndex(Dimensiones(1), ",", Control)) * Height) / CInt(GetIndex(Dimensiones(4), ",", 1))
	Actual.Width = (CInt(GetIndex(Dimensiones(2), ",", Control)) * Width) / CInt(GetIndex(Dimensiones(4), ",", 0))
	Actual.Height = (CInt(GetIndex(Dimensiones(3), ",", Control)) * Height) / CInt(GetIndex(Dimensiones(4), ",", 1))
Next Control
End Sub
Function GetIndex(ByVal Cadena As String, ByVal Separador As String, ByVal Index As Integer) As String
Dim UlParada As Integer
Dim Buscar As Integer
Dim IIndex As Integer
If Right(Cadena, 1) <> Separador Then Cadena = Cadena & Separador
UlParada = 1
Do
	Buscar = InStr(UlParada, Cadena, Separador)
	If Buscar = 0 Then Exit Do
	If IIndex = Index Then
		GetIndex = Mid$(Cadena, UlParada, Buscar - UlParada)
		Exit Do
	End If
	IIndex = IIndex + 1
	UlParada = Buscar + 1
Loop
End Function
A pesar de que el texto no lo deja proporcional , pero los controles sí.....
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #6 (permalink)  
Antiguo 05/09/2005, 16:42
 
Fecha de Ingreso: julio-2005
Mensajes: 9
Antigüedad: 18 años, 9 meses
Puntos: 0
Gracias por el codigo.
He estado invesgiando y tb hay algunos controles (de pago :/ ) que realizan la labor.
Miraré a ver si me resulta util tu codigo y ver si puedo dar alguna solución a las fuentes
Gracias
  #7 (permalink)  
Antiguo 06/09/2005, 04:54
Avatar de aldo1982  
Fecha de Ingreso: noviembre-2004
Ubicación: Santa Fe (Argentina) Colon F.C
Mensajes: 1.362
Antigüedad: 19 años, 5 meses
Puntos: 6
a mi me pása lo mismo, o sea con esee codigo de david se ajusta todo, pero se puede o no cambiar la resolucion ?
__________________
LA MUERTE ESTÁ TAN SEGURA DE VENCER QUE NOS DA TODA UNA VIDA DE VENTAJA
  #8 (permalink)  
Antiguo 06/09/2005, 06:42
Avatar de aldo1982  
Fecha de Ingreso: noviembre-2004
Ubicación: Santa Fe (Argentina) Colon F.C
Mensajes: 1.362
Antigüedad: 19 años, 5 meses
Puntos: 6
aca te dejo algo ke kizas te ayude

CAMBIANDO LA RESOLUCIÓN DE WINDOWS

2 Api’s necesarias para cambiar la resolución de Windows. Pära este ejemplo necesitan un formulario con un Listbox y un Boton.

Const CCDEVICENAME = 32
Const CCFORMNAME = 32

Private Type DEVMODE
dmDeviceName As String * CCDEVICENAME
dmSpecVersion As Integer
dmDriverVersion As Integer
dmSize As Integer
dmDriverExtra As Integer
dmFields As Long
dmOrientation As Integer
dmPaperSize As Integer
dmPaperLength As Integer
dmPaperWidth As Integer
dmScale As Integer
dmCopies As Integer
dmDefaultSource As Integer
dmPrintQuality As Integer
dmColor As Integer
dmDuplex As Integer
dmYResolution As Integer
dmTTOption As Integer
dmCollate As Integer
dmFormName As String * CCFORMNAME
dmUnusedPadding As Integer
dmBitsPerPel As Integer
dmPelsWidth As Long
dmPelsHeight As Long
dmDisplayFlags As Long
dmDisplayFrequency As Long
End Type

Const CDS_UPDATEREGISTRY = &H1
Const CDS_TEST = &H4
Const DISP_CHANGE_SUCCESSFUL = 0
Const DISP_CHANGE_RESTART = 1

Private Declare Function EnumDisplaySettings Lib "user32" Alias "EnumDisplaySettingsA" (ByVal lpszDeviceName As Long, ByVal iModeNum As Long, lpDevMode As Any) As Boolean
Private Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" (lpDevMode As Any, ByVal dwFlags As Long) As Long

Dim dev As DEVMODE
Dim i, resultado1, resultado2 As Long
Dim Resul As Boolean


Private Sub Command1_Click()

dev.dmPelsWidth = Mid(List1.Text, 1, InStr(1, List1.Text, "X") - 2)
dev.dmPelsHeight = Mid(List1.Text, InStr(1, List1.Text, "X") + 2, 3)
dev.dmBitsPerPel = Mid(List1.Text, InStr(1, List1.Text, "X") + 5, InStr(1, List1.Text, "b") - (InStr(1, List1.Text, "X") + 5))
resultado1 = ChangeDisplaySettings(dev, CDS_TEST)

If resultado1 = DISP_CHANGE_RESTART Then
MsgBox "Necesitas reiniciar la maquina"
End If

If resultado1 = DISP_CHANGE_SUCCESSFUL Then
ChangeDisplaySettings dev, CDS_UPDATEREGISTRY
End If

End Sub

Private Sub Form_Load()

Command1.Caption = "Cambiar Resolucion"



Do

Resul = EnumDisplaySettings(0&, i, dev)

List1.AddItem dev.dmPelsWidth & " X " & dev.dmPelsHeight & " " & dev.dmBitsPerPel & " bits"
i = i + 1
Loop While Resul

End Sub


Si ejecutan el programa verán que en el ListBox se colocan todas las Resoluciones posibles que soporta la tarjeta de video que posean, seleccionen una y denle click a “Cambiar Resolución” e inmediatamente verán como la computadora cambia de resolución.



ENUMDISPLAYSETTINGS
Api: Private Declare Function EnumDisplaySettings Lib "user32" Alias "EnumDisplaySettingsA" (ByVal lpszDeviceName As Long, ByVal iModeNum As Long, lpDevMode As Any) As Boolean


Con esta API obtenemos información acerca de un dispositivo gráfico, en nuestro caso la usamos para hacer un listado de las resoluciones posibles a las cuales podemos cambiar.

Como parámetros tenemos
lpszDeviceName: este parámetro puede ser NULL. Si es NULL nos referimos al dispositivo gráfico usado en ese momento.
iModeNum: sirve como índice, para recuperar la información del dispositivo gráfico.
lpDevMode: Es un puntero a una estructura de tipo DEVMODE la cual en los inicios de este documento se encuentra su explicación.

En el programa lo usamos de esta manera:

Do

Resul = EnumDisplaySettings(0&, i, dev)

List1.AddItem dev.dmPelsWidth & " X " & dev.dmPelsHeight & " " & dev.dmBitsPerPel & " bits"
i = i + 1
Loop While Resul

End Sub

Como podrán observar, la estructura DEVMODE representada en la variable “dev”, cambia sus valores cada vez que entra, con este código logramos que “Mientras Resul sea true” continué mostrando información, cuando ya se haya extraído toda la información EnumDisplaySettings retorna FALSE y sale del bucle. Para moverse en los distintos tipos de información usamos la variable “i” la cual empieza en 0 y va aumentando de uno en uno.

CHANGEDISPLAYSETTINGS
Api: Private Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" (lpDevMode As Any, ByVal dwFlags As Long) As Long

Api utilizada para cambiar la configuración de un dispositivo gráfico. En nuestro caso lo usamos para cambiar la resolución del sistema operativo.

Como parámetros tenemos, “lpDevMode” el cual se le pasa una variable de tipo DEVMODE, y luego tenemos un Flag “dwFlag” el cual lo utilizamos para indicar lo que queremos hacer.


En el programa lo usamos de la manera siguiente:

resultado1 = ChangeDisplaySettings(dev, CDS_TEST)

If resultado1 = DISP_CHANGE_RESTART Then
MsgBox "Necesitas reiniciar la maquina"
End If

If resultado1 = DISP_CHANGE_SUCCESSFUL Then
ChangeDisplaySettings dev, CDS_UPDATEREGISTRY
End If

Primero probamos si la resolución, a la cual estamos invocando es compatible, para ello, usamos un flag “CDS_TEST” si la función ChangeDisplaySettings retorna DISP_CHANGE_RESTART significa que para realizar el cambio de la resolución hay que reiniciar la maquina, si la función retorna DISP_CHANGE_SUCCESSFUL significa que no hay ningún problema. Ahora ¿Por qué invocar dos veces ChangeDsiplaySettings?

resultado1 = ChangeDisplaySettings(dev, CDS_TEST)
En este caso probamos si es compatible.

ChangeDisplaySettings dev, CDS_UPDATEREGISTRY
Y aquí sabiendo que ya es compatible, actualizamos esa información en el registro de Windows, y para ello usamos el flag CDS_UPDATEREGISTRY
__________________
LA MUERTE ESTÁ TAN SEGURA DE VENCER QUE NOS DA TODA UNA VIDA DE VENTAJA
  #9 (permalink)  
Antiguo 06/09/2005, 11:28
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Exclamación

Esa ya lo sabía, pero no es conveniente cambiar la resolución si el programa que estás haciendo no se ejecuta a pantalla completa, pues si se minimiza vuestro programa, las demás ventanas quedan horribles .... ok
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.

Última edición por David; 06/09/2005 a las 11:37
  #10 (permalink)  
Antiguo 06/09/2005, 11:35
Avatar de GeoAvila
Colaborador
 
Fecha de Ingreso: diciembre-2003
Ubicación: Antigua Guatemala
Mensajes: 4.032
Antigüedad: 20 años, 4 meses
Puntos: 53
Insisto porque usas el citar.. a un mensaje tan grande..... como cuesta llegar hasta bajo para las dos lineas de comentario.. pero bueno....

Que Dios me dé paciencia pero ante todo Tolerancia!!!!

jejeje...

nos vmeos..
__________________
* Antes de preguntar lee las FAQ, y por favor no hagas preguntas en las FAQ
Sitio http://www.geoavila.com twitter: @GeoAvila
  #11 (permalink)  
Antiguo 06/09/2005, 11:36
Avatar de aldo1982  
Fecha de Ingreso: noviembre-2004
Ubicación: Santa Fe (Argentina) Colon F.C
Mensajes: 1.362
Antigüedad: 19 años, 5 meses
Puntos: 6
ahh ok gracias, yo iva a usar el código ke púse ahi ejejej gracias nnuevamente david
__________________
LA MUERTE ESTÁ TAN SEGURA DE VENCER QUE NOS DA TODA UNA VIDA DE VENTAJA
  #12 (permalink)  
Antiguo 06/09/2005, 11:38
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
De acuerdo

Cita:
Iniciado por GeoAvila
Insisto porque usas el citar.. a un mensaje tan grande..... como cuesta llegar hasta bajo para las dos lineas de comentario.. pero bueno....

Que Dios me dé paciencia pero ante todo Tolerancia!!!!

jejeje...

nos vmeos..
Ya sabes... la fuerza de la costumbre, nos vemos ....
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #13 (permalink)  
Antiguo 08/09/2005, 19:40
 
Fecha de Ingreso: julio-2005
Mensajes: 9
Antigüedad: 18 años, 9 meses
Puntos: 0
Cambiar la resolución para ejecutar el programa me parece una burrada.
Imaginemos que cada programa pone su resolución a donde ibamos a llegar.
Creo que la mejor solución es pillarse un control ke hace todo el trabajo transparentemente para el programador o cambiarse a .net dnd tb se realiza el proceso de automaticamente.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:15.