imgui 学习 之一

发布时间 2023-10-10 17:17:56作者: 洛苏

ImGUI又称为Dear ImGui,它是与平台无关的C++轻量级跨平台图形界面库,没有任何第三方依赖,可以将ImGUI的源码直接加到项目中使用,也可以编译成dll, ImGUI使用DX或者OpenGL进行界面渲染,对于画面质量要求较高,例如客户端游戏,4k/8k视频播放时,用ImGUI是很好的选择,当然,你得非常熟悉DirectX或者OpenGL,不然就是宝剑在手,屠龙无力。相对于Qt、MFC、DuiLib、SOUI等,ImGUI的拓展性更好,也更轻量级,当然对于开发者的要求也更高.

imgui 基本控件:

label、text、checkbox、slider

窗体控件:树形控件、图片控件、ComboBox、列表控件、菜单栏等

 

IMGUI的使用步骤如下:

1. 准备相关库和环境:通常使用的库是Dear ImGui,它支持多种编程语言和图形API。

2. 初始化GUI:在游戏或应用程序的初始化阶段,需要创建一个GUI上下文,并配置相关参数,如字体、样式等。

3. 绘制GUI元素:在每一帧更新时,需要调用绘制函数来绘制GUI元素,通常是在游戏的渲染循环中完成。绘制函数会根据用户的输入状态来更新GUI的显示情况。

4. 处理GUI事件:在绘制函数中,需要通过判断用户的输入状态来处理GUI事件,如按钮点击、拖拽等操作。根据事件的类型和位置,执行相应的逻辑操作。

5. 清理资源:在程序结束时,需要释放GUI相关的资源,如删除GUI上下文、销毁绘制函数、释放纹理内存等。

下面是一个简单的使用Dear ImGui库的C++示例代码:

#include <imgui.h>
#include <imgui_impl_opengl3.h>
#include <imgui_impl_glfw.h>

int main()
{
    // 初始化GLFW窗口和OpenGL上下文
    
    // 初始化Dear ImGui
    ImGui::CreateContext();
    ImGuiIO& io = ImGui::GetIO();
    ImGui_ImplGlfw_InitForOpenGL(window, true);
    ImGui_ImplOpenGL3_Init("#version 330 core");
    ImGui::StyleColorsDark();
    
    while (!glfwWindowShouldClose(window))
    {
        // 处理输入事件
        glfwPollEvents();
        
        // 开始新的一帧
        ImGui_ImplOpenGL3_NewFrame();
        ImGui_ImplGlfw_NewFrame();
        ImGui::NewFrame();
        
        // 绘制GUI元素
        ImGui::Begin("Hello, World!");
        ImGui::Text("This is a simple GUI!");
        if (ImGui::Button("Click Me"))
        {
            // 当按钮被点击时执行操作
            // ...
        }
        ImGui::End();
        
        // 渲染GUI
        ImGui::Render();
        int display_w, display_h;
        glfwGetFramebufferSize(window, &display_w, &display_h);
        glViewport(0, 0, display_w, display_h);
        glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);
        ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
        
        // 交换缓冲区
        glfwSwapBuffers(window);
    }
    
    // 清理资源
    ImGui_ImplOpenGL3_Shutdown();
    ImGui_ImplGlfw_Shutdown();
    ImGui::DestroyContext();
    
    // 关闭窗口和释放相关资源
    
    return 0;
}