Page 1 sur 1

Changer la résolution d'écran

Publié : sam. 12/nov./2005 16:13
par Gillou
Bonjour, tout le monde

J'ai commencé à faire un code pour modifier la résolution d'écran, mais malheureusement, il n'y a rien qui se passe.

Avez-vous une idée?

;lien pour les constantes dm_* : http://oem.zeno.com/public/?SDK/0_Super ... nts/dm.htm
#CDS_UPDATEREGISTRY =$1
#CDS_TEST =$2
#CDS_FULLSCREEN =$4
#CDS_GLOBAL =$8
#CDS_SET_PRIMARY =$10
#CDS_RESET =$40000000
#CDS_SETRECT =$20000000
#CDS_NORESET =$10000000

#DISP_CHANGE_SUCCESSFUL =0
#DISP_CHANGE_RESTART =1
#DISP_CHANGE_FAILED = -1
#DISP_CHANGE_BADMODE =-2
#DISP_CHANGE_NOTUPDATED =-3
#DISP_CHANGE_BADFLAGS =-4
#DISP_CHANGE_BADPARAM =-5

#DM_BITSPERPEL =$40000
#DM_PELSWIDTH =$80000
#DM_PELSHEIGHT =$100000
#DM_DISPLAYFREQUENCY =$400000

;ExamineDesktops()
;DD = DesktopDepth(0)
;DH = DesktopHeight(0)
;DW = DesktopWidth(0)

Procedure SetResolution(RezX,RezY,NbCoul,Frequence,Memoriser); si SetResolution=2 la résolution est identique à l'actuelle, si 1 erreur lors de la recherche des infos, sinon regarder #DISP_CHANG_...
If EnumDisplaySettings_(0, -1 ,dmEcran.DEVMODE)
If RezX=dmEcran\dmPelsWidth And RezY=dmEcran\dmPelsHeight And NbCoul=dmEcran\dmBitsPerPel And Frequency=dmEcran\dmDisplayFrequency: ProcedureReturn 2: EndIf
dmEcran\dmFields= #DM_PELSWIDTH | #DM_PELSHEIGHT | #DM_BITSPERPEL | #DM_DISPLAYFREQUENCY
dmEcran\dmPelsWidth=RezX
dmEcran\dmPelsHeight=RezY
dmEcran\dmBitsPerPel=NbCoul
dmEcran\dmDisplayFrequency=Frequence
If Memoriser=1:Memoriser=#CDS_UPDATEREGISTRY| #CDS_NORESET : Else :Memoriser=#CDS_TEST| #CDS_NORESET : EndIf
dmx=ChangeDisplaySettings_(dmEcran,Memoriser)
;SendMessage_(65535, 27, 0, 0)
;SendMessage_($FFFF, $7E, NbCoul, RezY * Pow(2,16) + RezX)
ProcedureReturn dmx
Else
ProcedureReturn 1
EndIf
EndProcedure

SetResolution(1920,1200,16,60,1)

Publié : sam. 12/nov./2005 16:55
par Droopy
j'ai trouvé ça sur le forum Allemand

Code : Tout sélectionner

;/ Author : DarkDragon

dmScreenSettings.DEVMODE 
dmScreenSettings\dmSize = SizeOf(dmScreenSettings) 
dmScreenSettings\dmPelsWidth = 1024 ;Bildschirmbreite 
dmScreenSettings\dmPelsHeight = 768 ;Bildschirmhöhe 
dmScreenSettings\dmBitsPerPel = 16 ;Bildschirmtiefe 
dmScreenSettings\dmFields = 262144 | 524288 | 1048576 

ChangeDisplaySettings_(@dmScreenSettings, 4) ;<> 0 ;Wenn etwas schief geht... 

MessageRequester("Changement de résolution","OK pour restaurer mode")

Publié : sam. 12/nov./2005 17:19
par Gillou
Merci Droopy :wink:

Mon code corrigé,


#CDS_UPDATEREGISTRY = $1
#CDS_TEST = $2
#CDS_FULLSCREEN = $4
#CDS_GLOBAL = $8
#CDS_SET_PRIMARY = $10
#CDS_RESET = $40000000
#CDS_SETRECT = $20000000
#CDS_NORESET = $10000000

#DISP_CHANGE_SUCCESSFUL = 0
#DISP_CHANGE_RESTART = 1
#DISP_CHANGE_FAILED = -1
#DISP_CHANGE_BADMODE = -2
#DISP_CHANGE_NOTUPDATED = -3
#DISP_CHANGE_BADFLAGS = -4
#DISP_CHANGE_BADPARAM = -5

#DM_BITSPERPEL = $40000
#DM_PELSWIDTH = $80000
#DM_PELSHEIGHT = $100000
#DM_DISPLAYFREQUENCY = $400000

