Newsgroup: it.comp.lang.visual-basic
Titolo: [OT] x Marco Minerva (cambio risoluzione dello schermo)

Ciao Marco, ti ho scritto ma non ho ricevuto risposta, per cui scrivo qui
sul NG anche perché magari qualcuno può aiutarmi.
Scaricando il tuo progetto per cambiare la risoluzione dello schermo, ho
notato che il tuo codice non notifica Windows del cambiamento effettuato.
Cosi' le finestre non vengono ridimensionate conformemente alle nuove
dimensioni dello schermo.
Qualcuno può aiutarmi a risolvere questo prob??
--
Kickaha, Master of MY Universe
E-MAIL: 
IO.Ki...@mclink.it
--------------------------
Moltissima gente confonde le opinioni con i pensieri
         "Herbert V. Prochnow"
Una conclusione è il punto dove sei stanco di pensare
         "Arthur Wright"

Non ho visto il progetto di Marco Minerva, ma non credo sia molto diverso da quello che uso io:
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
       Const CCDEVICENAME = 32
       Const CCFORMNAME = 32
       Const DM_PELSWIDTH = &H80000
       Const DM_PELSHEIGHT = &H100000
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
Dim DevM As DEVMODE
Sub ChangeRes(iWidth As Single, iHeight As Single)
       Dim a As Boolean
       Dim i&
       i = 0
              Do
                     a = EnumDisplaySettings(0&, i&, DevM)
                     i = i + 1
              Loop Until (a = False)
       Dim b&
       DevM.dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT
       DevM.dmPelsWidth = iWidth
       DevM.dmPelsHeight = iHeight
       b = ChangeDisplaySettings(DevM, 0)
End Sub
Es:
Call ChangeRes(800, 600) cambia la risoluzione a 800x600
Call ChangeRes(1024, 768) te la cambia a 1024x768
Il problema che dici tu (e che mi aveva fatto notare a suo tempo anche Bruno Salzano) è che Windows non ridispone bene
le finestre e soprattutto a volte scompare la System Tray Area.
La soluzione a questo problema è sostituire la riga
b = ChangeDisplaySettings(DevM, 0)
con
b = ChangeDisplaySettings(DevM, 1)
(quindi l'"1" al posto dello "0")
Io questa scoperta l'ho fatta per caso (empiricamente), ma Bruno Salzano, consultando l'SDK, ha confermato la mia
intuizione (riporto testualmente una parte di una sua mail, con la spiegazione fornita dallSDK):
dwflags può assumere i seguenti valori:
0 (Zero) - Cambio dinamico di risoluzione (tanto dinamico che la tray
rimane sul fondo dello schermo :-))) )
Private (o Public)Const CDS_UPDATEREGISTRY = &H1 - Aggiorna il registry con
le nuove impostazioni dello schermo, che vengono cambiate in modo non dinamico
Private (o Public)CDS_TEST = &h2 - Prova le nuove impostazioni senza
cambiarle( In tal modo, la funzione ChangeDisplaySettings ritornera' i
valori di controllo, senza che pero' avvenga qualcosa)
Ti consiglio di prendere nota delle costanti che ti ho elencato perche' non
sono presenti nell'API Viewer del VB: io le ho dovute ricavare dall'header
file "WINUSER.H" del Visual C++.
Per quanto riguarda i valori di ritorno della ChangeDisplaySettings, sono i
seguenti:
Const DISP_CHANGE_BADPARAM  = -5 ' Parametri errati (ma va' :-) )
Const DISP_CHANGE_BADFLAGS = -4 ' Flags errati
Const DISP_CHANGE_BADMODE = -2 ' Modo grafico non disponibile
Const DISP_CHANGE_FAILED = -1 ' Il driver del display non riesce a cambiare
risoluzione
Const DISP_CHANGE_SUCCESSFUL = 0 ' tutto ok
Const DISP_CHANGE_RESTART = 1 ' Bisogna riavviare il computer
Spero di esserti stato d'aiuto (anche a nome di Bruno Salzano che ringrazio)....
Ciao,
Moreno
#sirri#@
tin.it
(togliete "#" dall'indirizzo)

Moreno
Ti ringrazio molto del tuo aiuto; tuttavia questo non risolve tutti i miei
problemi! (sigh, arcisigh).
il metodo da te consigliato infatti funziona con tutte le applicazioni
tranne, indovina un po', quelle di mamma M$.. Precisamente ho notato che IE
4.72.3110.5 (ed Outlook Express connesso), ignorano cmpletamente il resizew
dello schermo. Inoltre anche l'IDE di VB sembra non "capire bene" la nuova
risoluzione in quanto, se massimizzato, alla nuova risoluzione risulta
staccato di una decina di pixel dal bordo destro (sempre da quello,
indipendentemente dalla nuova e dalla vecchia risoluzione).
Ho risolto il problema inserendo la seguente riga di codice:
BroadcastSystemMessage &H0, &H0, WM_DISPLAYCHANGE, DM.dmBitsPerPel,
TwoLongInDWORD(DM.dmPelsWidth, DM.dmPelsHeight)
dove DM è una DEVMODE, dmBitsPerPel indica la profondità della nuova
risoluzione, dmPelsWidth e dmPelsHeight la larghezza e l'altezza della nuova
risoluzione. TwoLongInDWORD è una semplice funzione che combina due valori
in una DWORD.
Tuttavia, mentre ora VB SUBISCE e si resaizza (leggi come è scritto) come
voglio io, IE4 e compagnia non vogliono saperne di sottostare ai miei voleri
(la sto prendendo un po' male o_o)
CIAO e grazie dell'aiuto
--
Kickaha, Master of MY Universe
E-MAIL: 
IO.Ki...@mclink.it
--------------------------
Moltissima gente confonde le opinioni con i pensieri
         "Herbert V. Prochnow"
Una conclusione è il punto dove sei stanco di pensare
         "Arthur Wright"
