Schwarzes Konsolenfenster bei ImGui ausblenden

Bei den Beispielprojekten der letzten beiden Lektionen öffnet Visual Studio beim Ausführen immer zwei Fenster gleichzeitig: ein schwarzes Konsolenfenster und das eigentliche ImGui-GUI-Fenster. In der Praxis benötigen wir nur das grafische Hauptfenster ohne die zusätzliche Kommandozeile.

Schwarzes Konsolenfenster entfernen

Auf dem Screenshot oben ist das Doppelfenster-Problem zu sehen. Im Folgenden erklären wir, wie man das Konsolenfenster komplett deaktiviert.

Fügen Sie zuerst diese Zeile ganz am Anfang der Quellcode-Datei, vor allen Header-Includes ein:

#pragma comment(linker, "/SUBSYSTEM:windows /ENTRY:mainCRTStartup")Code-Sprache: C++ (cpp)

Wenn Sie diese Pragma-Zeile weglassen, treten später Linker-Fehler auf. Klicken Sie nach dem Einfügen im Projektmappen-Explorer mit der rechten Maustaste auf Ihren Projektnamen und wählen Sie Eigenschaften aus.

Navigieren Sie in der Eigenschaftenmaske folgendermaßen: Konfigurationseigenschaften (Configuration Properties)Linker (Linker)System (System)

Setzen Sie das Feld Subsystem (Teilsystem) auf den Wert Windows

Speichern Sie die Einstellungen und starten Sie das Programm neu. Das schwarze Konsolenfenster erscheint nicht mehr, es handelt sich um eine saubere eigenständige GUI-Anwendung.

Momentan befinden sich alle UI-Steuerelemente in einem kleinen schwebenden „Control Panel“-Fenster. Als Nächstes passen wir den Code an, damit dieses Panel das gesamte GLFW-Hauptfenster ausfüllt.

Steuerelemente das gesamte Hauptfenster ausfüllen lassen

Suchen Sie diese Original-Zeile in Ihrer Render-Schleife:

ImGui::Begin("Control Panel");Code-Sprache: PHP (php)

Ersetzen Sie diese einzelne Zeile durch den vollständigen Codeblock unten:

        // Wichtige Einstellungen für Vollbild-Panel
        // ImGui-Panel zwingen, das gesamte GLFW-Fenster auszufüllen
        // 1. Position und Größe jedes Frames mit dem äußeren GLFW-Fenster synchronisieren
        ImGui::SetNextWindowPos(ImVec2(0, 0));
        ImGui::SetNextWindowSize(io.DisplaySize);

        // 2. Alle Dekorationen entfernen: Rahmen, Ziehen, Skalieren, Speichern von Layout-Einstellungen
        ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoDecoration
            | ImGuiWindowFlags_NoMove
            | ImGuiWindowFlags_NoResize
            | ImGuiWindowFlags_NoSavedSettings;

        // 3. Fensterrundungen und Außenrahmen entfernen, damit es bündig am Fensterrand anliegt
        ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
        ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f);

        // 4. Fenster mit Flags erstellen (Titel-Leiste wird ausgeblendet)
        ImGui::Begin("Control Panel", nullptr, window_flags);Code-Sprache: C++ (cpp)

Dieser Codeblock sorgt dafür, dass das ImGui-Panel exakt die Größe des GLFW-Fensters annimmt und überflüssige Verzierungen entfernt werden, um ein randloses Vollbild-GUI zu erzeugen.

Fügen Sie direkt unterhalb von

ImGui::End();Code-Sprache: CSS (css)

folgende Zeile hinzu:

ImGui::PopStyleVar(2);Code-Sprache: CSS (css)

PushStyleVar schreibt temporäre Stiländerungen auf einen Stil-Stack und überschreibt vorläufig die globalen Standardstile.

Wir haben zwei Stilwerte nacheinander auf den Stack gelegt:

ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f);Code-Sprache: CSS (css)

PopStyleVar(2) holt beide Einträge wieder vom Stack zurück und stellt die ursprünglichen globalen Stile wieder her.

Hier ist der vollständige angepasste Main-Code mit allen Änderungen:

