Imgui不显示黑色命令行窗口

上两节课的例子中,我们每次用vs打开项目,都显示了两个窗口,一个是命令行,一个是主窗口。但是我们希望只显示主窗口。

去掉黑色命令行

像上面这样,有两个窗口,一个命令行,一个主窗口,如何关闭命令行。

首先在代码的代码的顶部,头文件的上方,增加

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

如果不增加,后面会报错的。增加后,右键解决方案窗口中的项目名,然后选择属性

然后,在 屬性 (Configuration Properties) -> 连接器 (Linker) -> 系統 (System)

子系統 (SubSystem) 中设置为Windows

然后,再次运行,你会发现,黑色命令行窗口终于不见了。更加像我们的GUI程序了。

但是现在我们的控件都集中在中间这个Control Panel中,如何显示到窗口中呢。

设置控件占满主窗口

我们需要在如下代码

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

改为如下

        // 如下是一些主要设置
        // 强制子窗口铺满整个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)

主要是设置窗口占满GLFW窗口,还有一些其他的设置,目的就是让我们的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)

这里则是出栈,相当于恢复。

完整代码如下:

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

        // 如下是一些主要设置
        // 强制子窗口铺满整个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. 出栈前面的两个入栈PushStyleVar 恢复原来的配置,避免重复
        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窗体了。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注