Procedure SetResolution(RezX, RezY, NbCoul, Frequence, Memoriser) ; si SetResolution=2 la résolution est identique à l'actuelle, si 1 erreur lors de la recherche des infos, sinon regarder #DISP_CHANG_...

dm.DEVMODE
If EnumDisplaySettings_ (0, -1, @dm)
If RezX = dm\dmPelsWidth And RezY = dm\dmPelsHeight And NbCoul = dm\dmBitsPerPel And Frequence=dm\dmDisplayFrequency : ProcedureReturn 2 : EndIf
dmEcran.DEVMODE
dmEcran\dmSize = SizeOf(dmEcran)
dmEcran\dmFields = #DM_PELSWIDTH|#DM_PELSHEIGHT|#DM_BITSPERPEL|#DM_DISPLAYFREQUENCY
dmEcran\dmPelsWidth = RezX
dmEcran\dmPelsHeight = RezY
dmEcran\dmBitsPerPel = NbCoul
dmEcran\dmDisplayFrequency = Frequence
If Memoriser=1 : Memoriser= #CDS_UPDATEREGISTRY Or #CDS_NORESET : Else : Memoriser= #CDS_FULLSCREEN : EndIf
dmx = ChangeDisplaySettings_ (@dmEcran,Memoriser)
ProcedureReturn dmx
Else
ProcedureReturn 1
EndIf
EndProcedure

Debug SetResolution(1920,1200,16,60,1)

Publié : sam. 12/nov./2005 17:47
par Gillou
Tiens Droopy pour enumérer les résolutions standards

Procedure EnumDisplay()
a=1
While a
a=EnumDisplaySettings_(0,b,dmEcran.DEVMODE)
b=b+1
Debug Str (dmEcran\dmPelsWidth)+" x "+ Str (dmEcran\dmPelsHeight)+" x "+ Str (dmEcran\dmBitsPerPel)
Wend
EndProcedure

EnumDisplay()

Publié : sam. 12/nov./2005 19:45
par Droopy
merci, il manquait juste la fréquence 8)

Code : Tout sélectionner

Procedure EnumDisplay() 
  a=1 
  While a 
    a=EnumDisplaySettings_(0,b,dmEcran.DEVMODE) 
    b=b+1 
    Debug Str (dmEcran\dmPelsWidth)+" x "+ Str (dmEcran\dmPelsHeight)+" x "+ Str (dmEcran\dmBitsPerPel) + " @ "+Str(dmEcran\dmDisplayFrequency)
  Wend 
EndProcedure 

EnumDisplay() 

Publié : sam. 12/nov./2005 19:51
par Gillou
Exact, maintenant c'est nickel :wink:

Re: Changer la résolution d'écran

Publié : lun. 11/juil./2016 21:11
par NY152
Comment déclare-t-on dm.DEVMODE ?

J'essais de toujours travailler en EnableExplicit, c'est plus pro, c'est plus propre ^^

Re: Changer la résolution d'écran

Publié : lun. 11/juil./2016 22:27
par falsam
NY152 a écrit :Comment déclare-t-on dm.DEVMODE ?
avec Global ou Protected non ?

je ne sais pas si je comprends bien le sens de ta question. Au cas ou, un petit code pris sur le forum anglophone.

http://forum.purebasic.com/english/view ... 90#p451810

Re: Changer la résolution d'écran

Publié : mar. 12/juil./2016 8:25
par Zorro
voici le code que j'utilise, et qui fonctionne depuis toujours

Code : Tout sélectionner


Declare setresolution(width, height, depth, flag=#cds_fullscreen)



ExamineDesktops()
; recup la resolution actuel
reso_x=DesktopWidth(0) 
reso_y=DesktopHeight(0)

SetResolution(800, 600, 16) ; change la resolution en 800x600 16 bits
Delay(3000)
SetResolution(reso_x, reso_y, 32) ; remet la resolution de depart




Procedure SetResolution(Width, Height, Depth, Flag=#CDS_FULLSCREEN)
	Protected Result, dmScreenSettings.DEVMODE
	dmScreenSettings\dmSize = SizeOf(DEVMODE)
	dmScreenSettings\dmPelsWidth = Width
	dmScreenSettings\dmPelsHeight = Height
	dmScreenSettings\dmBitsPerPel = Depth
	dmScreenSettings\dmFields = #DM_PELSWIDTH | #DM_PELSHEIGHT | #DM_BITSPERPEL
	If ChangeDisplaySettings_(@dmScreenSettings, Flag) = #DISP_CHANGE_SUCCESSFUL
		Result = #True
	EndIf
	ProcedureReturn Result
EndProcedure


@Falsam
falsam a écrit : Au cas ou, un petit code pris sur le forum anglophone.

http://forum.purebasic.com/english/view ... 90#p451810
ton code concerne la capture d'ecran
ici le sujet c'est le changement de resolution de l'ecran ;)