问题起因

演示代码

if (ImGui::Button("Test1")) {
    ::OutputDebugStringA("Btn1 clicked");
}

if (ImGui::Button("Test1")) {
    ::OutputDebugStringA("Btn2 clicked");
}
LabelLabel

在 Demo 中有个 Stack Tool 可以直观地查看栈情况。

解决方案

##
if (ImGui::Button("Test1##id1")) {
    ::OutputDebugStringA("Btn1 clicked");
}

if (ImGui::Button("Test1##id2")) {
    ::OutputDebugStringA("Btn2 clicked");
}
##

方法二:使用 PushID/PopID 方法

ImGui::PushID(0);
if (ImGui::Button("Test1")) {
    ::OutputDebugStringA("Btn1 clicked");
}
ImGui::PopID();

ImGui::PushID(1);
if (ImGui::Button("Test1")) {
    ::OutputDebugStringA("Btn2 clicked");
}
ImGui::PopID();
PushIDPopID

知识点

ButtonInputLabel
mGui::Button("##id")
###Label
sprintf(buf, "My game (%f FPS)###MyGame", fps);
Begin(buf);

这样在栈里的实际ID是"MyGame",而不是整个字符串。

参考