OpenGL – Aufräumarbeiten bei Programmende

Damit eine laufende OpenGL-Anwendung ordnungsgemäß beendet werden kann, sind zuvor einige Aufräumarbeiten notwendig. Verantwortlich hierfür ist die Funktion KillOpenGLWindow(). Innerhalb dieser Methode werden nacheinander die folgenden Arbeitsschritte ausgeführt:


Schritt 1: Vollbild-Anwendungen müssen zunächst wieder in den Fenstermodus zurückgeschaltet werden (Zurück zum Windows Desktop).

Schritt 2: Trennung des verwendeten Renderkontexts vom Gerätekontext.

Schritt 3: Löschen des nicht mehr verwendeten Renderkontexts.

Schritt 4: Freigabe des Gerätekontexts.

Schritt 5: Anwendungsfenster zerstören.

Schritt 6: Instanz-Handle der OpenGL-Anwendung löschen


Hier nun der zugehörige Source Code:

void KillOpenGLWindow(void)
{
if(g_FullScreen) // Vollbildanwendung?
{
    ChangeDisplaySettings(NULL,0); // Zurück zum Windows-Desktop
   
ShowCursor(TRUE);              // Mauszeiger wieder darstellen
}

// Falls wir einen gültigen Renderkontext haben
if(g_OpenGLRenderContextHandle)
{
    // Trennung des Renderkontexts vom Gerätekontext:
   
if(!wglMakeCurrent(NULL,NULL))
        Add_To_Log("wglMakeCurrent(NULL,NULL) Failed!");
    else
        Add_To_Log("wglMakeCurrent(NULL,NULL) OK!");

    // Renderkontext löschen:
   
if(!wglDeleteContext(g_OpenGLRenderContextHandle))
        Add_To_Log("Delete Render Context Failed!");
    else
        Add_To_Log("Delete Render Context OK!");

    g_OpenGLRenderContextHandle = NULL;
}

// Gerätekontext freigeben:
if(g_DeviceContextHandle &&
   !ReleaseDC(g_MainWindowHandle, g_DeviceContextHandle))
{
    Add_To_Log("Release Device Context Failed!");
    g_DeviceContextHandle = NULL;
}
else
    Add_To_Log("Release Device Context OK!");

// Anwendungsfenster zerstören:
if(g_MainWindowHandle && !DestroyWindow(g_MainWindowHandle))
{
    Add_To_Log("Could Not Release g_MainWindowHandle!");
    g_MainWindowHandle = NULL;
}
else
    Add_To_Log("Release g_MainWindowHandle OK!");

// Instanz
-Handle der Windows-Anwendung löschen:
if(!UnregisterClass(L"OpenGL", g_ApplicationInstanceHandle))
{
    Add_To_Log("Could Not Unregister Class!");
    g_ApplicationInstanceHandle = NULL;
}
else
    Add_To_Log("Unregister Class OK!");

Add_To_Log("KillOpenGLWindow Successfull!");
}