Cambiare la risoluzione dello schermo

di Anonimizzato3665 il
3 risposte
Ho bisogno di cambiare da programma la risoluzione della scheda video (da 1024x768 a 1280x1024, per intenderci).

Qualcuno ha qualche suggerimento?

Grazie.

3 Risposte

  • Ciao,

    Se stai parlando di programmazione win32, il seguente spezzone di codice ti può essere d'aiuto:
    	POINTL pos={0,0};
    	DEVMODE dm;
    	memset(&dm,0,sizeof(DEVMODE));  //Azzeri la struttura
    	dm.dmSize=sizeof(DEVMODE);  //Imposti la classica size
    	dm.dmBitsPerPel=32; //Bit per pixel
    	dm.dmPelsWidth=1280; //width
    	dm.dmPelsHeight=1024; //height
    	dm.dmDisplayFrequency=75; //frequenza
    	dm.dmPosition=pos; //la posizione
    	//abilit i campi necessari
    dm.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT|DM_DISPLAYFREQUENCY|DM_POSITION;
    //E cambi la risoluzione	ChangeDisplaySettings(&dm,CDS_GLOBAL|CDS_UPDATEREGISTRY);
    Ovviamente il codice suppone che i dati passati (soprattutto width,height,bpp e frequenza) siano corretti. La funzione ritorna un LONG con l'esito dell'operazione (che può essere DISP_CHANGE_SUCCESSFUL, DISP_CHANGE_BADDUALVIEW, DISP_CHANGE_BADFLAGS, DISP_CHANGE_BADMODE, DISP_CHANGE_BADPARAM, DISP_CHANGE_FAILED, DISP_CHANGE_NOTUPDATED o DISP_CHANGE_RESTART).

    Per correttezza i valori passati alla funzione dovrebbero sempre provenire da una EnumDisplaySettings(), in modo da essere certi che siano corretti. Se però sai a priori che la risoluzione e la frequenza sono supportate, le puoi usare senza problemi.

    Ciaociao
  • Era esattamente quello che intendevo, grazie.

    Effettivamente funziona solo dando delle impostazioni valide (nello specifico l'unica frequenza di refresh valida era 60Hz, quindi la funzione falliva se specificavo 75). È risolvibile altrettanto velocemente togliendo il flag DM_DISPLAYFREQUENCY, ma non mi è chiarissimo quale frequenza scelga il sistema in questo caso (mi pare mantenga l'attuale, che potrebbe non essere compatibile con la nuova risoluzione).

    Ho provato anche usando la EnumDisplaySettings():
    
    	DEVMODE dm;
    	int mn;
    	BOOL res = TRUE;
    
    	memset(&dm,0,sizeof(DEVMODE));  //Azzeri la struttura
    	dm.dmSize=sizeof(DEVMODE);  //Imposti la classica size
    	for(mn=0 ; res ; ++mn) {
    	  res = EnumDisplaySettings(NULL,mn,&dm);
    	  if(	dm.dmBitsPerPel == 16
    		 && dm.dmPelsWidth >= 1280
    		 && dm.dmPelsHeight >= 1024
    	  ) break;
    
    	}
    	if(res) {
    	  res = (ChangeDisplaySettings(&dm,CDS_GLOBAL|CDS_UPDATEREGISTRY) == DISP_CHANGE_SUCCESSFUL);
    	}
    
    hilbert
  • Ciao,

    Si, non è chiarissimo quale frequenza utilizzi se non viene specificato il flag, presumo che utilizzi la frequenza di default (non tanto quella attuale), in quanto la Enum può ritornare 0 come valore per la frequenza (che indica appunto la frequenza di default, in sostanza dovrebbe essere quella che ti propone automaticamente il sistema quando cambi la risoluzione - generalmente la più bassa possibile).

    Dimenticavo, tra l'altro, che tra i flags dipsonibili per la ChangedisplayMode esiste anche CDS_TEST. Il nome stesso indica che serve a testare se il modo è supportato senza cambiare fisicamente risoluzione.

    Ciaociao
Devi accedere o registrarti per scrivere nel forum
3 risposte