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/zh-hk/n/138571.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
CKGD的頭像CKGD
上一篇 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

發表回復

登錄後才能評論