#pragma comment(linker, "/SUBSYSTEM:windows /ENTRY:mainCRTStartup")

#include <GLFW/glfw3.h>
#include "imgui.h"
#include "backends/imgui_impl_glfw.h"
#include "backends/imgui_impl_opengl3.h"
#include <cstdio>

int main()
{
    // Initialize GLFW
    if (!glfwInit())
    {
        printf("GLFW initialization failed\n");
        return -1;
    }

    // OpenGL 3.3
    const char* glsl_version = "#version 330";
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    // Create window
    GLFWwindow* window = glfwCreateWindow(1000, 600, "ImGui Minimal Demo (VS2022)", nullptr, nullptr);
    if (!window)
    {
        glfwTerminate();
        return -1;
    }
    glfwMakeContextCurrent(window);
    glfwSwapInterval(1); // VSync enable

    // Initialize ImGui
    IMGUI_CHECKVERSION();
    ImGui::CreateContext();
    ImGuiIO& io = ImGui::GetIO();
    ImGui::StyleColorsDark();

    // Bind GLFW + OpenGL3 backend
    ImGui_ImplGlfw_InitForOpenGL(window, true);
    ImGui_ImplOpenGL3_Init(glsl_version);

    // UI state variables
    float slider_value = 0.5f;
    int click_count = 0;
    bool show_full_demo = false;

    // Main render loop
    while (!glfwWindowShouldClose(window))
    {
        glfwPollEvents();

        // Start new ImGui frame
        ImGui_ImplOpenGL3_NewFrame();
        ImGui_ImplGlfw_NewFrame();
        ImGui::NewFrame();

        // Wichtige Einstellungen für Vollbild-Panel
        // ImGui-Panel zwingen, das gesamte GLFW-Fenster auszufüllen
        // 1. Position und Größe jedes Frames mit dem äußeren GLFW-Fenster synchronisieren
        ImGui::SetNextWindowPos(ImVec2(0, 0));
        ImGui::SetNextWindowSize(io.DisplaySize);

        // 2. Alle Dekorationen entfernen: Rahmen, Ziehen, Skalieren, Speichern von Layout-Einstellungen
        ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoDecoration
            | ImGuiWindowFlags_NoMove
            | ImGuiWindowFlags_NoResize
            | ImGuiWindowFlags_NoSavedSettings;

        // 3. Fensterrundungen und Außenrahmen entfernen, damit es bündig am Fensterrand anliegt
        ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
        ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f);

        // 4. Fenster mit Flags erstellen (Titel-Leiste wird ausgeblendet)
        ImGui::Begin("Control Panel", nullptr, window_flags);

        ImGui::Text("Hello ImGui + VS2022");
        ImGui::SliderFloat("Slider Value", &slider_value, 0.f, 1.f);

        if (ImGui::Button("Click to Count"))
            click_count++;
        ImGui::SameLine();
        ImGui::Text("Click Count: %d", click_count);

        ImGui::Checkbox("Show Full ImGui Demo Window", &show_full_demo);

        ImGui::End();

        // 5. Zwei vorherige Stil-Stack-Einträge wiederherstellen
        ImGui::PopStyleVar(2);
        // Ende des geänderten Bereichs

        if (show_full_demo)
            ImGui::ShowDemoWindow(&show_full_demo);

        // Render ImGui draw data
        ImGui::Render();
        int width, height;
        glfwGetFramebufferSize(window, &width, &height);
        glViewport(0, 0, width, height);
        glClearColor(0.12f, 0.12f, 0.12f, 1.f);
        glClear(GL_COLOR_BUFFER_BIT);
        ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());

        glfwSwapBuffers(window);
    }

    // Cleanup resources
    ImGui_ImplOpenGL3_Shutdown();
    ImGui_ImplGlfw_Shutdown();
    ImGui::DestroyContext();
    glfwDestroyWindow(window);
    glfwTerminate();
    return 0;
}
Code-Sprache: PHP (php)

Wenden Sie alle Änderungen an und starten Sie das Programm neu, das Ergebnis entspricht dem folgenden Screenshot:

Das Aussehen entspricht nun einem üblichen eigenständigen Desktop-GUI-Programm.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert