Formatos de Pantalla

Gabriel Gutierrez
16 de Marzo del 2003
¿Que puedo hacer para que al crear un programa se adapte por igual a los distintos tipos de formatos de pantalla?...800x600, 640x480, etc...

webJose
16 de Marzo del 2003
Pues eso de adaptarse a la resolución del monitor es más como manipular la colocación de los controles en un formulario. Si ese es el caso, en el form_load establezca el ancho y alto deseado del formulario, luego, en el form_resize escriba código para posicionar los elementos del formulario y listo.

El tema es un tanto extenso y no pienso cubrirlo aquí. Lo más prudente sería que usted estudie la ayuda de VB.

Ahora un consejo: Siempre que hago un programa, establezco una resolución mínima. Este límite se convierte en parte de los requerimientos mínimos del sistema para uso del software. Por ejemplo, últimamente no hago programas para resoluciones menores a 800x600 pixeles.

Raptor
16 de Marzo del 2003
Lo mejor es que hagas que cambies la resolucion de tu aplicacion, y luego que la has usado, volvas a la aplicacion original de Windows. De repente esto te sirve:

En el load de la forma, lo primero cambiar la resolucion, luego ejecutas todas tus ondas y antes de salirse que restaure resolucion:


'And this is in a form:
Public ScreenWidth, ScreenHeight
Public lngWidth As Long
Public lngHeight As Long
Public NewWidth As Long
Public NewHeight As Long
Public lngBitsPerPixel As Long

Public Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, _
ByVal nIndex As Long) As Long

Public Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
Public Const SM_CXSCREEN = 0
Public Const SM_CYSCREEN = 1
Public Const BITSPIXEL = 12
Public Const RASTERCAPS = 38
Public Const COLORRES = 108

'For changing the resolution
Declare Function EnumDisplaySettings Lib "user32" _
Alias "EnumDisplaySettingsA" _
(ByVal lpszDeviceName As Long, _
ByVal iModeNum As Long, _
lpDevMode As Any) As Boolean
Declare Function ChangeDisplaySettings Lib "user32" _
Alias "ChangeDisplaySettingsA" _
(lpDevMode As Any, ByVal dwFlags As Long) As Long

Declare Function ExitWindowsEx Lib "user32" _
(ByVal uFlags As Long, ByVal dwReserved As Long) As Long
Public Const EWX_LOGOFF = 0
Public Const EWX_SHUTDOWN = 1
Public Const EWX_REBOOT = 2
Public Const EWX_FORCE = 4
Public Const CCDEVICENAME = 32
Public Const CCFORMNAME = 32
Public Const DM_BITSPERPEL = &H40000
Public Const DM_PELSWIDTH = &H80000
Public Const DM_PELSHEIGHT = &H100000
Public Const CDS_UPDATEREGISTRY = &H1
Public Const CDS_TEST = &H4
Public Const DISP_CHANGE_SUCCESSFUL = 0
Public Const DISP_CHANGE_RESTART = 1
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


Function ChangeRes(ByVal Width As Single, ByVal Height As Single)
Dim DevM As DEVMODE

ScreenWidth = Width
ScreenHeight = Height

'Get the info into DevM
erg& = EnumDisplaySettings(0&, 0&, DevM)
'We don't change the colordepth, because a
'reboot will be necessary

DevM.dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT 'Or DM_BITSPERPEL
DevM.dmPelsWidth = ScreenWidth
DevM.dmPelsHeight = ScreenHeight
'DevM.dmBitsPerPel = 32 (could be 8, 16, 32 or even 4)

'Now change the display and check if possible
erg& = ChangeDisplaySettings(DevM, CDS_TEST)

'Check if successful
Select Case erg&
Case DISP_CHANGE_RESTART
ChangeRes = 0
Case DISP_CHANGE_SUCCESSFUL
erg& = ChangeDisplaySettings(DevM, CDS_UPDATEREGISTRY)
ChangeRes = 1
Case Else
ChangeRes = -1
End Select

End Function
Sub Cambia_Resolucion(forma As Form)
Dim an As Variant
Dim erg&
lngWidth = GetSystemMetrics(SM_CXSCREEN)
lngHeight = GetSystemMetrics(SM_CYSCREEN)
lngBitsPerPixel = GetDeviceCaps(forma.hdc, BITSPIXEL)

'OrigResLbl.Caption = lngWidth & " x " & lngHeight

Dim ResOk
ResOk = ChangeRes(1024, 768) 'Change these numbers as desired

If ResOk = 1 Then
NewWidth = GetSystemMetrics(SM_CXSCREEN)
NewHeight = GetSystemMetrics(SM_CYSCREEN)
'MsgBox "Resolution is " & NewWidth & " x " & NewHeight, _
' vbOKOnly + vbSystemModal, "It worked!"
'CurrResLbl.Caption = NewWidth & " x " & NewHeight
ElseIf ResOk = -1 Then
'MsgBox "Mode not supported", vbOKOnly + vbSystemModal, "Error"
ElseIf ResOk = 0 Then
an = MsgBox("You need to reboot", vbYesNo + vbSystemModal, "Info")
If an = vbYes Then
erg& = ExitWindowsEx(EWX_REBOOT, 0&)
End If
Else
'MsgBox "Unknown Error"
End If

End Sub


Sub Restaura_Resolucion()
Dim ResOk
Dim an
Dim erg&
ResOk = ChangeRes(lngWidth, lngHeight)

If ResOk = 1 Then
NewWidth = GetSystemMetrics(SM_CXSCREEN)
NewHeight = GetSystemMetrics(SM_CYSCREEN)
'MsgBox "Resolution is " & NewWidth & " x " & NewHeight, _
' vbOKOnly + vbSystemModal, "It worked!"
ElseIf ResOk = -1 Then
MsgBox "Mode not supported", vbOKOnly + vbSystemModal, "Error"
ElseIf ResOk = 0 Then
'an = MsgBox("You need to reboot", vbYesNo + vbSystemModal, "Info")
If an = vbYes Then
erg& = ExitWindowsEx(EWX_REBOOT, 0&)
End If
Else
'MsgBox "Unknown Error"
End If
End

End Sub



webJose
16 de Marzo del 2003
OPINIÓN: Detesto que un programa de Windows que NO sea un juego, esté cambiando la resolución de la pantalla. Por qué? Imagine que estoy usando Excel, y de pronto necesito la aplicación XYZ. Si XYZ necesita otra resolución y en efecto fuerza esta resolución, en el momento en que necesite Excel nuevamente pero sin cerrar XYZ estaré usando Excel en otra resolución que no es mi preferida.

Ciertamente yo nunca usaría XYZ nuevamente.