九.《Imgui》常用的控件
源码所处位置

普通按钮
ImGui::Button
static int clicked = 0;
if (ImGui::Button("Button"))
clicked++;
if (clicked & 1)
{
ImGui::SameLine();//同一行
ImGui::Text("Thanks for clicking me!");
}
颜色按钮-压栈弹栈的方式设置按钮样式
for (int i = 0; i < 7; i++)
{
if (i > 0)
ImGui::SameLine();
ImGui::PushID(i);
ImGui::PushStyleColor(ImGuiCol_Button, (ImVec4)ImColor::HSV(i / 7.0f, 0.6f, 0.6f));
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, (ImVec4)ImColor::HSV(i / 7.0f, 0.7f, 0.7f));
ImGui::PushStyleColor(ImGuiCol_ButtonActive, (ImVec4)ImColor::HSV(i / 7.0f, 0.8f, 0.8f));
ImGui::Button("Click");
ImGui::PopStyleColor(3);
ImGui::PopID();
}
单选按钮

选择控件改变变量

static int e = 0;
ImGui::RadioButton("radio a", &e, 0); ImGui::SameLine();
ImGui::RadioButton("radio b", &e, 1); ImGui::SameLine();
ImGui::RadioButton("radio c", &e, 2);
箭头按钮改变变量


// Use AlignTextToFramePadding() to align text baseline to the baseline of framed widgets elements
// (otherwise a Text+SameLine+Button sequence will have the text a little too high by default!)
// See 'Demo->Layout->Text Baseline Alignment' for details.
//使用AlignTextToFramePadding()将文本基线与框架小部件元素的基线对齐
//(否则,默认情况下,Text+SameLine+按钮序列的文本将有点太高!)
ImGui::AlignTextToFramePadding();
ImGui::Text("Hold to repeat:");
ImGui::SameLine();
// Arrow buttons with Repeater
IMGUI_DEMO_MARKER("Widgets/Basic/Buttons (Repeating)");
static int counter = 0;
float spacing = ImGui::GetStyle().ItemInnerSpacing.x;
ImGui::PushButtonRepeat(true);//压入设置当前Button状态
//建议还是用ImGui::PushButtonRepeat(true);来设置好 这样每次只要是激活就会返回true
if (ImGui::ArrowButton("##left", ImGuiDir_Left)) { counter--; }
ImGui::SameLine(0.0f, spacing);
if (ImGui::ArrowButton("##right", ImGuiDir_Right)) { counter++; }
ImGui::PopButtonRepeat();//弹出设置当前Button状态
ImGui::SameLine();
ImGui::Text("%d", counter);
ImGui::RadioButton按钮状态
static int e = 0;
ImGui::RadioButton("radio a", &e, 0); ImGui::SameLine();
ImGui::RadioButton("radio b", &e, 1); ImGui::SameLine();
ImGui::RadioButton("radio c", &e, 2);
if (e == 0)
{
//
}
else if (e==1)
{
//
}
else if (e == 2)
{
//
}
ImGui::Button按钮状态
if (ImGui::IsItemActive())
{
counter++;
ImGui::SameLine();
ImGui::Text(u8"激活");
ImGui::SameLine();
ImGui::Text("%d", counter);
}
else if (ImGui::IsItemClicked())
{
//很快 基本是一帧
ImGui::SameLine();
ImGui::Text(u8"被点击");
}
重复按钮状态

1.这是另外一种方法 通过函数判断
2.但是如果是2个按钮就不好判断了
3.建议还是上面用ImGui::PushButtonRepeat(true);来设置好 这样每次只要是激活就会返回true
重复

ImGui::ArrowButton("##left", ImGuiDir_Left);
ImGui::SameLine(0.0f, spacing);
ImGui::ArrowButton("##right", ImGuiDir_Right);
if (ImGui::IsItemActive())//最近一个是否是激活状态
{
counter++;
ImGui::SameLine();
ImGui::Text(u8"激活");
ImGui::SameLine();
ImGui::Text("%d", counter);
}
else if (ImGui::IsItemClicked())
{
//很快 基本是一帧
ImGui::SameLine();
ImGui::Text(u8"被点击");
}
颜色按钮状态
1.注意对于这种循环添加的按钮
2.一定要吧ID设置不一样
颜色按钮的响应

static int index = -1;
for (int i = 0; i < 7; i++)
{
if (i > 0)
ImGui::SameLine();
ImGui::PushID(i);
ImGui::PushStyleColor(ImGuiCol_Button, (ImVec4)ImColor::HSV(i / 7.0f, 0.6f, 0.6f));
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, (ImVec4)ImColor::HSV(i / 7.0f, 0.7f, 0.7f));
ImGui::PushStyleColor(ImGuiCol_ButtonActive, (ImVec4)ImColor::HSV(i / 7.0f, 0.8f, 0.8f));
if (ImGui::Button("Click"))
{
index =i;
}
ImGui::PopStyleColor(3);
ImGui::PopID();
}
ImGui::Text(u8"ColorButton被点击:%d", index);
按钮颜色样式
1.还可以通过全局设置样式
2.这个之前讲过了就不讲了
3.只需要通过下图,所改就可以了
