Beispiel #1
0
// =========================================================================
// 函数功能:根据九格的形式进行显示项的调整
// 输入参数:待调整的显示参数dispara
// 输出参数:
// 返回值    :
// 说明         :将修改显示参数的FVisualMenuitem和LVisualMenuitem,对于主菜单则不会修改,
//          考虑了需要滚屏的情况,尽最大可能的显示更多的菜单项
// =========================================================================
void adjustvisualmenuitem_9cell(struct menu_displaypara  *dispara)
{

     u8            dis_num;//窗口可以显示的菜单项条目
     u8           OperaNumber=0;
     u8           FVisualNumber=0;
     u8           LVisualNumber=0;

     s32           dis_height;//可视域的宽度
     s32           deep_limit;
     s32           deep_cal;

    struct menu_item   *BBmenuitem=NULL,*LBmenuitem=NULL,*tempmenuitem=NULL;
    //参数检查
    if((NULL==dispara)||(NULL==dispara->OperatingMenuitem))
    {
        printf("Invalid parameter----adjustvisualmenuitem_9cell\n");
        return;
    }
    if(NULL==dispara->pre)
    {
    //  printf("No need to adjsutVisualMenuitem for main menuitem!\n");
      dis_num=9;
    }
    else
    {
       deep_cal=dispara->CurWin->absy0+dispara->CurWin->bottom-dispara->CurWin->top;
       deep_limit=dispara->AppWin->absy0+dispara->AppWin->bottom-dispara->AppWin->top;
       if(deep_cal>deep_limit)//有超出的部分
       {
        dis_height=deep_limit-dispara->CurWin->absy0;
       }
       else
       {
        dis_height=deep_cal-dispara->CurWin->absy0;
       }
       if(dis_height==0)
       {
            printf("Menu space is NULL, so do nothing!\n");
            return;
       }
       dis_num=dis_height/(dispara->MenuitemSpace.height);
    }

    BBmenuitem=GetBBmenuitem(dispara->OperatingMenuitem);
    LBmenuitem=GetLBmenuitem(dispara->OperatingMenuitem);
    tempmenuitem=dispara->OperatingMenuitem;
    if(dis_num>=CalMenuitemNum(dispara->OperatingMenuitem))//能够容纳全部;
    {
         dispara->FVisualMenuitem=BBmenuitem;
         dispara->LVisualMenuitem=LBmenuitem;
    }
    else//容纳不了
    {
        //考虑翻页的情况
        FVisualNumber=CalMenuitemNumber(dispara->FVisualMenuitem);
        LVisualNumber=CalMenuitemNumber(dispara->LVisualMenuitem);
        OperaNumber=CalMenuitemNumber(dispara->OperatingMenuitem);
        if(OperaNumber<FVisualNumber)//当前操作项已经转到第一显示项前面,向前翻一页
        {
          if(dispara->OperatingMenuitem==BBmenuitem)//从最未位到达最前面,因为是循环的
          {
            tempmenuitem=dispara->OperatingMenuitem;
            while(dis_num>1) //将LastVisual指针后调
             {
               if(tempmenuitem==LBmenuitem)
                {
                   break;
                }
               tempmenuitem=GetNextMenuitem(tempmenuitem);
               dis_num--;
              }
             dispara->LVisualMenuitem=tempmenuitem;
             dispara->FVisualMenuitem=dispara->OperatingMenuitem;
          }
          else//顺序到达的
          {
            tempmenuitem=dispara->OperatingMenuitem;
            while(dis_num>1) //将SlayerFrist指针前调
             {
               if(tempmenuitem==BBmenuitem)
                {
                   break;
                }
               tempmenuitem=GetPreMenuitem(tempmenuitem);
               dis_num--;
              }
             dispara->FVisualMenuitem=tempmenuitem;
             dispara->LVisualMenuitem=dispara->OperatingMenuitem;
           }
        }
        else if(OperaNumber>LVisualNumber)//当前操作项已经转到最后显示项后面,向后翻一页
        {
          if(dispara->OperatingMenuitem==LBmenuitem)//从最前位到达最后面,因为是循环的
          {
            tempmenuitem=dispara->OperatingMenuitem;
            while(dis_num>1) //将FirstVisual指针后调
             {
               if(tempmenuitem==BBmenuitem)
                {
                   break;
                }
               tempmenuitem=GetPreMenuitem(tempmenuitem);
               dis_num--;
              }
             dispara->FVisualMenuitem=tempmenuitem;
             dispara->LVisualMenuitem=dispara->OperatingMenuitem;
          }
          else//顺序到达的
          {
            tempmenuitem=dispara->OperatingMenuitem;
            while(dis_num>1) //将SlayerFrist指针前调
             {
               if(tempmenuitem==LBmenuitem)
                {
                   break;
                }
               tempmenuitem=GetNextMenuitem(tempmenuitem);
               dis_num--;
              }
             dispara->LVisualMenuitem=tempmenuitem;
             dispara->FVisualMenuitem=dispara->OperatingMenuitem;
           }
        }
        else//没有超出显示页,尽可能的显示多
        {
          if(dis_num<=CalDisBettween2Menuitem(dispara->FVisualMenuitem, dispara->LVisualMenuitem))//在最初始分配的时候会出现
          {
             tempmenuitem=dispara->OperatingMenuitem;
             while(dis_num>1) //将SlayerFrist指针前调
             {
               if(tempmenuitem==BBmenuitem)
               {
                  break;
               }
               tempmenuitem=GetPreMenuitem(tempmenuitem);
               dis_num--;
             }
             dispara->FVisualMenuitem=tempmenuitem;
             tempmenuitem=dispara->OperatingMenuitem;
             while(dis_num>1) //将SlayerLast指针后调
             {
               if(tempmenuitem==LBmenuitem)
               {
                 break;
               }
              tempmenuitem=GetNextMenuitem(tempmenuitem);
               dis_num--;
             }
             dispara->LVisualMenuitem=tempmenuitem;
          }
          else
          {
           //不予改变可视的第一项和最后一项
          }

        }

     }
    //进行调试的信息,看看到底对否
  //  printf("BB_menuitem=%s\n",BBmenuitem->node.name);
 // printf("Fv_menuitem=%s\n",dispara->FVisualMenuitem->node.name);
//  printf("Op_menuitem=%s\n",dispara->OperatingMenuitem->node.name);
//  printf("Lv_menuitem=%s\n",dispara->LVisualMenuitem->node.name);
//  printf("LB_menuitem=%s\n\n",LBmenuitem->node.name);
    return;
}
Beispiel #2
0
// =========================================================================
// 函数功能:根据下拉模进行显示项的调整
// 输入参数:待调整的显示参数dispara
// 输出参数:
// 返回值 :
// 说明   :将修改显示参数的FVisualMenuitem和LVisualMenuitem,对于主菜单则不会修改,
//          考虑了需要滚屏的情况,尽最大可能的显示更多的菜单项
// =========================================================================
void adjustvisualmenuitem_pull(struct menu_displaypara  *dispara)
{

     u8            dis_num;//窗口可以显示的菜单项条目
     u8           OperaNumber=0;
     u8           FVisualNumber=0;
     u8           LVisualNumber=0;
     s32           length_Visual;//可视域的宽度
     s32           length_E;//每条菜单项占用的长度,水平指的是width,垂直指的是height
     struct menu_item   *BBmenuitem=NULL,*LBmenuitem=NULL,*tempmenuitem=NULL;

    //参数检查
    if((NULL==dispara)||(NULL==dispara->OperatingMenuitem))
    {
        printf("Invalid para for Adjust!\n");
        return;
    }
    if(NULL==dispara->pre)//主菜单,横向
    {
        length_Visual=dispara->CurWin->right-dispara->CurWin->left;
    //  deep_limit=dispara->AppWin->absx0+dispara->AppWin->right-dispara->AppWin->left;
        length_E=dispara->MenuitemSpace.width;
    }
    else//子菜单,纵向
    {
        length_Visual=dispara->CurWin->bottom-dispara->CurWin->top;
    //    deep_limit=dispara->AppWin->absy0+dispara->AppWin->bottom-dispara->AppWin->top;
        length_E=dispara->MenuitemSpace.height;
    }
    if(length_E==0)
    {
        printf("Menu space is NULL, so do nothing!\n");
        return;
    }
     dis_num=length_Visual/(length_E);

     BBmenuitem=GetBBmenuitem(dispara->OperatingMenuitem);
     LBmenuitem=GetLBmenuitem(dispara->OperatingMenuitem);
     tempmenuitem=dispara->OperatingMenuitem;
     if(dis_num>=CalMenuitemNum(dispara->OperatingMenuitem))//能够容纳全部;
     {
         dispara->FVisualMenuitem=BBmenuitem;
         dispara->LVisualMenuitem=LBmenuitem;
     }
     else//容纳不了
     {
        //考虑翻页的情况
        FVisualNumber=CalMenuitemNumber(dispara->FVisualMenuitem);
        LVisualNumber=CalMenuitemNumber(dispara->LVisualMenuitem);
        OperaNumber=CalMenuitemNumber(dispara->OperatingMenuitem);
        if(OperaNumber<FVisualNumber)//当前操作项已经转到第一显示项前面,向前翻一页
        {
          if(dispara->OperatingMenuitem==BBmenuitem)//从最未位到达最前面,因为是循环的
          {
            tempmenuitem=dispara->OperatingMenuitem;
            while(dis_num>1) //将LastVisual指针后调
             {
               if(tempmenuitem==LBmenuitem)
                {
                   break;
                }
               tempmenuitem=GetNextMenuitem(tempmenuitem);
               dis_num--;
              }
             dispara->LVisualMenuitem=tempmenuitem;
             dispara->FVisualMenuitem=dispara->OperatingMenuitem;
          }
          else//顺序到达的
          {
            tempmenuitem=dispara->OperatingMenuitem;
            while(dis_num>1) //将SlayerFrist指针前调
             {
               if(tempmenuitem==BBmenuitem)
                {
                   break;
                }
               tempmenuitem=GetPreMenuitem(tempmenuitem);
               dis_num--;
              }
             dispara->FVisualMenuitem=tempmenuitem;
             dispara->LVisualMenuitem=dispara->OperatingMenuitem;
           }
        }
        else if(OperaNumber>LVisualNumber)//当前操作项已经转到最后显示项后面,向后翻一页
        {
          if(dispara->OperatingMenuitem==LBmenuitem)//从最前位到达最后面,因为是循环的
          {
            tempmenuitem=dispara->OperatingMenuitem;
            while(dis_num>1) //将FirstVisual指针后调
             {
               if(tempmenuitem==BBmenuitem)
                {
                   break;
                }
               tempmenuitem=GetPreMenuitem(tempmenuitem);
               dis_num--;
              }
             dispara->FVisualMenuitem=tempmenuitem;
             dispara->LVisualMenuitem=dispara->OperatingMenuitem;
          }
          else//顺序到达的
          {
            tempmenuitem=dispara->OperatingMenuitem;
            while(dis_num>1) //将SlayerFrist指针前调
             {
               if(tempmenuitem==LBmenuitem)
                {
                   break;
                }
               tempmenuitem=GetNextMenuitem(tempmenuitem);
               dis_num--;
              }
             dispara->LVisualMenuitem=tempmenuitem;
             dispara->FVisualMenuitem=dispara->OperatingMenuitem;
           }
        }
        else//没有超出显示页,尽可能的显示多
        {
          if(dis_num<=CalDisBettween2Menuitem(dispara->FVisualMenuitem, dispara->LVisualMenuitem))//在最初始分配的时候会出现
          {
             tempmenuitem=dispara->OperatingMenuitem;
             while(dis_num>1) //将SlayerFrist指针前调
             {
               if(tempmenuitem==BBmenuitem)
               {
                  break;
               }
               tempmenuitem=GetPreMenuitem(tempmenuitem);
               dis_num--;
             }
             dispara->FVisualMenuitem=tempmenuitem;
             tempmenuitem=dispara->OperatingMenuitem;
             while(dis_num>1) //将SlayerLast指针后调
             {
               if(tempmenuitem==LBmenuitem)
               {
                 break;
               }
              tempmenuitem=GetNextMenuitem(tempmenuitem);
               dis_num--;
             }
             dispara->LVisualMenuitem=tempmenuitem;
          }
          else
          {
           //不予改变可视的第一项和最后一项
          }

        }

     }
    //进行调试的信息,进行显示校对,看是否正确。
  //  printf("BB_menuitem=%s\n",BBmenuitem->node.name);
//  printf("Fv_menuitem=%s\n",dispara->FVisualMenuitem->node.name);
//  printf("Op_menuitem=%s\n",dispara->OperatingMenuitem->node.name);
//  printf("Lv_menuitem=%s\n",dispara->LVisualMenuitem->node.name);
//  printf("LB_menuitem=%s\n\n",LBmenuitem->node.name);
    return;
}