本页解释了如何将 Dear ImGui 集成到运行在 Windows、macOS 和 Linux 上的桌面应用程序中。它特别关注桌面环境的平台抽象层和渲染后端设置。有关移动或 Web 集成的信息,请参见移动和 Web 集成页面。
Dear ImGui 的桌面集成需要选择并初始化一个平台后端和一个渲染后端。平台后端处理窗口创建、输入事件和剪贴板操作,而渲染后端将 ImGui 绘制命令转换为图形 API 调用。
来源:examples/imgui_examples.sln1-201
Dear ImGui 支持多种平台和渲染器后端组合。最常见的配对包括
| 平台后端 | 支持的渲染器 | 操作系统 |
|---|---|---|
| Win32 | DirectX 9/10/11/12, Vulkan, OpenGL | Windows |
| GLFW | Vulkan, OpenGL, DirectX11 | Windows, macOS, Linux |
| SDL2/SDL3 | Vulkan, OpenGL, DirectX11, SDL_Renderer | Windows, macOS, Linux |
| Allegro5 | Allegro5 | Windows, macOS, Linux |
来源:examples/example_win32_directx11/main.cpp1-10 examples/example_glfw_vulkan/main.cpp1-10 examples/example_sdl2_vulkan/main.cpp1-10
为桌面应用程序设置 Dear ImGui 遵循跨平台标准模式
来源:examples/example_win32_directx11/main.cpp30-186 examples/example_glfw_vulkan/main.cpp351-534
每个平台后端都提供初始化函数,用于将 ImGui 连接到原生窗口系统。
Win32 后端处理 Windows 消息并将其转换为 ImGui 输入事件。
来源:examples/example_win32_directx11/main.cpp64 examples/example_win32_directx11/main.cpp254-255
GLFW 是一个跨平台窗口和输入库,可在 Windows、macOS 和 Linux 上运行。
来源:examples/example_glfw_vulkan/main.cpp397
SDL 是一个跨平台库,旨在提供对音频、键盘、鼠标、操纵杆和图形硬件的低级访问。
来源:examples/example_sdl2_vulkan/main.cpp397 examples/example_sdl2_vulkan/main.cpp449
渲染后端将 ImGui 绘制命令转换为图形 API 调用。
来源:examples/example_win32_directx11/main.cpp64
来源:examples/example_glfw_vulkan/main.cpp398-414 examples/example_glfw_vulkan/main.cpp414
帧渲染循环在所有平台和渲染器组合中遵循一致的模式
来源:examples/example_win32_directx11/main.cpp122-124 examples/example_win32_directx11/main.cpp164-168
Windows 应用程序应处理高 DPI 显示
来源:examples/example_win32_directx11/main.cpp34 (在示例中被注释掉)
对于大多数渲染后端,窗口大小调整事件需要特殊处理
来源:examples/example_win32_directx11/main.cpp113-119
ImGui 可以指示何时需要捕获鼠标或键盘输入
来源:examples/example_win32_directx11/main.cpp248-252
关闭应用程序时,应按初始化相反的顺序进行清理
来源:examples/example_win32_directx11/main.cpp177-179
后端系统采用模块化设计,允许您混合搭配平台和渲染器后端
来源:examples/example_win32_directx11/main.cpp10-11 examples/example_glfw_vulkan/main.cpp17-18
Dear ImGui 提供了许多演示桌面集成的示例项目
| 示例 | 平台 | 渲染器 | 描述 |
|---|---|---|---|
| example_win32_directx9 | Win32 | DirectX 9 | 带有传统 DirectX 9 的 Windows |
| example_win32_directx10 | Win32 | DirectX 10 | 带有 DirectX 10 的 Windows |
| example_win32_directx11 | Win32 | DirectX 11 | 带有 DirectX 11 的 Windows |
| example_win32_directx12 | Win32 | DirectX 12 | 带有 DirectX 12 的 Windows |
| example_win32_vulkan | Win32 | Vulkan | 带有 Vulkan 的 Windows |
| example_glfw_opengl3 | GLFW | OpenGL 3 | 带有现代 OpenGL 的跨平台 |
| example_glfw_vulkan | GLFW | Vulkan | 带有 Vulkan 的跨平台 |
| example_sdl2_opengl3 | SDL2 | OpenGL 3 | 带有 SDL2 和 OpenGL 的跨平台 |
| example_sdl2_vulkan | SDL2 | Vulkan | 带有 SDL2 和 Vulkan 的跨平台 |
| example_sdl3_opengl3 | SDL3 | OpenGL 3 | 带有 SDL3 和 OpenGL 的跨平台 |
| example_sdl3_vulkan | SDL3 | Vulkan | 带有 SDL3 和 Vulkan 的跨平台 |
| example_allegro5 | Allegro5 | Allegro5 | 带有 Allegro5 的跨平台 |
来源:examples/imgui_examples.sln6-40
每个示例都附带了常见开发环境的构建文件
Win32 + Vulkan 的示例构建命令
来源:examples/example_win32_vulkan/build_win32.bat2-9
许多渲染后端需要显式处理窗口大小调整事件
来源:examples/example_win32_directx11/main.cpp258-264
在 Windows 上,应用程序应处理交换链遮挡,以防止窗口最小化时 CPU 使用率过高
来源:examples/example_win32_directx11/main.cpp105-110
DirectX 9 应用程序需要处理设备丢失场景
来源:examples/example_win32_directx9/main.cpp103-114
通过遵循这些集成指南,您可以成功地将 Dear ImGui 集成到运行在 Windows、macOS 或 Linux 上的桌面应用程序中,并使用各种平台和渲染后端。