Exemplo n.º 1
0
// =========================================================================
// 函数功能:获取提供菜单项的最小弟菜单
// 输入参数:pMenuitem,提供的菜单项
// 输出参数:
// 返回值    :pMenuitem的最小brother,next的最未端
// 说明          :
// =========================================================================
struct menu_item * GetLBmenuitem(struct menu_item  *menuitem)
{
    struct menu_item   *result=NULL;


    result=GetBBmenuitem(menuitem);
    result=GetPreMenuitem(result);
    return result;
}
Exemplo n.º 2
0
// =========================================================================
// 函数功能:为九格显示参数创建显示参数
// 输入参数:pre,前级显示参数,menuitem,当前显示参数所关联的菜单项,Appwin,应用程序提供的显示窗口
//          注意当pre为空的时候表示的是创建主显示参数,这时候会用到APPWIN和menuitem,否则这两项会从
//          pre中提取
// 输出参数:
// 返回值  :
//需要说明的是:位置前面都计算好了,已经没有啥子好说的了
// =========================================================================
struct menu_displaypara *createmenudisparabypre_9cell(struct menu_displaypara *pre,struct menu_item *menuitem,struct GkWinRsc  *Appwin)
{

  bool_t  result;
  struct menu_displaypara  *cur=NULL;
  struct Rectangle   Disparawin_rec;
 // struct GkWinRsc  *win;
   //简单的根据前一个菜单窗口创建

  if((NULL==pre)&&((NULL==menuitem)||(NULL==Appwin)))
  {
     printf("Not enough  para to create the menudispara,You must be joking!\n");
  }
  cur=mallocdisplaypara();
  if(NULL==cur)
  {
     printf("Not enough mem for CreateParaMenuwinBypre!\n");
     return cur;
  }

  if(NULL==pre)
  {
     // printf("This is the main menu!\n");

      cur->AppWin=Appwin;
      cur->FVisualMenuitem=GetBBmenuitem(menuitem);
      cur->OperatingMenuitem=menuitem;
      cur->LVisualMenuitem=GetPreMenuitem(cur->FVisualMenuitem);

      cur->MyMenuDispalyFunction=NULL;
      cur->MyPeripheralGeneralAction=NULL;
      cur->MyDisplayPeripheralRespond=NULL;
      cur->AdjustVisualMenuitem=NULL;
      cur->CreateMenuDisparaBypre=NULL;
      cur->MyMenuInitFunction=NULL;
  }
  else
  {
      // printf("This is the sub menu!\n");
       cur->AppWin=pre->AppWin;
       cur->FVisualMenuitem=GetSonMenuitem(pre->OperatingMenuitem);
       cur->OperatingMenuitem=cur->FVisualMenuitem;
       cur->LVisualMenuitem=GetPreMenuitem(cur->FVisualMenuitem);
       //初始化一些函数指针
       cur->menukeyboard_action = pre->menukeyboard_action;
       cur->menumousetouch_ction = pre->menumousetouch_ction;
       cur->MyPeripheralGeneralAction = pre->MyPeripheralGeneralAction;

       cur->MyMenuDispalyFunction=pre->MyMenuDispalyFunction;
       cur->MyPeripheralGeneralAction=pre->MyPeripheralGeneralAction;
       cur->MyDisplayPeripheralRespond=pre->MyDisplayPeripheralRespond;
       cur->AdjustVisualMenuitem=pre->AdjustVisualMenuitem;
       cur->CreateMenuDisparaBypre=pre->CreateMenuDisparaBypre;
       cur->MyMenuInitFunction=pre->MyMenuInitFunction;
       //添加到链表中
       adddisplaypara(pre,cur);
    }
  //计算空间
   Disparawin_rec=CalDisAreaFromPre_9cell(pre,cur);
 //创建窗口
   result=create_menudisparawin(cur, Disparawin_rec, cur->FVisualMenuitem->node.name);
   if(!result)
   {
      printf("Failed--- createmenudisparabypre_9cell!\n");
      deldisplaypara(cur);
      cur=NULL;
      return cur;
   }
   return cur;
}
Exemplo n.º 3
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;
}
Exemplo n.º 4
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;
}