Ocultar la ventana de consola negra en ImGui

En los ejemplos de las dos lecciones anteriores, cada vez que abrimos el proyecto con Visual Studio se muestran dos ventanas: una consola de comandos negra y la ventana gráfica principal. En la mayoría de los casos solo queremos que aparezca la interfaz gráfica sin la consola adicional.

Eliminar la ventana de consola negra

La captura superior muestra el problema de las dos ventanas que queremos solucionar. A continuación veremos cómo desactivar completamente la consola.

Primero, pega esta línea en la parte superior del archivo fuente, antes de todos los archivos de cabecera include:

#pragma comment(linker, "/SUBSYSTEM:windows /ENTRY:mainCRTStartup")Lenguaje del código: C++ (cpp)

Si omites esta línea pragma, obtendrás errores de enlace más adelante. Después de añadirla, haz clic derecho sobre el nombre del proyecto en el Explorador de soluciones y selecciona Propiedades.

Navega por el árbol de propiedades hasta: Propiedades de configuración (Configuration Properties)Enlazador (Linker)Sistema (System)

Establece el campo Subsistema (SubSystem) con el valor Windows

Guarda los ajustes y ejecuta el programa de nuevo: la ventana de consola desaparece, quedando solo una aplicación gráfica independiente y limpia.

Ahora todos nuestros controles de interfaz están encerrados dentro de un pequeño panel flotante llamado Control Panel. El siguiente paso es modificar el código para que este panel ocupe toda la ventana de GLFW.

Hacer que los controles ocupen toda la ventana principal

Localiza esta línea original dentro del bucle de renderizado:

ImGui::Begin("Control Panel");Lenguaje del código: PHP (php)

Sustituye esa única línea por el bloque completo que mostramos a continuación:

        // Ajustes clave para el panel a pantalla completa
        // Forzar que el panel cubra toda la ventana de GLFW
        // 1. Sincronizar posición y tamaño cada frame con la ventana contenedora GLFW
        ImGui::SetNextWindowPos(ImVec2(0, 0));
        ImGui::SetNextWindowSize(io.DisplaySize);

        // 2. Quitar todos los adornos: bordes, arrastre, redimensionado, guardado de diseños
        ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoDecoration
            | ImGuiWindowFlags_NoMove
            | ImGuiWindowFlags_NoResize
            | ImGuiWindowFlags_NoSavedSettings;

        // 3. Eliminar esquinas redondeadas y borde exterior para ajustarse perfectamente al margen
        ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
        ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f);

        // 4. Crear ventana sin barra de título usando las banderas definidas
        ImGui::Begin("Control Panel", nullptr, window_flags);Lenguaje del código: C++ (cpp)

Este fragmento ajusta el tamaño del panel ImGui para coincidir exactamente con la ventana GLFW y elimina los elementos decorativos para conseguir una interfaz sin bordes a pantalla completa.

Después, justo debajo de la línea

ImGui::End();Lenguaje del código: CSS (css)

Añade esta línea:

ImGui::PopStyleVar(2);Lenguaje del código: CSS (css)

PushStyleVar guarda modificaciones temporales de estilo en una pila, sobrescribiendo los estilos globales por defecto.

Antes hemos apilado dos modificaciones de estilo:

ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f);Lenguaje del código: CSS (css)

PopStyleVar(2) retira ambos valores de la pila a la vez, restaurando los estilos originales globales.

Aquí tienes el código main completo con todos los cambios integrados:

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

        // Ajustes clave para el panel a pantalla completa
        // Forzar que el panel cubra toda la ventana de GLFW
        // 1. Sincronizar posición y tamaño cada frame con la ventana contenedora GLFW
        ImGui::SetNextWindowPos(ImVec2(0, 0));
        ImGui::SetNextWindowSize(io.DisplaySize);

        // 2. Quitar todos los adornos: bordes, arrastre, redimensionado, guardado de diseños
        ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoDecoration
            | ImGuiWindowFlags_NoMove
            | ImGuiWindowFlags_NoResize
            | ImGuiWindowFlags_NoSavedSettings;

        // 3. Eliminar esquinas redondeadas y borde exterior para ajustarse perfectamente al margen
        ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
        ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f);

        // 4. Crear ventana sin barra de título usando las banderas definidas
        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. Recuperar los dos estilos guardados en la pila
        ImGui::PopStyleVar(2);
        // Fin de la sección modificada

        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;
}
Lenguaje del código: PHP (php)

Aplica todos los cambios y ejecuta el proyecto otra vez, el resultado será como la captura siguiente:

El resultado es muy similar a una aplicación gráfica de escritorio convencional.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *