Sorting 如何在FLTK中对小部件进行排序以使箭头键导航正常工作?

Sorting 如何在FLTK中对小部件进行排序以使箭头键导航正常工作?,sorting,user-interface,widget,focus,fltk,Sorting,User Interface,Widget,Focus,Fltk,FLTK文件说明: 箭头键、tab键和shift+tab键“导航”选择。Left、right、tab或shift+tab移动到层次结构中的下一个或上一个小部件。如果导航似乎不起作用,您可能需要对小部件进行“排序”。如果您有输入字段,这一点很重要,因为FLTK在使用箭头键在输入字段之间移动时使用相同的规则。 我的项目有以下几个特点: 许多小部件,随意创建和删除,这使得跟踪小部件创建顺序变得困难(默认导航基于此工作) 小部件有不同的类型、输入、输出、按钮等 我已经完成了Fl::option(Fl::

FLTK文件说明:

箭头键、tab键和shift+tab键“导航”选择。Left、right、tab或shift+tab移动到层次结构中的下一个或上一个小部件。如果导航似乎不起作用,您可能需要对小部件进行“排序”。如果您有输入字段,这一点很重要,因为FLTK在使用箭头键在输入字段之间移动时使用相同的规则。

我的项目有以下几个特点:

  • 许多小部件,随意创建和删除,这使得跟踪小部件创建顺序变得困难(默认导航基于此工作)
  • 小部件有不同的类型、输入、输出、按钮等
  • 我已经完成了Fl::option(Fl::option\u ARROW\u FOCUS,1)以启用箭头导航,这样箭头导航就不会导致焦点(光标)停留在文本字段中 “对小部件进行排序”是什么意思?如何对小部件进行排序,以便导航直观地工作?这有什么算法吗


    谢谢。

    您可以按如下方式进行排序:

    void User_Group :: SortWidgets()
    {
        Fl_Widget   *pt[TOTAL_WIDGETS], *temp;
        int         i, j, TotalNoOfChild = children();
    
    //----------INITIALIZE TO NULL THE CHILD ARRAY *pt[]----------
        for (i = 0; i < TOTAL_WIDGETS; i++)
        pt[i]= NULL;
    
    //----------COPYING CHILDREN FROM THE GROUP INTO POINTER ARRAY *pt[]----------
        for (i = 0; i < TotalNoOfChild; i++)
        pt[i]= (child(i));
    
    //----------REMOVING CHILDREN FROM CHILDREN FROM THE GROUP----------
        while (children() > 0)
        remove(0);
    
    //----------SORTING CHILD ARRAY *pt[] ACCORDING TO CO-ORDINATES----------
        for (i = 0; i < TotalNoOfChild + 1; i++)
        {
        for (j = i + 1; j < TotalNoOfChild; j++)
        {
            if ((pt[i]->y()) > (pt[j]->y()))
            {
                temp=pt[i];
                pt[i]=pt[j];
                pt[j]=temp;
            }
        }
        }
    
    for (i = 0; i < TotalNoOfChild + 1; i++)
    {
        for (j = i + 1; j < TotalNoOfChild; j++)
        {
            if (((pt[i]->x())>(pt[j]->x())) && ((pt[i]->y()) >= (pt[j]->y())))
            {
                temp=pt[i];
                pt[i]=pt[j];
                pt[j]=temp;
            }
        }
    }
    
    /*
     //----------ALTERNATE SORTING----------
    for (i = 0; i < TotalNoOfChild + 1; i++)
    {
        for (j = i+1; j < TotalNoOfChild; j++)
        {
          if (((pt[i]->y())*1000+(pt[i]->x()))>((pt[j]->y())*1000+(pt[j]->x())))
          {
                temp=pt[i];
                pt[i]=pt[j];
                pt[j]=temp;
          }
        }
    }
    */
    
    //----------RE-ADDING CHILDREN INTO THE GROUP----------
    for (i = 0; i < TotalNoOfChild; i++)
        add(pt[i]);
    
    void User_Group::sortwidges()
    {
    Fl_Widget*pt[总WIDGETS],*temp;
    int i,j,TotalNoOfChild=children();
    //----------初始化为空子数组*pt[]----------
    对于(i=0;i0)
    移除(0);
    //----------根据坐标对子数组*pt[]进行排序----------
    对于(i=0;iy())>(pt[j]>y())
    {
    温度=pt[i];
    pt[i]=pt[j];
    pt[j]=温度;
    }
    }
    }
    对于(i=0;ix())>(pt[j]->x())&((pt[i]->y())>=(pt[j]->y()))
    {
    温度=pt[i];
    pt[i]=pt[j];
    pt[j]=温度;
    }
    }
    }
    /*
    //----------交替分拣----------
    对于(i=0;iy())*1000+(pt[i]->x())>((pt[j]->y())*1000+(pt[j]->x()))
    {
    温度=pt[i];
    pt[i]=pt[j];
    pt[j]=温度;
    }
    }
    }
    */
    //----------将孩子重新添加到组中----------
    对于(i=0;i

    }

    通过排序,他们可能意味着(重新)在组中按特定顺序创建小部件。