ImGui 黒いコンソールウィンドウを非表示にする

前回までの2レッスンのサンプルコードをVisual Studioで実行すると、黒いコマンドライン画面とImGuiのGUI画面が2つ同時に起動します。通常のGUIアプリとして使用する場合は、GUIウィンドウだけ表示させたいので、コンソールを消す方法を解説します。

黒いコンソール画面を削除する

上記画像のように実行時に2つのウィンドウが出てしまう状態を修正し、コンソールを完全に起動しないよう設定します。

まずソースコードの一番先頭、全てのインクルード文より上に、以下のリンカ指示行を追加します。

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

この行を記述しないと後のビルド時にリンクエラーが発生します。記述完了後、ソリューションエクスプローラー内のプロジェクト名を右クリックし、「プロパティ」を開きます。

プロパティ画面で階層を開きます:構成プロパティ (Configuration Properties)リンカー (Linker)システム (System)

「サブシステム (SubSystem)」の項目を Windows に変更します

設定を保存し再度実行すると、黒いコンソールウィンドウが起動しなくなり、純粋なGUIアプリケーションとして動作します。

現在はUI部品が「Control Panel」という小さなウィンドウ内に収まっているため、次はこのパネルがGLFW本体のウィンドウ全体を埋めるように調整します。

UI部品をウィンドウ全体に広げる設定

コード内に下記の一行がある箇所を探します。

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

この1行を以下のコードブロックに丸ごと置き換えます。

        // ウィンドウを全面表示するための主要設定
        // 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);Code language: CSS (css)

PushStyleVarは一時的なスタイル設定をスタックに積んでグローバル設定を上書きする命令です。

先ほど2回連続でスタイルを積みました。

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

PopStyleVar(2)で一度に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. 2つ分のスタイルスタックを復元
        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ソフトに近い見た目になります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です