
Dear ImGui(以下简称ImGui)是一个为C++设计的无膨胀图形用户界面库,具有最小依赖性。它输出优化的顶点缓冲区,可以在任何启用了3D管道的应用中随时渲染。该库旨在实现快速迭代,赋能程序员创建内容创建工具、可视化工具和调试工具,而不是针对平均终端用户的UI。它缺乏如完全国际化(右到左文本、双向文本、文本整形等)和可访问性功能,重点放在简洁性和生产力上。它特别适合集成到游戏引擎、实时3D应用、全屏应用、嵌入式应用或控制台平台,其中操作系统功能是非标准的。
ImGui的核心理念是即时模式(Immediate Mode),这意味着UI是在每一帧中动态生成的,而不是保留模式(Retained Mode)那样维持UI状态树。这使得它超级适合于动态数据和快速原型开发。该库由Omar Cornut开发,并由社区维护,已被许多游戏行业的主要参与者广泛使用,包括Unity、Unreal Engine等工具的内部开发。
ImGui的仓库位于
https://github.com/ocornut/imgui,包含主分支和docking分支,后者添加了对停靠和多视口的支持。库的核心文件是平台无关的,只需几个文件即可集成到现有项目中,无需特定的构建过程。仓库还包括backends文件夹用于后端支持、examples文件夹用于示例应用,以及misc文件夹用于额外工具如调试器支持。
作为一名资深C++开发者,我在使用ImGui时发现它极大地简化了工具开发的流程。无需复杂的UI框架,只需几行代码即可创建交互界面。这使得它在原型设计和调试中脱颖而出。ImGui的版本管理也很灵活,用户可以选择稳定版本或最新特性分支。
此外,ImGui支持多种语言绑定,但核心是C++。它不依赖任何外部库,如STL(虽然可以与std::string集成),这使得它在嵌入式环境中也很友善。库的大小小,编译快,适合大型项目。
ImGui具有以下关键特点,使其在C++ GUI库中独树一帜:
ImGui不适合构建高度样式化的消费者UI,由于它缺少高级主题化,但对于工具和调试UI,它是完美的选择。其哲学是“简单就是美”,避免特征膨胀。






更多案例参考仓库的issue。
ImGui的模块可以分为核心模块、后端模块、示例模块和扩展模块。以下是详细分类。
核心模块是ImGui的基础,位于根目录的文件中。这些模块处理UI的创建、布局和交互。
后端模块位于backends/文件夹,提供平台和渲染集成。
后端初始化一般包括Init()、NewFrame()、RenderDrawData()、Shutdown()。
examples/文件夹包含23个独立示例应用,展示不同后端集成。
每个示例有main.cpp,展示完整主循环。
扩展是第三方插件,增强ImGui功能。从wiki Useful Extensions:
这些模块需单独下载并集成。
ImGui在各种场景中闪耀,尤其在需要快速UI的领域。
从FAQ,ImGui用于AAA游戏、研究工具,证明其 versatility。
以下详细示例,嵌入代码。
初始化上下文:
#include <imgui.h>
#include <imgui_impl_glfw.h>
#include <imgui_impl_opengl3.h>
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO();
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad;
ImGui::StyleColorsDark();
ImGui_ImplGlfw_InitForOpenGL(window, true);
ImGui_ImplOpenGL3_Init("#version 330");主循环:
while (!glfwWindowShouldClose(window)) {
glfwPollEvents();
ImGui_ImplOpenGL3_NewFrame();
ImGui_ImplGlfw_NewFrame();
ImGui::NewFrame();
// UI代码
ImGui::Render();
glClear(GL_COLOR_BUFFER_BIT);
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
glfwSwapBuffers(window);
}清理:
ImGui_ImplOpenGL3_Shutdown();
ImGui_ImplGlfw_Shutdown();
ImGui::DestroyContext();基本窗口:
bool open = true;
ImGui::Begin("Example Window", &open);
ImGui::Text("This is some text.");
ImGui::End();带菜单:
ImGui::Begin("Tool", nullptr, ImGuiWindowFlags_MenuBar);
if (ImGui::BeginMenuBar()) {
if (ImGui::BeginMenu("Edit")) {
ImGui::MenuItem("Cut");
ImGui::EndMenu();
}
ImGui::EndMenuBar();
}
ImGui::End();文本和按钮:
ImGui::Text("Value: %f", value);
if (ImGui::Button("Click me")) {
value += 1.0f;
}滑块和输入:
float slider_value = 0.0f;
ImGui::SliderFloat("Slider", &slider_value, 0.0f, 100.0f, "%.1f");
char text_buf[128] = "";
ImGui::InputText("Input", text_buf, sizeof(text_buf));颜色和复选:
float color[3] = {0.0f, 1.0f, 0.0f};
ImGui::ColorEdit3("Color", color);
bool checked = false;
ImGui::Checkbox("Enable", &checked);列:
ImGui::Begin("Columns");
ImGui::Columns(2, "cols");
ImGui::Text("Left");
ImGui::NextColumn();
ImGui::Text("Right");
ImGui::Columns(1);
ImGui::End();树和标签:
if (ImGui::TreeNode("Node")) {
ImGui::Text("Child");
ImGui::TreePop();
}
if (ImGui::BeginTabBar("Tabs")) {
if (ImGui::BeginTabItem("One")) {
ImGui::Text("Tab One");
ImGui::EndTabItem();
}
ImGui::EndTabBar();
}自定义线条:
ImDrawList* draw_list = ImGui::GetBackgroundDrawList();
draw_list->AddRectFilled(ImVec2(10, 10), ImVec2(100, 100), IM_COL32(255, 255, 0, 255));DirectX11渲染:
ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData());ImPlot绘图:
#include <implot.h>
if (ImPlot::BeginPlot("Line Plot")) {
ImPlot::PlotLine("Data", x_data, y_data, data_size);
ImPlot::EndPlot();
}ImNodes节点:
#include <imnodes.h>
ImNodes::BeginNodeEditor();
ImNodes::BeginNode(0);
ImGui::Text("Node 0");
ImNodes::EndNode();
ImNodes::EndNodeEditor();内存编辑:
#include <imgui_memory_editor.h>
MemoryEditor editor;
editor.DrawWindow("Mem Edit", mem_data, sizeof(mem_data));输入捕获:
if (ImGui::GetIO().WantCaptureKeyboard) {
// 忽略应用键盘输入
}字体加载:
io.Fonts->AddFontFromFileTTF("arial.ttf", 14.0f, nullptr, io.Fonts->GetGlyphRangesChineseFull());
io.Fonts->Build();std::string输入:
#include <imgui_stdlib.h>
std::string name;
ImGui::InputText("Name", &name);ID管理:
ImGui::PushID(0);
ImGui::Button("Button 0");
ImGui::PopID();调试窗口:
ImGui::ShowMetricsWindow();这些示例覆盖了主要功能,可直接复制到项目中测试。
ImGui以其简洁高效改变了C++ GUI开发。通过本指南,您可以全面了解其介绍、特点、模块、场景和示例。开始您的ImGui之旅吧!