如何使多个具有相同标签或空标签的小部件?标签和ID堆栈入门.。
ImGui内部需要唯一标识UI元素。
通常不可单击的元素(例如对Text函数的调用)不需要ID。
交互式小部件(例如对Button按钮的调用)需要唯一的ID。
内部使用唯一ID来跟踪活动的窗口小部件,并偶尔将状态与窗口小部件关联。
唯一ID是从多个元素的哈希中隐式构建的,这些哈希标识了UI元素的“路径”。
唯一ID通常是从字符串标签派生的:
Begin("MyWindow");
Button("OK"); // Label = "OK", ID = hash of ("MyWindow", "OK")
End();
Begin("MyOtherWindow");
Button("OK"); // Label = "OK", ID = hash of ("MyOtherWindow", "OK")
End();
如果在同一位置两次拥有相同的ID,则会发生冲突。例如:
Button("OK");
Button("OK"); // ID 冲突! 与任一按钮交互将触发第一个按钮。
如何解决冲突?
1第一种:
传递标签时,您可以选择在字符串本身内指定其他ID信息。
使用“ ##”将补码传递给最终用户看不到的ID。
2.一般的方式
使用PushID()/ PopID()创建范围并操纵ID堆栈,以避免ID冲突
在同一窗口内。 这是在迭代和
以编程方式创建许多UI元素。
您可以将指针,字符串或整数值推入ID堆栈。
请记住,ID是由_everything_串联到ID堆栈中形成的。
在堆栈的每个级别,我们都在ID堆栈的此级别存储用于项目的种子。
Begin("Window");
for (int i = 0; i < 100; i++)
{
PushID(i); // Push i to the id tack
Button("Click"); // Label = "Click", ID = hash of ("Window", i, "Click")
PopID();
}
for (int i = 0; i < 100; i++)
{
MyObject* obj = Objects[i];
PushID(obj);
Button("Click"); // Label = "Click", ID = hash of ("Window", obj pointer, "Click")
PopID();
}
for (int i = 0; i < 100; i++)
{
MyObject* obj = Objects[i];
PushID(obj->Name);
Button("Click"); // Label = "Click", ID = hash of ("Window", obj->Name, "Click")
PopID();
}
End();
3.将多个前缀堆栈到ID堆栈中:
Button("Click"); // Label = "Click", ID = hash of (..., "Click")
PushID("node");
Button("Click"); // Label = "Click", ID = hash of (..., "node", "Click")
PushID(my_ptr);
Button("Click"); // Label = "Click", ID = hash of (..., "node", my_ptr, "Click")
PopID();
PopID();
-树节点通过调用PushID()为您隐式创建一个作用域。
Button("Click"); // Label = "Click", ID = hash of (..., "Click")
if (TreeNode("node")) // <-- this function call will do a PushID() for you (unless instructed not to, with a special flag)
{
Button("Click"); // Label = "Click", ID = hash of (..., "node", "Click")
TreePop();
}
- 使用树时,ID用于保留每个树节点的打开/关闭状态。
可能需要使用字符串,索引或指针作为ID。
例如 当跟随一个可能随时间变化的单个指针时,使用静态字符串作为ID
当目标对象更改时,将保留节点的打开/关闭状态。
例如 显示对象列表时,使用索引或指针作为ID将保留
节点的打开/关闭状态有所不同。