Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Cambiare il numero di colori sullo schermo

Salve,
 ho cercato una funzione in visual basic 5 (SP3) che mi permettesse di
cambiare il numero di colori sullo schermo da 16M a 256, ma non l'ho
trovata. Qual'e' l'API adatta al mio scopo?

...

Prova con questa routine:
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
Private Const CCDEVICENAME = 32
Private Const CCFORMNAME = 32
Private Const DM_BITSPERPEL = &H40000
Private Const DM_PELSWIDTH = &H80000
Private Const DM_PELSHEIGHT = &H100000
Private Const CDS_UPDATEREGISTRY = &H1
Private Const CDS_TEST = &H4
Private Const DISP_CHANGE_SUCCESSFUL = 0
Private Const DISP_CHANGE_RESTART = 1
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
'Costanti ExitWindowsEx
Private Const EWX_LOGOFF = 0
Private Const EWX_SHUTDOWN = 1
Private Const EWX_REBOOT = 2
Private Const EWX_FORCE = 4
Sub ChangeDisplay(ByVal ResX As Long, ByVal ResY As Long, Optional ByVal
ColorDepth As Integer)
Dim DevM As DEVMODE
Dim Retcode As Long
'Recuperiamo le informazioni correnti
EnumDisplaySettings 0&, 0&, DevM
'Impostiamo i cambiamenti da effettuare (solo risoluzione)
DevM.dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT
DevM.dmPelsWidth = ResX    'ScreenWidth
DevM.dmPelsHeight = ResY   'ScreenHeight
'Se ColorDepth e' stata impostata allora
'aggiungiamo anche il cambio di profondita'
If ColorDepth > 0 Then '(puo' essere 4, 8, 16, 32)
    DevM.dmFields = DevM.dmFields Or DM_BITSPERPEL
    DevM.dmBitsPerPel = ColorDepth
End If
'Testiamo le impostazioni
Retcode = ChangeDisplaySettings(DevM, CDS_TEST)
Select Case Retcode
Case DISP_CHANGE_RESTART
    If MsgBox("E' necessario riavviare il sistema per rendere effettive le
impostazioni." _
     & vbLf & "Continuare?", vbYesNo + vbSystemModal, "Info") = vbYes Then
        ExitWindowsEx EWX_REBOOT, 0&
    End If
Case DISP_CHANGE_SUCCESSFUL
    'salviamo le impostazioni per i riavvii successivi
    ChangeDisplaySettings DevM, CDS_UPDATEREGISTRY
    MsgBox "Risoluzione impostata.", vbOKOnly + vbSystemModal, "Info"
Case Else
    MsgBox "Risoluzione non supportata", vbOKOnly + vbSystemModal, "Errore"
End Select
End Sub
Ciao
--
Luca Dormio
l...@sig-la.com
ldo...@tin.it



Prova con questa routine:
[cut]
Ho provato,  ma il retcode mi da' sempre -2, anche con una risoluzione
di 640x480.
Ho provato (a titolo di scrupolo) a enumerare le risoluzioni
supportate dalla mia scheda video (una matrox G200) e arrivo
tranquillamente ad una risoluzione di 1280x1024.
Ho dato un'occhiata al file Win32API.txt, ma molte costanti che tu hai
usato non ci sono. Oggi scarico una versione aggiornata.
Comunque tornando all'esempio non ho proprio idea di cosa fare. :~(
Grazie comunque.

...

In effetti alcune costanti non le trovo neanche sul mio Win32Api.txt;
probabilmente le avro' copiate da qualche altro esempio o dall'MSDN, in ogni
caso ho riprovato nuovamente l'esempio e l'unico caso in cui mi ritorna -2 e'
quando cerco di impostare la risoluzione a 4bit (16 colori); in tutti gli altri
casi qui sembra funzionare correttamente...
