Dear ImGui学习:不要为组件设置相同的标签
作者:互联网
问题起因
演示代码
if (ImGui::Button("Test1")) {
::OutputDebugStringA("Btn1 clicked");
}
if (ImGui::Button("Test1")) {
::OutputDebugStringA("Btn2 clicked");
}
点击第二个按钮是没有效果的,谷歌了一番后找到了原因,因为 Dear ImGui 有一个栈机制。
在内部 Dear ImGui 需要靠唯一的ID来追踪组件,而 Dear ImGui 默认将组件的Label
参数当作是唯一ID,所以当有相同的Label
时就产生了冲突。
在 Demo 中有个 Stack Tool 可以直观地查看栈情况。
解决方案
方法一:用##
来标记唯一ID
if (ImGui::Button("Test1##id1")) {
::OutputDebugStringA("Btn1 clicked");
}
if (ImGui::Button("Test1##id2")) {
::OutputDebugStringA("Btn2 clicked");
}
##
后面的字符串不会显示在组件上,这样就保证了栈里的ID是唯一的。
方法二:使用 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();
PushID
和PopID
成对使用,参数可以是数字,也可以是字符串,要保证唯一性。
知识点
- 只有可交互式的组件才需要ID,比如
Button
、Input
等等。 - 不同窗口之间的相同ID不会冲突。
- 如果需要一个空
Label
就必须设置一个ID。
mGui::Button("##id")
- 使用
###
来禁止将Label
部分纳入为ID。
sprintf(buf, "My game (%f FPS)###MyGame", fps);
Begin(buf);
这样在栈里的实际ID是"MyGame",而不是整个字符串。
参考
Buttons with identical labels do not work
About the ID Stack system
标签:Test1,ImGui,clicked,Button,组件,Dear,OutputDebugStringA,ID 来源: https://www.cnblogs.com/cyds/p/16246612.html