Cambiare la risoluzione dello schermo

di il
3 risposte

Cambiare la risoluzione dello schermo

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

Qualcuno ha qualche suggerimento?

Grazie.

3 Risposte

  • Re: Cambiare la risoluzione dello schermo

    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
  • Re: Cambiare la risoluzione dello schermo

    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
  • Re: Cambiare la risoluzione dello schermo

    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