ImGui 简单使用
1 主窗口
🗡️ 创建主窗口
// Create window with graphics context
GLFWwindow* window = glfwCreateWindow(1280, 720, "Tet_Studio", NULL, NULL);
if (window == NULL)
return 1;
glfwMakeContextCurrent(window);
glfwSwapInterval(1); // Enable vsync 开启垂直同步
🗡️ 设置窗口风格
ImGui::StyleColorsClassic();
🗡️ 设置窗口背景颜色
-
这是设置颜色的
ImVec4
// ImVec4: 4D vector used to store clipping rectangles, colors etc. [Compile-time configurable type] struct ImVec4 { float x, y, z, w; constexpr ImVec4() : x(0.0f), y(0.0f), z(0.0f), w(0.0f) { } constexpr ImVec4(float _x, float _y, float _z, float _w) : x(_x), y(_y), z(_z), w(_w) { } };
-
RGB转换为ImVec4
//RGB转化为ImVec4 ImVec4 RGBAtoIV4(int r, int g, int b, int a) { float newr = r / 255; float newg = g / 255; float newb = b / 255; float newa = a; return ImVec4(newr, newg, newb, newa); } ImVec4 clear_color = RGBAtoIV4(115, 115, 151, 1); //RGB
🗡️ 主窗口添加一个菜单
(写在 ImGui::NewFrame
和 ImGui::Render
之间)
-
ImGui::BeginMainMenuBar()
是添加菜单栏, 与ImGui::EndMainMenuBar()
;`成对出现 -
if (ImGui::BeginMenu(u8" 文 件 "))
是添加一个选项, 与ImGui::EndMenu()
;`成对出现 -
再下一层就是
-
if (ImGui::MenuItem("Open File")) {(在里面写代码)}
相当于添加一个按钮 -
或者是添加一个可以展开的按钮:
if (ImGui::BeginMenu(u8"测试3")) { if (ImGui::BeginMenu(u8"测试4")) { if (ImGui::Button(u8"测试成功")) { std::cout << "测试成功" << std::endl; } ImGui::EndMenu(); } ImGui::EndMenu(); }
-
//主窗口添加一个菜单
if (ImGui::BeginMainMenuBar())
{
if (ImGui::BeginMenu("File"))
{
if (ImGui::MenuItem("Open File")) {}
ImGui::EndMenu();
}
if (ImGui::BeginMenu("Edit"))
{
if (ImGui::MenuItem("Undo", "CTRL+Z")) {}
if (ImGui::MenuItem("Redo", "CTRL+Y", false, false)) {} // Disabled item
ImGui::Separator(); //----------------(分隔)
if (ImGui::MenuItem("Cut", "CTRL+X")) {}
if (ImGui::MenuItem("Copy", "CTRL+C")) {}
if (ImGui::MenuItem("Paste", "CTRL+V")) {}
ImGui::EndMenu();
}
ImGui::EndMainMenuBar();
}
2 小窗口
🗡️ 创建第一个ImGui Window
-
把显示窗口的函数放在
ImGui::NewFrame
和ImGui::Render
之间 -
使用一对begin - end创建窗口
if(ImGui::Begin("My First Window")){ //其余东西写在begin和end之间 ImGui::Text("Hello Dear ImGui!"); } ImGui::End();
-
第一个变量是名字, 第二个变量填一个窗口的状态bool(对应右上角的关闭)
ImGui::Begin("Control Panel", &show_control_panel_window);
3 创建一些控件
🗡️ 一行字
ImGui::Text("This is some useful text.");
ImGui::TextWrapped("NB: Cursor & selection are preserved when refocusing last used item in code.");
🗡️ checkbox
第一个参数时名字, 第二个参数是要改变的bool值
ImGui::Checkbox("Console Window", &show_console_window);
🗡️ 按钮
第一个参数给它起一个名字, 第二个参数设置按钮的长宽
bool ImGui::Button(const char* label, const ImVec2& size_arg)
{
return ButtonEx(label, size_arg, ImGuiButtonFlags_None);
}
例:
if (ImGui::Button("Button",ImVec2(100, 50)))
{
//按一下按钮,就运行里面这些东西
}ImGui::SameLine(); //表示下个东西跟这个东西在同一行
注意: 如果 label 同名, 后面的那个按钮会被屏蔽
🗡️ 一些输入的组件
- 输入double等
ImGui::SetNextItemWidth(60); //设置下一个控件的宽度
static double d_edge_length = 9.01;
ImGui::InputDouble("input double", &d_edge_length, 0.01f, 1.0f, "%.8f");
- 输入字符串
static char buf[128] = "../../data/exp_11/bunny";
ImGui::InputText("file path(node to generate mtr)", buf, IM_ARRAYSIZE(buf));
//转型
string test_pre_file = buf;
这个为什么没用引用传值? 测试是能够改变参数的, 这是如何做到的?
🗡️ 折叠组件
if (ImGui::TreeNode("file path"))
{
//这里写折叠组件中的东西
...
//结束
ImGui::TreePop();
}