ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Dear ImGui 快速上手:给 C++ 项目十分钟加一个即时模式 GUI

Dear ImGui 快速上手:给 C++ 项目十分钟加一个即时模式 GUI Dear ImGui 快速上手给 C 项目十分钟加一个即时模式 GUI【免费下载链接】imguiDear ImGui: Bloat-free Graphical User interface for C with minimal dependencies项目地址: https://gitcode.com/GitHub_Trending/im/imgui给渲染器、物理引擎或调试器加参数面板时Qt 和 WinForms 太重控件树、事件回调、链接一堆库只为拖一个滑块。Dear ImGui 用另一种思路解决即时模式 GUI每帧重绘、不缓存控件状态的绘制方式每帧你直接描述界面长什么样它就画出来。核心只有六个 C 文件依赖近乎为零。它和传统 GUI 框架有什么不同传统框架把界面当一套持久对象你new一个按钮框架替你记住它的位置和点击状态。Dear ImGui 把界面当一段代码每帧都从零画一遍像逐帧重画动画。保留模式Qt / WinForms即时模式Dear ImGui状态所有权框架管理控件树你的变量UI 只是投影控件生命周期创建后长期存在每帧重建退出作用域即消失事件处理回调 / 信号槽函数返回值if (Button())代价是每帧都遍历 UI 代码但工具界面里这点开销可以忽略换来的是所见即所码——界面上有什么当前帧的代码就画了什么没有藏在控件树里的暗状态。最小依赖跑通GLFW OpenGL3 骨架后端只选一种组合GLFW创建窗口和接收输入 OpenGL3实际渲染。除这两个库外不需要任何别的东西。初始化分两阶段——平台后端和渲染后端各注册一次// 初始化窗口 → ImGui 上下文 → 平台/渲染后端 glfwInit(); GLFWwindow* win glfwCreateWindow(1280, 720, ImGui, nullptr, nullptr); glfwMakeContextCurrent(win); IMGUI_CHECKVERSION(); // 编译期版本一致性检查 ImGui::CreateContext(); ImGui::StyleColorsDark(); ImGui_ImplGlfw_InitForOpenGL(win, true); ImGui_ImplOpenGL3_Init(#version 130); // 你的 GLSL 版本主循环每帧固定三步// 主循环新帧 → 构建 UI → 渲染 while (!glfwWindowShouldClose(win)) { glfwPollEvents(); ImGui_ImplOpenGL3_NewFrame(); ImGui_ImplGlfw_NewFrame(); ImGui::NewFrame(); ImGui::Text(Hello, Dear ImGui!); // 你的界面描述 ImGui::Render(); ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); glfwSwapBuffers(win); }把 imgui.cpp 和五个 .cpp 核心文件、backends/ 下对应后端的两个文件一起编译g 加 -lglfw -lGL 即可窗口就会弹出来。三个最上手的场景游戏开发者写调试面板——运行时调参数不用改代码重启ImGui::SliderFloat(重力, gravity, 0.0f, 20.0f); ImGui::SliderFloat(跳跃高度, jump, 0.0f, 10.0f); ImGui::Checkbox(启用物理, physics);引擎/工具开发者做数据可视化——实时曲线、直方图开箱即用static float hist[90] {0}; static int off 0; hist[off] sinf((float)(ImGui::GetTime() * 2.0)); off (off 1) % IM_ARRAYSIZE(hist); ImGui::PlotLines(正弦波, hist, IM_ARRAYSIZE(hist), off, 振幅, -1.0f, 1.0f);任何人做快速原型——树形视图几行代码比搭 WebView 快得多if (ImGui::TreeNode(场景)) { ImGui::Text(对象数: %d, count); ImGui::TreePop(); }你可能踩的坑你以为Button()返回的是按钮状态实际上它是本帧被点击这个瞬时事件。所以写在if里而不是存下来轮询。你以为输入框需要手动同步值实际上控件直接绑定变量。InputText(名字, buf, sizeof(buf))改完就写回去了没有回调。你以为窗口位置会自动记住实际上位置存在你传的ImGuiWindowFlags之外、窗口的flags旁那个隐藏参数里——想让位置跨帧保持用ImGui::Begin(..., nullptr, 0)时把窗口状态指针留空即可Begin 的第五个参数缺省就会自动管理。你以为中文默认能显示实际上内置字体只含 Latin 字符。需要加载 TTF 并指定中日韩字形范围见 docs/FAQ.md 的 non-Latin characters 一节。你以为它是生产 UI 框架实际上它定位是工具/调试界面。没有焦点系统、没有 a11y、按钮没有悬停动画之外的动效别用它做玩家可见的产品界面。下一步往哪走imgui_demo.cpp所有控件用法的完整演示第一次跑起来后在菜单 Examples → Demo Window 打开读它就是读文档。backends/imgui_impl_glfw.cpp只有两百多行看懂后端胶水层在窗口和渲染器之间干了什么再换别的后端就是套模板。docs/CHANGELOG.txtAPI 稳定性的实际参考升级版本前扫一眼就知道哪些东西动了。核心约一万八千行代码加上选定的后端就能跑起来。打开手头任意一个 C 项目加一个调试窗口试试。【免费下载链接】imguiDear ImGui: Bloat-free Graphical User interface for C with minimal dependencies项目地址: https://gitcode.com/GitHub_Trending/im/imgui创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表