setting the screen resolution
Posted: Sun Apr 20, 2008 3:24 pm
How do I change the user's screen resolution in PB?
Jason
Jason
http://www.purebasic.com
https://www.purebasic.fr/english/
Code: Select all
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
SetResolution(800, 600, 16)
Delay(3000)
Code: Select all
#DM_DISPLAYFREQUENCY = $400000
#DM_PELSWIDTH = $80000
#DM_PELSHEIGHT = $100000
#ENUM_CURRENT_SETTINGS=-1
#CDS_TEST=2
#CDS_FULLSCREEN=4
#CDS_RESET=$40000000
#DISP_CHANGE_SUCCESSFUL=0
#SC_MONITORPOWER=$F170
#CDS_NORESET=$10000000
#CDS_UPDATEREGISTRY=$00000001
Global DMsaved.DEVMODE ;Saves The Previous Screen Settings
Global dmScreenSettings.DEVMODE ;Device Mode
Procedure MonitorSetup(Width,Height,BitDepth,Frequency)
Delay(10)
EnumDisplaySettings_(#Null,#ENUM_CURRENT_SETTINGS,DMsaved) ;Save The Current Display State
dmScreenSettings\dmSize=SizeOf(DEVMODE) ;Size Of The Devmode Structure
dmScreenSettings\dmFields=#DM_DISPLAYFREQUENCY | #DM_BITSPERPEL | #DM_PELSWIDTH | #DM_PELSHEIGHT ;bit flags to specify the members of DEVMODE that were initialized
dmScreenSettings\dmdisplayfrequency=Frequency
dmScreenSettings\dmBitsPerPel=BitDepth ;Selected Bits Per Pixel
dmScreenSettings\dmPelsWidth=Width ;Selected Screen Width in pixels
dmScreenSettings\dmPelsHeight=Height ;Selected Screen Height in pixels
;***************************************************************************************
;*Try To Set Selected Mode And Get Results. Note: CDS_FULLSCREEN Gets Rid Of Start Bar
;It is written to the registry for API or other calls that work from the registry.
;It will be set back To original during shutdown.
If ChangeDisplaySettings_(dmScreenSettings,#CDS_RESET | #CDS_UPDATEREGISTRY )<>#DISP_CHANGE_SUCCESSFUL
If MessageBox_(#Null,"The Requested Fullscreen Mode Is Not Supported By"+Chr(10)+"Your Video Card. ","Your App name here.",#MB_OK | #MB_ICONEXCLAMATION)=#IDOK
;Pop Up A Message Box Letting User Know The Program Is Closing
MessageBox_(#Null,"Please check to be sure you monitor settings are set back to normal.","ERROR",#MB_OK | #MB_ICONSTOP)
ProcedureReturn #False
EndIf
EndIf
;***************************************************************************************
;YOU SHOULD CALL ANY SCREEN INIT ROUTINES THAT MAY USE REGISTRY VALUES HERE BEFORE NEXT SECTION
;*Rewrite the users Original Montior Frequency back into the registry. It will be forced back
;*When ever the program reaches the MonitorRestore routine. At least its back in the registry in case of a crash.
;NEXT SECTION WRITES THE ORIGINAL VALUES BACK INTO THE REGISTRY IN CASE YOU APP CRASHES
;***************************************************************************************
If ChangeDisplaySettings_(dmSaved,#CDS_NORESET | #CDS_UPDATEREGISTRY)<>#DISP_CHANGE_SUCCESSFUL
If MessageBox_(#Null,"Cannot write Original settings back to registry!"+Chr(10)+"Your Video Card. ","Your App Name Here",#MB_OK | #MB_ICONEXCLAMATION)=#IDOK
;Pop Up A Message Box Letting User Know The Program Is Closing
MessageBox_(#Null,"Please check to be sure you monitor settings are set back to normal.","ERROR",#MB_OK | #MB_ICONSTOP)
ProcedureReturn #False
EndIf
EndIf
ProcedureReturn #True
EndProcedure
;**************************************************************************************************
Procedure RestoreMonitorSettings()
;EnumDisplaySettings_(#Null,#ENUM_CURRENT_SETTINGS,DMsaved) ;Save The Current Display State
;No error checking, because its restoring the Original settings that were read before changing.
ChangeDisplaySettings_(dmsaved,#CDS_RESET); Set the users frequency back to their preference.
EndProcedure
;**************************************************************************************************
;Note: Vesa 2.0 only requires up To 800x600 @ 60hz. This is the highest resolution And
;frequency that should be set without Querying the device capabilities.
result=MonitorSetup(800,600,32,60)
Delay(5000)
RestoreMonitorSettings()
End