|

Einführung in OpenGL - Teil 4 - by Delax
Ich denke mal auf das Thema habt ihr euch schon ein bischen gefreut. Im Vollbildmodus sieht halt alles cooler aus ;) Der Nachteil ist, das der Wechsel in den Vollbildmodus wieder viel Windows API Kram vorraus setzt. Augen zu und durch, ich erkläre es auch so simpel wie möglich.
Als erstes fügen wir eine weiter Boolean-Variable hinzu. Ihr Name ist "fullscreen" und sie dient dazu festzuhalten, welchen Modus wir nutzen wollen. Wenn true dann Vollbild-, sonst Fenstermodus.
Der viel erwähnte "Vollbildmodus" ist eigentlich nichts anderes als ein Fenster mit der Größe des Bildschirms und ohne Rand. So sieht es aus, als würde der ganze Bildschirm gefüllt. Schwierig wird es erst, wenn man versucht in einer beliebigen Auflösung dieses Fenster zu erzeugen.
Nehmen wir einmal an ein User nutzt als Bildschirmauflösung 1024x768 Pixel. Nun wollt ihr aber ein Vollbildfenster mit den Ausmaßen 640x480 öffnen. Bringt nicht viel, da rechts und unten der Desktop noch zu sehen wären. Also müssen wir die Auflösung des Desktops zuvor auf die von uns gewünschte Auflösung bringen.
Windows selbst hat intern eine Liste mit allen Auflösungen, die Windows zur Verfügung stehen. Nicht vergessen, nicht jede Grafikkarte und Monitor machen unbedingt die selben Auflösungen mit. Also gehen wir einfach die Liste der Reihe nach durch. Wenn wir einen Modus finden, der mit unseren Wünschen übereinstimmt, dann wechseln wir in ihn.
Diese Liste kann man sich mit EnumDisplaySettings anzeigen lassen. Den ersten Parameter könnt ihr vergessen. Der zweite ist die Position der Liste. Da wir die Liste durchsehen wollen packen wir den Aufruf in eine Schleife und erhöhen diesen Wert pro Runde. Der dritte Parameter enthält einen Pointer zu einer Struktur, in der die Daten der Auflösung gespeichert werden, die an dieser Position in der Liste steht.
Die Schleife ist eine Repeat/ Until und wird beendet, wenn der in der Struktur stehende Modus mit unseren Angaben von height, width und bits überein stimmt. Falls wir am Ende der Liste ankommen (bzw. 255 Stellen der Liste durchgesehen haben) gibt es wohl den gesuchten Modus auf diesem Computer nicht. In diesem Falle geben wir eine Fehlermeldung aus.
Wenn es dennoch weitergeht wurde wohl ein geeigneter Modus gefunden und mit ChangeDisplaySettings setzen wir ihn. Übrigens, weiter unten folgt noch eine Zeile, die hier nicht mir angegeben ist. Mit ShowCursor(false); verstecken wir den Cursor, der in einem Vollbildmodus eigentlich nichts zu suchen hat.
i := -1;
repeat
inc(i);
EnumDisplaySettings(nil,i,@dmScreenSettings);
if i > 255 then Throw('No Power, chump!');
until (dmScreenSettings.dmPelsWidth = width) and (dmScreenSettings.dmPelsHeight = height)
and (dmScreenSettings.dmBitsPerPel = bits);
ChangeDisplaySettings(@dmScreenSettings,0);
Wenn das Programm beendet und das Fenster wieder zerstört wird dürfen wir nicht vergessen die ursprünglichen Einstellungen wieder herzustellen. Nicht vergessen: wir haben dem User die Desktopeinstellung verstellt. Wenn wir einfach nur beenden würden hätte der User unsere gesetzte Einstellung weiterhin auf dem Bildschirm. Unangenehm.
Glücklicherweise gibt es eine sehr einfache Lösung. Wir verwenden noch einmal ChangeDisplaySettings, aber diesmal mit den Parametern 0. Dies steht für den Modus, der als Standard in der Registry eingetragen ist. Nicht sauber, aber sehr bequem. Ach ja, und den Cursor zeigen wir wieder an.
PROCEDURE Window_DeInit;
begin
wglMakeCurrent( window_hDc, 0 ); // kill Device Context
wglDeleteContext( window_hRC ); // Kill Render Context
ReleaseDC( window_hWnd, window_hDC ); // Release Window
if fullscreen = true then begin
ChangeDisplaySettings(nil,0);
ShowCursor(true);
end;
end;
Fehlt nur noch die Frage, wie wir den Modus setzen wollen. Entweder können wir ihn mit einer Zeile wie fullscreen := true; oder ähnlichem setzen, oder aber wir überlassen dem User die Auswahl. Dazu nutzen wir eine simple MessageBox mit Ja/ Nein-Auswahl.
if MessageBox(0,'Fullscreen Mode?', 'Question!',MB_YESNO OR MB_ICONQUESTION) = IDNO
then fullscreen := false else fullscreen := true;
Und das war's. Viel Windows um nichts. Hier gibts den kompletten Source zu diesem Teil.
Delax/ Sundancer Inc.
[delax@sundancerinc.de]
Back to previous page
|