Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Cambiare la risoluzione dello schermo

Ciao ragazzi,
ho cercato su 
groups.google.com
 diverse soluzioni per cambiare la
risoluzione del dekstop. Ho trovato qualcosa, ma soffrono tutte di diversi
effetti collaterali che non mi piacciono molto.
Praticamente, sto sviluppando un piccolo giochino che all'inizio parte in
modalità finestra. Se uno vuole, può cliccare su un pulsante che gli porta
lo schermo a 800x600. Fin qua nessun problema.
All'uscita devo ripristinare la risoluzione originaria, e qui arrivano i
problemi:
1) la procedura che uso è un po' troppo invasiva, nel senso che il cambio di
risoluzione mi schiaccia tutte le icone, me le riposiziona a casaccio e non
va molto bene
2) questo è un po' più grave. Io uso un monitor a 19", 1600x1200 a 100Hz di
frequenza. Quando esco dal mio gioco, riporto la risoluzione a 1600x1200, ma
la frequenza di refresh viene impostata a 60Hz.
posso usare DirectX per cambiare risoluzione e basta?
c'è qualche sistema più efficiente?
purtroppo non posso postare alcuna riga di codice, non ho qui i
sorgenti.....scusatemi......
grazie, good coding!!!
-- 
Alletun
Sorry, ask me if you want to get my e-mail!

 la frequenza di refresh viene impostata a 60Hz.
Sicuramente, come ho fatto pure io, hai usato lo stesso codice che si trova
sul sito comune che comunque ha un bug proprio perché sbaglia ad impostare
la frequenza di refresh.
Nel codice che hai scritto, devi impostare anche la frequenza di refresh:
variabile dmDisplayFrequency della struttura DEVMODE.
Ciao!
Esteban

 va molto bene
E' normale. Lo fa anche Win quando cambi la risoluzione manualmente.
bye
-- 
Esistono 10 tipi di persone: chi conosce il binario e chi no.
www.nicolaottomano.it

 Esteban
uhm, ho provato giusto questa mattina, qualche minuto fa.
Ho modificato come segue:
Public Sub ChangeRes(x As Long, Y As Long, Bits As Long)
    Dim DevM As DEVMODE, ScInfo As Long, erg As Long, an As VbMsgBoxResult
    'Get the info into DevM
    erg = EnumDisplaySettings(0&, 0&, DevM)
    'This is what we're going to change
    DevM.dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT Or DM_BITSPERPEL
    DevM.dmPelsWidth = x 'ScreenWidth
    DevM.dmPelsHeight = Y 'ScreenHeight
    DevM.dmBitsPerPel = Bits '(can be 8, 16, 24, 32 or even 4)
    DevM.dmDisplayFrequency = 100
    'Now change the display and check if possible
    erg = ChangeDisplaySettings(DevM, CDS_TEST)
    'Check if succesfull
    Select Case erg&
        Case DISP_CHANGE_RESTART
            'an = MsgBox("You've to reboot", vbYesNo + vbSystemModal,
"Info")
            If an = vbYes Then
                erg& = ExitWindowsEx(EWX_REBOOT, 0&)
            End If
        Case DISP_CHANGE_SUCCESSFUL
            erg = ChangeDisplaySettings(DevM, CDS_UPDATEREGISTRY)
            ScInfo = Y * 2 ^ 16 + x
            'Notify all the windows of the screen resolution change
            SendMessage HWND_BROADCAST, WM_DISPLAYCHANGE, ByVal Bits, ByVal
ScInfo
            'MsgBox "Everything's ok", vbOKOnly + vbSystemModal, "It
worked!"
        Case Else
            'MsgBox "Mode not supported", vbOKOnly + vbSystemModal, "Error"
    End Select
End Sub
cioè ho aggiunto la riga DevM.dmDisplayFrequency = 100, ma non funziona
ancora. Quando torno al desktop, ho sempre 60 Hz come frequenza.
Non solo: in realtà quel 100 fisso è sbagliato. Il mio monitor lo supporta,
ma quello degli altri mica è detto: come faccio a rilevare la frequenza
impostata dall'utente in modo tale da utilizzare quella sia in full-screen,
sia in modalità finestra?
grazie, good coding!!!
-- 
Alletun
"Io lo so che accadrà. La voce sussurra nei miei pensieri
di Jair, Rone, Allanon e soprattutto nelle Mortombre.
Sussurra segreti che mi sono tenuti nascosti, nella grigia
oppressione di questo giorno e nell'oscurità caliginosa
di quello che mi aspetta.
Saremo distrutti. Tutti."
Brin Ohmsford - La Canzone di Shannara - T. Brooks

 sia in modalità finestra?
Prima di passare in FullScreen ti salvi la modalità video attuale, per poi
ripristinarla successivamente:
Const ENUM_CURRENT_SETTINGS = -1
Dim CurDevM As DEVMODE
CurDevM.dmSize = Len(CurDevM)
Call EnumDisplaySettings(vbNullString, ENUM_CURRENT_SETTINGS, CurDevM)
Ciao!
Esteban

 E' normale. Lo fa anche Win quando cambi la risoluzione manualmente.
Si ma ci sono dei programmi che salvano l'impostazione
e la ripristinano tale e quale
Si potrebbe anche salvare l'impostazione da registro e reimportarla dopo
InCtrl5, Version 1.0
http://www.pcmag.com/utilities/
http://common.ziffdavisinternet.com/download/0/1027/inctrl5.zip
ecco cosa cambia con un programma
 12GhostsT WindowsExtensions 
http://12ghosts.com/
che imposta la ris a 1024x768 e poi reimposta a 800x600
mantenendo inalterata la posizione delle icone
(log del ritorno da 1024 a 800)
Values changed: 3
HKEY_CURRENT_CONFIG\Display\Settings "DesktopPos"
Old type: REG_SZ
New type: REG_SZ
Old data: 288,216
New data: 400,300
HKEY_CURRENT_CONFIG\Display\Settings "Resolution"
Old type: REG_SZ
New type: REG_SZ
Old data: 1024,768
New data: 800,600
HKEY_LOCAL_MACHINE\Software\Description\Microsoft\Rpc\UuidPersistentData "LastTimeAllocated"
Old type: REG_BINARY
New type: REG_BINARY
Old data: 00, 89, 18, E4, C5, 48, D8, 01
New data: 20, 8B, CF, 14, C6, 48, D8, 01
--
Fosco

 E' normale. Lo fa anche Win quando cambi la risoluzione manualmente.
Si ma ci sono dei programmi che salvano l'impostazione
