使用说明:

效果如下

主要源码如下:

#include "imgui.h"
#include "backends/imgui_impl_sdl2.h"
#include "backends/imgui_impl_sdlrenderer2.h"
#include <SDL.h>
#include <iostream>

int main(int argc,char** argv) {
    // SDL 初始化
    if (SDL_Init(SDL_INIT_VIDEO) != 0) {
        std::cerr << "SDL_Init Error: " << SDL_GetError() << std::endl;
        return -1;
    }

    // 创建 SDL2 窗口
    SDL_Window* window = SDL_CreateWindow("ImGui Simple Example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 550, 400, SDL_WINDOW_SHOWN);
    if (!window) {
        std::cerr << "SDL_CreateWindow Error: " << SDL_GetError() << std::endl;
        return -1;
    }

    // 创建 SDL_Renderer
    SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
    if (!renderer) {
        std::cerr << "SDL_CreateRenderer Error: " << SDL_GetError() << std::endl;
        return -1;
    }

    // 设置 ImGui 上下文
    IMGUI_CHECKVERSION();
    ImGui::CreateContext();
    ImGui::StyleColorsDark(); // 使用暗色主题

    // 设置 ImGui 渲染器和平台绑定
    ImGui_ImplSDL2_InitForSDLRenderer(window,renderer);
    ImGui_ImplSDLRenderer2_Init(renderer);

    bool running = true;
    bool show_dialog = false; // 控制对话框显示的变量
    SDL_Event event;

    while (running) {
        // 处理 SDL 事件
        while (SDL_PollEvent(&event)) {
            ImGui_ImplSDL2_ProcessEvent(&event);
            if (event.type == SDL_QUIT) {
                running = false;
            }
        }

        // 获取 SDL 窗口尺寸并设置 ImGui 窗口尺寸
        int window_width, window_height;
        SDL_GetWindowSize(window, &window_width, &window_height);

        // 开始新的 ImGui 帧
        ImGui_ImplSDLRenderer2_NewFrame();
        ImGui_ImplSDL2_NewFrame();
        ImGui::NewFrame();

        // 创建一个铺满窗口的 ImGui 窗口
        ImGui::Begin("Hello, ImGui!", nullptr, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove);
        // 强制设置窗口位置为原点
        ImGui::SetWindowPos(ImVec2(0, 0), ImGuiCond_Always);
        ImGui::SetWindowSize(ImVec2((float)window_width, (float)window_height));
        ImGui::Text("Hello ImGui");

        if (ImGui::Button("Show Dialog")) {
            show_dialog = true;
        }

        if (ImGui::Button("Quit")) {
            running = false;
        }
        ImGui::End();

        // 显示对话框窗口
        if (show_dialog) {
            ImGui::OpenPopup("Dialog");
        }
        if (ImGui::BeginPopupModal("Dialog", NULL, ImGuiWindowFlags_AlwaysAutoResize)) {
            ImGui::Text("This is a simple dialog!");
            if (ImGui::Button("Close")) {
                show_dialog = false;
                ImGui::CloseCurrentPopup();
            }
            ImGui::EndPopup();
        }

        // 渲染 ImGui
        ImGui::Render();
        SDL_RenderClear(renderer);  // 清除渲染器
        ImGui_ImplSDLRenderer2_RenderDrawData(ImGui::GetDrawData(),renderer); // 绘制 ImGui 数据
        SDL_RenderPresent(renderer); // 显示渲染结果
    }

    // 清理
    ImGui_ImplSDLRenderer2_Shutdown();
    ImGui_ImplSDL2_Shutdown();
    ImGui::DestroyContext();

    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();

    return 0;
}