如何使多个具有相同标签或空标签的小部件?标签和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将保留
        节点的打开/关闭状态有所不同。

IMGUI ID 冲突

IMGUI ID 冲突

 

 

相关文章:

  • 2021-12-09
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-09-21
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-08-03
  • 2022-12-23
  • 2021-07-01
相关资源
相似解决方案