菜单

桌面集成

相关源文件

本页解释了如何将 Dear ImGui 集成到运行在 Windows、macOS 和 Linux 上的桌面应用程序中。它特别关注桌面环境的平台抽象层和渲染后端设置。有关移动或 Web 集成的信息,请参见移动和 Web 集成页面。

概述

Dear ImGui 的桌面集成需要选择并初始化一个平台后端和一个渲染后端。平台后端处理窗口创建、输入事件和剪贴板操作,而渲染后端将 ImGui 绘制命令转换为图形 API 调用。

来源:examples/imgui_examples.sln1-201

平台与渲染器组合

Dear ImGui 支持多种平台和渲染器后端组合。最常见的配对包括

平台后端支持的渲染器操作系统
Win32DirectX 9/10/11/12, Vulkan, OpenGLWindows
GLFWVulkan, OpenGL, DirectX11Windows, macOS, Linux
SDL2/SDL3Vulkan, OpenGL, DirectX11, SDL_RendererWindows, macOS, Linux
Allegro5Allegro5Windows, 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)

Win32 后端处理 Windows 消息并将其转换为 ImGui 输入事件。

来源:examples/example_win32_directx11/main.cpp64 examples/example_win32_directx11/main.cpp254-255

GLFW

GLFW 是一个跨平台窗口和输入库,可在 Windows、macOS 和 Linux 上运行。

来源:examples/example_glfw_vulkan/main.cpp397

SDL2/SDL3

SDL 是一个跨平台库,旨在提供对音频、键盘、鼠标、操纵杆和图形硬件的低级访问。

来源:examples/example_sdl2_vulkan/main.cpp397 examples/example_sdl2_vulkan/main.cpp449

渲染器后端初始化

渲染后端将 ImGui 绘制命令转换为图形 API 调用。

DirectX 11 示例

来源:examples/example_win32_directx11/main.cpp64

Vulkan 示例

来源: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

处理桌面特定功能

DPI 感知

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_directx9Win32DirectX 9带有传统 DirectX 9 的 Windows
example_win32_directx10Win32DirectX 10带有 DirectX 10 的 Windows
example_win32_directx11Win32DirectX 11带有 DirectX 11 的 Windows
example_win32_directx12Win32DirectX 12带有 DirectX 12 的 Windows
example_win32_vulkanWin32Vulkan带有 Vulkan 的 Windows
example_glfw_opengl3GLFWOpenGL 3带有现代 OpenGL 的跨平台
example_glfw_vulkanGLFWVulkan带有 Vulkan 的跨平台
example_sdl2_opengl3SDL2OpenGL 3带有 SDL2 和 OpenGL 的跨平台
example_sdl2_vulkanSDL2Vulkan带有 SDL2 和 Vulkan 的跨平台
example_sdl3_opengl3SDL3OpenGL 3带有 SDL3 和 OpenGL 的跨平台
example_sdl3_vulkanSDL3Vulkan带有 SDL3 和 Vulkan 的跨平台
example_allegro5Allegro5Allegro5带有 Allegro5 的跨平台

来源:examples/imgui_examples.sln6-40

构建桌面示例

每个示例都附带了常见开发环境的构建文件

  • 用于 Windows 的 Visual Studio 解决方案文件 (.sln)
  • 用于跨平台构建的 CMake 文件
  • 用于命令行构建的示例批处理/脚本文件

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)

DirectX 9 应用程序需要处理设备丢失场景

来源:examples/example_win32_directx9/main.cpp103-114

通过遵循这些集成指南,您可以成功地将 Dear ImGui 集成到运行在 Windows、macOS 或 Linux 上的桌面应用程序中,并使用各种平台和渲染后端。