ImGui 검은 명령 프롬프트 창 숨기기

지난 두 수업 예제 코드를 Visual Studio로 실행하면 검은 콘솔 창과 ImGui GUI 창 두 개가 함께 뜹니다. 보통 GUI 프로그램만 사용하려면 콘솔 창을 안 보이게 설정해야 하는데, 방법을 자세히 설명해 드리겠습니다.

검은 콘솔 창 제거하기

위 사진처럼 실행할 때 창이 두 개 나오는 현상을 수정하고 콘솔 창이 아예 실행되지 않도록 설정합니다.

먼저 소스 코드 맨 위쪽, 모든 헤더 include 구문보다 상단에 아래 링커 지시문을 추가하세요.

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

이 코드를 추가하지 않으면 빌드할 때 링크 오류가 발생합니다. 코드 입력이 끝났으면 솔루션 탐색기에서 프로젝트 이름을 우클릭한 뒤 속성을 선택합니다.

속성 창에서 경로를 따라 들어갑니다: 구성 속성 (Configuration Properties)링커 (Linker)시스템 (System)

하위 시스템(SubSystem) 항목을 Windows로 변경합니다.

설정을 저장하고 다시 실행하면 검은 콘솔 창이 뜨지 않고 순수한 GUI 앱으로 동작합니다.

현재 모든 UI 컨트롤이 작은 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 창과 완전히 일치하고 불필요한 장식 요소를 제거해 전체 화면 GUI를 구현할 수 있습니다.

그 다음

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

코드 바로 아래 한 줄을 추가합니다.

ImGui::PopStyleVar(2);

PushStyleVar는 임시 스타일 설정을 스택에 쌓아 전역 기본 스타일을 덮어쓰는 함수입니다.

앞서 스타일을 두 번 연속으로 쌓았습니다.

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

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

모든 수정을 적용한 뒤 다시 실행하면 아래 이미지처럼 표시됩니다.

일반적인 데스크톱 GUI 프로그램과 매우 유사한 모습이 됩니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다