Seite 1 von 1

Display Settings

Verfasst: 20.07.2006 08:53
von Olaf
Hier sind ein paar Prozeduren, mit denen man die aktuellen Bildschirmeinstellungen speichern, abfragen, ändern, überprüfen und zurücksetzen kann.
Das kann z.B. ganz nützlich sein, wenn man sicher stellen will, dass ein Fenster in voller Größe auf dem Bildschirm zu sehen ist.
Beispielsweise könnte ja das Fenster 1024*768 Pixel groß sein, der Bildschirm aber nur 800*600. In diesem Fall könnte dann zuerst die
Größe des Bildschirms ermittelt werden und bei nicht ausreichender Größe angepasst werden.

Code: Alles auswählen

Global OldSettings.DEVMODE,NewSettings.DEVMODE,CurrentSettings.DEVMODE,Checked

Procedure GetOldDisplaySettings()	;Prozedur zum Speichern der alten Displayeinstellungen

	If Checked=#False
		EnumDisplaySettings_(0,-1,@OldSettings.DEVMODE)	;Speichert die aktuellen Einstellungen in OldSettings.DEVMODE
		Checked=#True
		ProcedureReturn #True
	Else
		ProcedureReturn #False
	EndIf

EndProcedure

Procedure ChangeDisplay(NewDepth,NewWidth,NewHeight,NewFrequency)	;Prozedur zum Ändern der aktuellen Displayeinstellungen

	EnumDisplaySettings_(0,-1,@NewSettings.DEVMODE)	;Alte Einstellungen in NewSettings.DEVMODE speichern...
																										;...und neu anpassen:
		NewSettings\dmBitsPerPel				= NewDepth			;Neue Tiefe in Bits pro Pixel
		NewSettings\dmPelsWidth					= NewWidth			;Neue Breite in Pixel
		NewSettings\dmPelsHeight				= NewHeight			;Neue Höhe in Pixel
		NewSettings\dmDisplayFrequency	= NewFrequency	;Neue Bildschirmfrequenz in Hertz

	Changed=ChangeDisplaySettings_(@NewSettings,0)	;Neue Einstellungen übernehmen

	If Changed=#DISP_CHANGE_SUCCESSFUL
		ProcedureReturn #True
	Else
		ProcedureReturn #False
	EndIf

EndProcedure

Procedure VerifyDisplaySettings(QueryDepth,QueryWidth,QueryHeight,QueryFrequency)	;Prozedur die überprüft, ob die "Query"-Werte vorliegen
	
	Protected CurrentSettings.DEVMODE
	
	EnumDisplaySettings_(0,-1,@CurrentSettings.DEVMODE)	;Aktuelle Einstellungen speichern...
	
	QDepth			= CurrentSettings\dmBitsPerPel
	QWidth			= CurrentSettings\dmPelsWidth
	QHeight			= CurrentSettings\dmPelsHeight
	QFrequency	= CurrentSettings\dmDisplayFrequency
	
	If QDepth<>QueryDepth Or QWidth<>QueryWidth Or QHeight<>QueryHeight Or QFrequency<>QueryFrequency	;...und überprüfen...
		Result=#False	;...Die zu überprüfenden Werte liegen nicht vor
	Else
		Result=#True	;...Die zu überprüfenden Werte liegen vor
	EndIf
	
	ProcedureReturn Result
	
EndProcedure

Procedure GetCurrentSettings(*Pointer_to_a_DEVMODE_structured_Variable.DEVMODE)	;Prozedur zum Abfragen der aktuellen Werte
	
	;Beispiel:Aufruf der Prozedur GetCurrentSettings(@MySettings.DEVMODE) speichert die Werte in MySettings.DEVMODE.
	;Einfach mit der Zielvariable mit einem @ davor aufrufen.
	
	EnumDisplaySettings_(0,-1,*Pointer_to_a_DEVMODE_structured_Variable)	;Speichert die aktuellen Einstellungen in CurrentSettings.DEVMODE

EndProcedure

Procedure SetOldDisplaySettings()	;Prozedur zum Wiederherstellen der alten Displayeinstellungen

	If Checked=#True
		Changed=ChangeDisplay(OldSettings\dmBitsPerPel,OldSettings\dmPelsWidth,OldSettings\dmPelsHeight,OldSettings\dmDisplayFrequency)
		ProcedureReturn Changed
	Else
		ProcedureReturn #False
	EndIf

EndProcedure

Hier noch ein Beispielcode, der alle Prozeduren verwendet:

Code: Alles auswählen

;BEISPIELCODE: unter Verwendung aller Procedures

GetOldDisplaySettings()				;Muss am Anfang des Programms stehen

;Beliebiger Programmcode:

GetCurrentSettings(@Settings.DEVMODE)	;aktuelle Werte erhalten...
Debug "Alte Einstellungen:"						;und ausgeben:
Debug "-Bits pro Pixel: "+Str(Settings\dmBitsPerPel)
Debug "-Breite in Pixel: "+Str(Settings\dmPelsWidth)
Debug "-Höhe in Pixel :"+Str(Settings\dmPelsHeight)
Debug "-Frequenz in Hertz:"+Str(Settings\dmDisplayFrequency)

If VerifyDisplaySettings(Settings\dmBitsPerPel,Settings\dmPelsWidth,Settings\dmPelsHeight,Settings\dmDisplayFrequency) ;Muss 1 ergeben, da die zu prüfenden Werte ja gerade vorliegen, ist hier also total überflüssig.

	ChangeDisplay(16,800,600,60)	;Beispiel: 800 X 600 Pixel bei 16 Bits/Pixel und einer Bildwiederholfrequenz von 60 Hz
	GetCurrentSettings(@Settings.DEVMODE)
	Debug "Neue Einstellungen:"
	Debug "-Bits pro Pixel: "+Str(Settings\dmBitsPerPel)
	Debug "-Breite in Pixel: "+Str(Settings\dmPelsWidth)
	Debug "-Höhe in Pixel :"+Str(Settings\dmPelsHeight)
	Debug "-Frequenz in Hertz:"+Str(Settings\dmDisplayFrequency)
	Delay(20000)

EndIf

;Ende des Programms:

SetOldDisplaySettings()				;Hebt am Ende des Programms die Änderungen wieder auf.

Verfasst: 23.07.2006 02:46
von Konne
Sehr cool!