Dear ImGui 是一个无臃肿的 C++ 图形用户界面库,它采用了即时模式范式。它主要用于创建快速、可移植且易于使用的工具、调试、可视化和内容创作界面,而不是最终用户应用程序。本文档将介绍 Dear ImGui 的核心架构、集成流程和关键概念。
有关具体的集成说明,请参阅 集成指南,有关后端特定的详细信息,请参阅 后端系统。
Dear ImGui 遵循一系列设计原则,使其区别于传统的保留模式 UI 库。
来源: imgui.cpp1-126 docs/README.md20-39
Dear ImGui 在核心功能和后端实现之间进行了清晰的分离。核心库处理 UI 元素的逻辑表示、布局和交互,而后端则负责平台特定的操作和图形渲染。
来源: imgui.h147-307 imgui_internal.h134-185
包含所有 Dear ImGui 状态的中央结构。每个应用程序通常创建一个 ImGuiContext,但为了高级用例也支持多个上下文。
提供各种 UI 元素,如按钮、滑块、文本输入,以及表格和树等更复杂的组件。
处理窗口创建、焦点、堆叠、折叠和滚动。
将 UI 命令转换为渲染图元(顶点缓冲区和绘图命令),这些图元可以通过渲染器后端由任何图形 API 渲染。
管理字体的加载、光栅化和渲染,支持 TTF/OTF 文件和 Unicode。
来源: imgui.h180-201 imgui_internal.h178-182
将 Dear ImGui 集成到应用程序中遵循一个可预测的流程。
典型的集成需要:
初始化:
每帧:
关机:
来源: imgui.cpp274-367
Dear ImGui 需要平台特定和渲染器特定的后端来处理输入和渲染。该库为常见的平台和图形 API 包含许多预制后端。
处理窗口创建、输入事件(鼠标、键盘、游戏手柄)、剪贴板操作、计时和操作系统特定功能。
常见的平台后端
将 Dear ImGui 的绘图命令转换为 API 特定的渲染命令。
常见的渲染器后端
来源: imgui.cpp274-367 examples/README.txt1-10
Dear ImGui 中最重要的数据结构包括:
| 结构 | 描述 |
|---|---|
ImGuiContext | 包含所有 ImGui 状态的主上下文 |
ImGuiIO | 输入/输出配置和状态 |
ImGuiPlatformIO | 平台特定函数和状态 |
ImGuiWindow | 单个窗口状态和数据 |
ImDrawList | 渲染命令集合 |
ImDrawData | 传递给渲染器的最终渲染数据 |
ImGuiStyle | 颜色、大小和视觉设置 |
ImFontAtlas | 字体纹理和字形数据 |
来源: imgui.h162-201 imgui_internal.h145-184
使用 Dear ImGui 创建简单的 UI 非常直接。
来源: imgui.cpp274-367 docs/README.md40-92
Dear ImGui 提供了许多用于构建工具和 UI 元素的功能。
来源: imgui_demo.cpp1-123 imgui_widgets.cpp1-34
Dear ImGui 使用基于堆栈的 ID 系统来唯一标识 UI 元素。理解此系统对于正确管理 UI 状态和交互至关重要。
创建唯一 ID 的常用方法
Button("Label")PushID("ID"); Button("Same Label"); PopID();PushID(ptr); Button("Button"); PopID();PushID(42); Button("Button"); PopID();来源: imgui.cpp90-100 docs/FAQ.md26-27
Dear ImGui 提供了一个快速、轻量且易于集成的解决方案,用于创建图形界面,特别适合开发者工具、调试、可视化和内容创作。与传统的保留模式 GUI 库相比,其即时模式范式提供了一种不同的方法,优先考虑简洁性、性能和直接的代码到 UI 映射。
有关更详细的信息,请浏览此 wiki 的其他部分、官方文档以及 imgui_demo.cpp 中详尽的演示代码。