Скрыть чёрное консольное окно в ImGui

В примерах из двух предыдущих уроков при запуске проекта через Visual Studio одновременно открываются два окна: чёрное окно командной строки и основное графическое окно ImGui. В большинстве случаев нам нужно отобразить только графический интерфейс без лишней консоли.

Убрать чёрное консольное окно

На скриншоте выше показана проблема двойного окна. Ниже разберем полную инструкцию для полного отключения консоли.

Сначала добавьте эту строку в самый верх исходного файла, перед всеми подключениями заголовочных файлов:

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

Если пропустить эту директиву, на этапе компоновки появятся ошибки линкера. После добавления строки щёлкните правой кнопкой мыши по названию проекта в окне Обозревателя решений и выберите пункт «Свойства».

Перейдите по дереву настроек: Configuration Properties (Свойства конфигурации)Linker (Линкер)System (Система)

Установите значение поля SubSystem (Подсистема) равным Windows

Сохраните параметры и перезапустите программу — чёрное консольное окно больше не откроется, получится чистое автономное графическое приложение.

Сейчас все элементы интерфейса ограничены небольшим плавающим окном Control Panel. Далее изменим код, чтобы эта панель заполняла всё родительское окно GLFW.

Настроить элементы интерфейса на заполнение всего главного окна

Найдите в цикле отрисовки исходную строку:

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

Функция PushStyleVar сохраняет временные изменения стилей в стек, переопределяя глобальные стандартные стили.

Ранее мы дважды положили значения стилей в стек:

ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f);

PopStyleVar(2) извлекает обе записи из стека за один вызов и восстанавливает исходные глобальные стили.

Полный изменённый код функции main приведён ниже:

#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;
}

Примените все исправления и запустите проект повторно — результат будет выглядеть как на скриншоте ниже:

Полученный интерфейс максимально похож на стандартное настольное графическое приложение.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *