| Colabora VB6 |
Cambiar la resolución de pantalla - revisado para Win XP[Codigo para VB6]
Fecha: 04/Jul/2006 (26-06-06)
|
|
El tema de cambiar la resolución de pantalla es un poco contradictorio ya que en Windows 98 con código mas simple funciona perfecto pero en XP (por lo menos en el SP2) no hace nada (probé los publicados en esta página) Así que le mandé al Guille la inquietud y me puse a buscar en las ayudas de MicroSoft, no encontré nada diferente, salvo que se refería mucho a dwFlags de la función ChangeDisplaySettings y ciertos valores de DevMode, bueno busque esos posibles valores y prueba va, prueba viene, acá está el resultado
Código de la clase ScrChanges.cls
' Declaración de Funciones API a usar
Private Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" _
(lpDevMode As Any, ByVal dwFlags As Long) As Long
' API para saber los formatos de resoluciones posibles
Private Declare Function EnumDisplaySettings Lib "user32" Alias "EnumDisplaySettingsA" _
(ByVal lpszDeviceName As Long, ByVal iModeNum As Long, _
lpDevMode As DEVMODE) As Boolean
Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long
Const CCHDEVICENAME = 32
Const CCHFORMNAME = 32
Const DM_BITSPERPEL = &H40000
Const DM_PELSWIDTH = &H80000
Const DM_PELSHEIGHT = &H100000
Const DM_DISPLAYFLAGS = &H200000
Const DM_DISPLAYFREQUENCY = &H400000
Const BITSPIXEL = 12
' Flags para cambiar resoluciones
Const CDS_UPDATEREGISTRY = &H1
Const CDS_TEST = &H2
Const CDS_FULLSCREEN = &H4
Const CDS_GLOBAL = &H8
Const CDS_SET_PRIMARY = &H10
Const CDS_RESET = &H40000000
Const CDS_SETRECT = &H20000000
Const CDS_NORESET = &H10000000
' Valores retornados por ChangeDisplaySettings
Const DISP_CHANGE_SUCCESSFUL = 0
Const DISP_CHANGE_RESTART = 1
Const DISP_CHANGE_FAILED = -1
Const DISP_CHANGE_BADMODE = -2
Const DISP_CHANGE_NOTUPDATED = -3
Const DISP_CHANGE_BADFLAGS = -4
Const DISP_CHANGE_BADPARAM = -5
' Valores usados en EnumDisplaySettings
Const ENUM_CURRENT_SETTINGS As Long = -1&
Const ENUM_REGISTRY_SETTINGS As Long = -2&
Private Type DEVMODE
dmDeviceName As String * CCHDEVICENAME
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 * CCHFORMNAME
dmUnusedPadding As Integer
dmBitsPerPel As Integer
dmPelsWidth As Long
dmPelsHeight As Long
dmDisplayFlags As Long
dmDisplayFrequency As Long
End Type
' Matriz para guardar los formatos disponibles
Dim ScrMode() As DEVMODE
Dim NumModes As Long
' Variables para guardar la configuración actual
Dim lBits As Long, lWidth As Long, lHeight As Long, IndexSM As Long
Private Flg As Boolean
Public Sub Init(hdcFrm As Long)
' Se debe pasar el Hdc del Form que llama a la clase
' Tomamos la configuración inicial del video
Dim hdc As Long
hdc = hdcFrm
lBits = GetDeviceCaps(hdc, BITSPIXEL)
lWidth = Screen.Width \ Screen.TwipsPerPixelX
lHeight = Screen.Height \ Screen.TwipsPerPixelY
' Cargamos los posibles modos
Dim i As Long
Dim a As Long
Dim s As String
ReDim Preserve ScrMode(0) As DEVMODE
i = 0
Do
a = EnumDisplaySettings(0&, i, ScrMode(i))
i = i + 1
If a Then
ReDim Preserve ScrMode(i) As DEVMODE
If lBits = ScrMode(i - 1).dmBitsPerPel And _
lWidth = ScrMode(i - 1).dmPelsWidth And _
lHeight = ScrMode(i - 1).dmPelsHeight Then
IndexSM = i - 1
End If
End If
Loop While a
NumModes = i - 1
Flg = True
End Sub
Public Sub LoadModes(SMode() As String)
If Flg = False Then Exit Sub
' Carga en una matriz los modos disponibles
Dim x As Long
ReDim SMode(0 To NumModes) As String
For x = 0 To NumModes
SMode(x) = Format$(ScrMode(x).dmPelsWidth, " @@@@") & " x " & _
Format$(ScrMode(x).dmPelsHeight, "@@@@") & " " & _
Format$(ScrMode(x).dmBitsPerPel, "@@") & " bits"
Next x
End Sub
Public Function ChangeMode(Index As Long) As Long
'Cambia la resolución de acuerdo a la posición de la matriz pasada en Index
If Flg = False Then Exit Function
Dim Cdv As Long
If Index < 0 Or Index > NumModes Then
ChangeMode = 255
Exit Function
End If
ScrMode(Index).dmFields = DM_BITSPERPEL Or DM_PELSWIDTH Or DM_PELSHEIGHT
Flags = CDS_UPDATEREGISTRY
Cdv = ChangeDisplaySettings(ScrMode(Index), Flags)
ChangeMode = Cdv
' Valores devueltos en ChangeMode
' 0 = Cambio realizado
' 1 = Debe reiniciar para ver los cambios
' -1 = Error al realizar el cambio
End Function
Public Function RestoreInicial() As Long
' Restaura la resolución, dejando la configuración original cuando se creó la clase
If Flg = False Then Exit Function
RestoreInicial = ChangeMode(IndexSM)
End Function
Public Sub ModeInit(SAncho As Long, SAlto As Long, bits As Long, PosArray As Long)
' Devuelve las medidas del video inicial
If Flg = False Then Exit Sub
SAncho = ScrMode(IndexSM).dmPelsWidth
SAlto = ScrMode(IndexSM).dmPelsHeight
bits = ScrMode(IndexSM).dmBitsPerPel
PosArray = IndexSM
End Sub
‘Acá termina el código de la clase
‘Esto es una base de cómo se puede usar en un formulario
En un formulario agregar una ListBox (List1) y 2 botones (Command1 y Command2)
Private ScrCls As New ScrChanges
Private Sub Command1_Click()
Dim psi As Long
psi = List1.ListIndex
ScrCls.ChangeMode psi
End Sub
Private Sub Command2_Click()
ScrCls.RestoreInicial
End Sub
Private Sub Form_Load()
'cargamos la lista
ScrCls.Init Me.hdc
Dim sm() As String, x As Long
ScrCls.LoadModes sm()
For x = 0 To UBound(sm)
List1.AddItem sm(x)
Next x
ScrCls.ModeInit 0, 0, 0, psi&
List1.ListIndex = psi&
End Sub
Private Sub Form_Unload(Cancel As Integer)
'Restauramos la resolución inicial, esto es una prueba
ScrCls.RestoreInicial
'destruimos la clase
Set ScrCls = Nothing
End Sub
‘El código es básico, lo que recomiendo es no modificar la matriz donde se guardan los datos sobre las resoluciones soportadas, ya que en Windows XP es necesaria toda la información que se recibe en DevMode para realizar los cambios
|
| Código de ejemplo (ZIP): |
|
Fichero con el código de ejemplo: hellraised_Scrchange.zip - (3.42) KB
|