ImGui 隱藏黑色命令列視窗

在前兩堂課的範例專案中,每次用 Visual Studio 開啟專案執行,都會同時彈出兩個視窗:一個黑色命令列視窗、一個 ImGui 主畫面。實務上我們只需要顯示 GUI 主視窗,不需要額外的命令列。

移除黑色命令列視窗

如上圖所示,執行時會同時出現命令列與主介面兩個視窗,下面教你完整關閉多餘的命令列。

第一步,在程式碼最開頭、所有標頭檔引入語句的上方,加入這一行前置處理指令:

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

如果沒有加入這行程式,後續連結階段會直接報錯。貼好之後,在方案總管內右鍵點擊你的專案名稱,選擇「屬性」。

接著依序展開分頁:組態屬性 (Configuration Properties)連結器 (Linker)系統 (System)

將「子系統 (SubSystem)」欄位設定為 Windows

儲存設定後重新執行專案,黑色命令列視窗就不會再彈出,外觀會變成標準的純 GUI 軟體。

目前所有 UI 控制項都侷限在中間小小的 Control Panel 面板內,接下來調整程式讓面板完整填滿整個主視窗。

設定控制項填滿整個主視窗

找到這一行原始程式碼:

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

替換成下面完整區塊:

        // 全域視窗滿版核心設定
        // 強制 ImGui 面板完整覆蓋 GLFW 底層視窗
        // 1. 每幀同步面板座標與尺寸,對齊外層 GLFW 視窗
        ImGui::SetNextWindowPos(ImVec2(0, 0));
        ImGui::SetNextWindowSize(io.DisplaySize);

        // 2. 移除視窗所有裝飾:邊框、拖曳、縮放、版面設定快取
        ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoDecoration
            | ImGuiWindowFlags_NoMove
            | ImGuiWindowFlags_NoResize
            | ImGuiWindowFlags_NoSavedSettings;

        // 3. 關閉視窗圓角與邊框線條,貼合視窗邊緣不留空隙
        ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
        ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f);

        // 4. 套用旗標建立無邊框滿版面板(標題列會自動隱藏)
        ImGui::Begin("Control Panel", nullptr, window_flags);Code language: C++ (cpp)

這段程式主要作用是讓 ImGui 面板尺寸完全匹配 GLFW 視窗,同時移除多餘裝飾,達到滿版無邊框效果。

接著在

ImGui::End();Code language: CSS (css)

這行程式的下方新增:

ImGui::PopStyleVar(2);Code language: CSS (css)

PushStyleVar 會把臨時修改的樣式推入樣式堆疊,暫時覆蓋全域預設樣式。

前面我們連續推入兩組樣式參數:

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

PopStyleVar(2) 一次彈出兩筆堆疊資料,還原原本全域樣式,避免後續繪圖異常。

完整修改後主程式碼如下:

#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();

        // 全域視窗滿版核心設定
        // 強制 ImGui 面板完整覆蓋 GLFW 底層視窗
        // 1. 每幀同步面板座標與尺寸,對齊外層 GLFW 視窗
        ImGui::SetNextWindowPos(ImVec2(0, 0));
        ImGui::SetNextWindowSize(io.DisplaySize);

        // 2. 移除視窗所有裝飾:邊框、拖曳、縮放、版面設定快取
        ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoDecoration
            | ImGuiWindowFlags_NoMove
            | ImGuiWindowFlags_NoResize
            | ImGuiWindowFlags_NoSavedSettings;

        // 3. 關閉視窗圓角與邊框線條,貼合視窗邊緣不留空隙
        ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
        ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f);

        // 4. 套用旗標建立無邊框滿版面板(標題列會自動隱藏)
        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. 彈出兩組樣式堆疊,還原全域預設樣式
        ImGui::PopStyleVar(2);
        // 修改區段結束

        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 language: PHP (php)

全部修改完成後重新執行專案,介面會變成下圖樣貌:

外觀已經接近一般常見的獨立 GUI 桌面軟體。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *