ImGui从入门到精通

一、ImGui简介

ImGui是一种用于创建用户界面的C ++库。它具有极低的性能开销,因此可用于需要GUI的游戏、应用程序和工具。

ImGui库由Ocornut维护,已在GitHub上开源。

ImGui的主要特点:

1、ImGui非常快速,这使得在实时应用程序中使用它成为了一个很好的选择,比如游戏开发。

2、使用ImGui的代码量很小,易于理解,不需要太多的抽象概念。

3、ImGui与任何可编译的C ++框架(比如SDL、OpenGL、DirectX)兼容。

二、ImGui的基本用法

在您的代码中使用ImGui主要包含三个步骤:

1、在应用程序初始化时,调用初始化函数ImGut::CreateContext()创建一个上下文。

ImGui::CreateContext();

2、在每一帧的开始时,开始绘制ImGui UI:

ImGui::NewFrame();

3、使用ImGui函数来创建UI元素,例如Button、ProgressBar或者Slider:

ImGui::Begin("Hello, world!");
ImGui::Text("This is some text.");
ImGui::End();

三、ImGui的基本元素

1、窗口(Window)

打开一个基本窗口:

ImGui::Begin("My Window");
ImGui::Text("Hello, I am a window.");
ImGui::End();

2、文本(Text)

ImGui::Text("Bold text");
ImGui::TextColored(ImVec4(1,1,0,1), "Important stuff");
ImGui::TextDisabled("Disabled text");
ImGui::TextWrapped("This text will automatically wrap on the edge of the window.");

3、按钮(Button)

ImGui::Button("Click me");
if (ImGui::Button("Click me too"))
    do_something();

4、输入框(Input)

static char str0[128] = "hello world";
ImGui::InputText("string", str0, IM_ARRAYSIZE(str0));

5、滑条条目(Slider)

ImGui::SliderFloat("float", &f, 0.0f, 1.0f);

四、ImGui高级元素

1、图表(Chart)

ImGui::PlotLines函数用于绘制一系列的数据点到一个图表上,数据点只需要传入一个包含x和y坐标的向量。

static float values[90] = {};
ImGui::PlotLines("Line Graph", values, IM_ARRAYSIZE(values));

2、拖拽条(Drag)

ImGui::DragFloat("Draggable Float", &f, 0.005f);
ImGui::DragInt("Draggable Int", &i, 1);

3、颜色选择器(ColorPicker)

ImGui::ColorEdit3("My Color", color);

4、列表框(ListBox)

static const char* items[] = { "Item 1", "Item 2", "Item 3" };
static int item_current = 0;
ImGui::ListBox("listbox", &item_current, items, IM_ARRAYSIZE(items));

五、ImGui样式

ImGui允许您根据您的喜好来改变UI外观。您可以使用ImGui::GetStyle()访问当前的样式设置。您可以使用ImGui风格和ImGui中的元素进行交互,例如以下样式设置将改变按钮、颜色选择器和输入框的外观:

ImGuiStyle& style = ImGui::GetStyle();
style.Colors[ImGuiCol_Button] = ImVec4(0.40f, 0.20f, 0.05f, 1.00f);
style.Colors[ImGuiCol_ButtonHovered] = ImVec4(0.50f, 0.30f, 0.05f, 1.00f);
style.Colors[ImGuiCol_ButtonActive] = ImVec4(0.60f, 0.35f, 0.05f, 1.00f);

style.Colors[ImGuiCol_FrameBg] = ImVec4(0.80f, 0.20f, 0.05f, 1.00f);

style.Colors[ImGuiCol_Header] = ImVec4(0.40f, 0.20f, 0.05f, 1.00f);
style.Colors[ImGuiCol_HeaderHovered] = ImVec4(0.50f, 0.30f, 0.05f, 1.00f);
style.Colors[ImGuiCol_HeaderActive] = ImVec4(0.60f, 0.35f, 0.05f, 1.00f);

style.Colors[ImGuiCol_SliderGrab] = ImVec4(0.80f, 0.20f, 0.05f, 1.00f);

style.Colors[ImGuiCol_Text] = ImVec4(1.00f, 1.00f, 1.00f, 1.00f);
style.Colors[ImGuiCol_TextSelectedBg] = ImVec4(0.50f, 0.30f, 0.05f, 1.00f);

六、完整代码示例

下面的示例代码将演示创建一个简单的ImGui UI:

#include "imgui.h"
#include "imgui_impl_sdl.h"
#include "imgui_impl_opengl3.h"

#define IMGUI_IMPL_OPENGL_LOADER_GLAD
#include   
#include 
#include 

int main()
{
  SDL_Init(SDL_INIT_VIDEO);

  SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG); 
  SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
  SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
  SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);

  SDL_Window *window = SDL_CreateWindow("ImGui SDL+OpenGL3 example", 
    SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, 
    SDL_WINDOW_OPENGL|SDL_WINDOW_RESIZABLE);

  SDL_GLContext gl_context = SDL_GL_CreateContext(window);

  if (!gladLoadGLLoader((GLADloadproc)SDL_GL_GetProcAddress)) {
    printf("Failed to initialize OpenGL context\n");
    return -1;
  }       

  IMGUI_CHECKVERSION();
  ImGui::CreateContext();
  ImGuiIO& io = ImGui::GetIO(); (void)io;
  ImGui::StyleColorsDark();
  ImGui_ImplSDL2_InitForOpenGL(window, gl_context);
  ImGui_ImplOpenGL3_Init("#version 150");

  bool show_demo_window = true;

  while (!done) {
    SDL_Event event;
    while (SDL_PollEvent(&event)) {
      ImGui_ImplSDL2_ProcessEvent(&event);

      if (event.type == SDL_QUIT) {
        done = true;
      }
    }

    ImGui_ImplOpenGL3_NewFrame();
    ImGui_ImplSDL2_NewFrame(window);
    ImGui::NewFrame();

    if (show_demo_window) {
      ImGui::ShowDemoWindow(&show_demo_window);
    }

    ImGui::Render();
    SDL_GL_MakeCurrent(window, gl_context);
    glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y);
    glClearColor(clear_color.x, clear_color.y, clear_color.z, clear_color.w);
    glClear(GL_COLOR_BUFFER_BIT);
    ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
    SDL_GL_SwapWindow(window);
  }

  ImGui_ImplOpenGL3_Shutdown();
  ImGui_ImplSDL2_Shutdown();
  ImGui::DestroyContext();
  
  SDL_GL_DeleteContext(gl_context);
  SDL_DestroyWindow(window);
  SDL_Quit();

  return 0;
}

原创文章,作者:CKGD,如若转载,请注明出处:https://www.506064.com/n/138571.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
CKGDCKGD
上一篇 2024-10-04 00:21
下一篇 2024-10-04 00:21

相关推荐

  • Python wordcloud入门指南

    如何在Python中使用wordcloud库生成文字云? 一、安装和导入wordcloud库 在使用wordcloud前,需要保证库已经安装并导入: !pip install wo…

    编程 2025-04-29
  • Python小波分解入门指南

    本文将介绍Python小波分解的概念、基本原理和实现方法,帮助初学者掌握相关技能。 一、小波变换概述 小波分解是一种广泛应用于数字信号处理和图像处理的方法,可以将信号分解成多个具有…

    编程 2025-04-29
  • Python竖线图:从入门到精通

    Python竖线图,即Python的绘图工具matplotlib中的一种图形类型,具有直观、易于理解的特点,适用于各种数据分析和可视化场景。本文从初学者角度出发,介绍Python竖…

    编程 2025-04-29
  • Python爬取数据指南-从入门到精通

    Python爬虫是指用Python编写程序,自动化地获取网络上的信息,并进行处理、分析和存储。以下是Python爬取数据的指南,从入门到精通。 一、获取网页数据 Python爬虫的…

    编程 2025-04-29
  • Python自学多久能入门?

    Python是一门极具优势的编程语言,无论在人工智能、数据分析、Web开发等领域都有广泛的应用,所以越来越多的人开始学习Python。但是对于初学者来说,Python自学多久能入门…

    编程 2025-04-28
  • Python导出微信群聊天记录:从入门到实践

    微信群聊是我们日常生活中与家人、朋友聊天交流的重要平台。但是,当备份和查看微信群聊的聊天记录时,我们常常会遇到各种问题。这时,我们可以使用Python对微信群聊天记录进行导出、备份…

    编程 2025-04-28
  • Python熵权法入门指南

    本文将为你介绍Python熵权法的基础知识以及如何在实际应用中使用熵权法,让你能够更好地理解该算法并将其运用到实际工作中。 一、什么是Python熵权法? Python熵权法是一种…

    编程 2025-04-28
  • 西瓜创客python课程:从入门到精通

    本文将对西瓜创客python课程进行详细阐述。旨在为初学者提供一个从入门到精通的学习路径,并为已经有一定基础的人提供更深入的学习体验。 一、为什么选择西瓜创客python课程 西瓜…

    编程 2025-04-28
  • Python爬虫商品评论入门指南

    如何使用Python爬取商品评论信息?这是一个有趣的问题。本文将从多个方面详细讲解Python爬虫实现商品评论信息的抓取,包括:选择合适的爬虫工具、构建爬虫流程、模拟网页请求以及数…

    编程 2025-04-28
  • CTP程序化交易入门系列

    本文将从多个方面详细阐述CTP程序化交易入门系列,包括行情获取、交易指令下达等。 一、行情获取 在进行程序化交易前,需要获取实时的行情信息。CTP提供了多种获取行情的渠道,包括: …

    编程 2025-04-28

发表回复

登录后才能评论