Esempio n. 1
0
/*
static struct Rectangle   CalDisAreaFromPre_9cell(struct menu_displaypara *pre,struct menu_displaypara  *cur)
{


   struct Rectangle  result={0,0,0,0};//计算的结果
   //内部调用,无需参数检查

   cur->MenuitemSpace=cal_menuitemarea(cur->OperatingMenuitem);
    //根据罗总意见,不论是主菜单还是子菜单都是重新建立一个全页菜单。
    return result;
}
*/
struct Rectangle   CalDisAreaFromPre_9cell(struct menu_displaypara *pre,struct menu_displaypara  *cur)
{

   u32       menuitem_num;//当前菜单有多少个菜单项

   struct Rectangle  result={0,0,0,0};//计算的结果

   u8        number=0;//用于计算第几个窗口弹出的

    s32     limit_end;//可视域边界点
    s32     limit_start;//可视起点
    s32     cal_end;//计算边界
    s32     cal_start;//计算起点

    s32     Midpoint;//中间位置

    u32     length=0;


    //参数检测
    if(NULL==cur)
    {
      printf("Invalid para for cal 9cell space!\n");
      return result;
    }
    if(NULL==cur->FVisualMenuitem)
    {
      printf("Invalid para for cal 9cell space!\n");
      return result;
    }

    cur->MenuitemSpace=cal_menuitemarea(cur->FVisualMenuitem);
    if(NULL==pre)//主菜单
    {
      return  result;//新建页
    }
    else if(NULL==pre->pre)//主菜单弹出子菜单
    {
      return result;//新建页
    }
    else//这个要考虑多种情况,比较复杂
    {

       menuitem_num=CalMenuitemNum(cur->FVisualMenuitem);
       number=CalDisBettween2Menuitem(pre->FVisualMenuitem, pre->OperatingMenuitem);
      //计算水平位置
      limit_start=pre->MenuitemSpace.width+cn_space_margin;
      limit_end=cur->AppWin->absx0+cur->AppWin->right-cur->AppWin->left-pre->CurWin->absx0;
      cal_start=limit_start;//在九宫格中这两者是相同的
      cal_end=cal_start+cur->MenuitemSpace.width+cn_space_margin;
      if(cal_end>limit_end)//水平位置不够,则一票否决
      {
        return result;
      }
      else
      {
         result.left=cal_start;
         result.right=cal_end;
      }
      //计算垂直位置,记得放在中间
      length=(cur->MenuitemSpace.height)*menuitem_num+cn_space_margin;
      limit_start=cur->AppWin->absy0-pre->CurWin->absy0;
      limit_end=limit_start+cur->AppWin->bottom-cur->AppWin->top;
      if(length>(limit_end-limit_start))//空间不富裕,不必考虑中间位置了
      {
         result.top=limit_start;
         result.bottom=limit_end;
         return result;
      }
      else//有富余,考虑中间位置
      {
          Midpoint=pre->MenuitemSpace.height*number+pre->MenuitemSpace.height/2;
          if(((Midpoint-limit_start)>=length/2)&&(limit_end-Midpoint)>=length/2)//两边都满足,可以放在中间
           {
                 result.top=Midpoint-length/2;
                 result.bottom=length+result.top;
           }
          else if((Midpoint-limit_start)<length/2)//上边不够
          {
               result.top=limit_start;
               result.bottom=length+result.top;
          }
          else//下边不够
          {
              result.bottom=limit_end;
              result.top=result.bottom-length;
          }
          return  result;
       }
     }
}
Esempio n. 2
0
// =========================================================================
// 函数功能:为下拉模式分计算显示空间
// 输入参数:pre,前级显示参数,cur当前显示参数
// 输出参数:
// 返回值     :通过计算得到的下拉模式主菜单或者子菜单所需的空间
// 说明          :pre为NULL,则证明是为主菜单分配空间,否则是为子菜单分配空间
//          该显示参数所占用的空间,当然,要依赖前级菜单
//          对于下拉显示模式而言,只有主菜单是横向,其余的都是纵向显示
// =========================================================================
//根据罗总的意见进行了修改
//对于主菜单,依然建立的是铺满整屏的窗口
//对于以及主菜单,建立在当前操作项的正下面(优先),如果位置不够,要向左移动。
//对于二级子菜单及其以后的子菜单,都优先建立在当前菜单的右边,如果右边位置不够,则建立在左边;
struct tagRectangle   CalDisAreaFromPre_pull(struct menu_displaypara *pre,struct menu_displaypara  *cur)
{
   u8        number=0;//用于计算第几个窗口弹出的
   u32                     menuitem_num;//当前菜单有多少个菜单项
   s32     limit_end;//可视域边界点
   s32     limit_start;//可视起点
   s32     cal_end;//计算边界
   s32     cal_start;//计算起点
   s32     Midpoint;//中间位置
   u32     length=0;
   s32    length_left=0;//存储可以划分的显示区域
   s32    length_need=0;//存储需要的显示区域
   struct tagRectangle  result={0,0,0,0};//计算的结果
   struct menu_displaypara  *pMainMenuDispara;//暂时页节点

    //只是内部调用,不再进行参数检测,以提高效率
    cur->MenuitemSpace=cal_menuitemarea(cur->FVisualMenuitem);
    if(NULL==pre)//主菜单
    {
      return  result;//新建一个铺满整屏的窗口
    }
    else//这个要考虑多种情况,比较复杂
    {
       menuitem_num=CalMenuitemNum(cur->FVisualMenuitem);
       number=CalDisBettween2Menuitem(pre->FVisualMenuitem, pre->OperatingMenuitem);
      //计算水平位置
       if(NULL==pre->pre)//前级是水平,即主菜单
       {
          limit_start=(pre->MenuitemSpace.width)*number+cn_space_margin;
          limit_end=pre->CurWin->right-pre->CurWin->left;
          cal_start=limit_start;
          cal_end=cal_start+cur->MenuitemSpace.width+cn_space_margin;
          if(cal_end>limit_end)//水平位置不够,看看能否进行调整
          {
            //右边不够,就向左移动,实在不够那就没有办法了
            if((limit_end)>(cal_end-cal_start))//当前层还可以容纳下
            {
                result.left=limit_end-cur->MenuitemSpace.width-cn_space_margin;
                result.right=limit_end;
            }
            else//容纳不下,一般的是不可能的,除非屏幕足够窄,或者当前菜单层太宽
            {
               result.left=0;
               result.right=limit_end;
            }
          }
          else//水平位置够了
          {
             result.left=cal_start;
             result.right=cal_end;
          }
      }
      else//二级子菜单及其以下,先看右边够不够,够用的话就右边,不够的话就左边,
      {
          length_need=cur->MenuitemSpace.width+cn_space_margin;
          length_left=pre->AppWin->absx0+pre->AppWin->right-pre->AppWin->left-pre->CurWin->right-pre->CurWin->absx0+pre->CurWin->left;
          if(length_need>length_left)//右边不够,
          {
            //看看左边够不够
            length_left=pre->CurWin->absx0-pre->AppWin->absx0;
            length_need=cur->MenuitemSpace.width+cn_space_margin;
            if(length_need>length_left)//左边也不够
            {
              //看看是左边多,还是右边多,哪边多就放哪边
              length_need=pre->AppWin->absx0+pre->AppWin->right-pre->AppWin->left-pre->CurWin->right-pre->CurWin->absx0+pre->CurWin->left;
              if(length_left>length_need)//左边多
              {
                 result.left=-(length_left);
                 result.right=0;
              }
              else//右边多
              {
                 result.left=pre->CurWin->right-pre->CurWin->left;
                 result.right=result.left+length_need;
              }

            }
            else//左边够
            {
                result.right=0;
                result.left=result.right-length_need;
            }
          }
          else//右边够
          {
             result.left=pre->CurWin->right-pre->CurWin->left;
             result.right=result.left+length_need;
          }
      }
      //根据罗总的意见,都是在一页的。top和bottom受主菜单水平显示的限制
      pMainMenuDispara=getmainmenudispara(pre);//获取主菜单
      if(NULL==pMainMenuDispara)
      {
          printf("fata_err_in cal pull space!");
          return result;
      }

      limit_start=pre->AppWin->absy0+pMainMenuDispara->MenuitemSpace.height+cn_space_margin-pre->CurWin->absy0;
      length_need=(cur->MenuitemSpace.height)*menuitem_num+cn_space_margin;
      limit_end=cur->AppWin->absy0+cur->AppWin->bottom-cur->AppWin->top-pre->CurWin->absy0;
      if(NULL==pre->pre)//直接在主菜单下,水平弹出垂直菜单
      {
          if(length_need>(limit_end-limit_start))//考虑空间大小,空间不足,考虑分配整数个。
          {
            result.top=limit_start;
            result.bottom=result.top+((limit_end-limit_start)/(cur->MenuitemSpace.height))*(cur->MenuitemSpace.height)+cn_space_margin;
            return result;
          }
          else
          {
             result.top=limit_start;
             result.bottom=result.top+length_need;
             return result;
          }
      }
      else//垂直弹出垂直菜单
      {
          if(length_need>(limit_end-limit_start))//空间不富裕,不必考虑中间位置了
          {
             result.top=limit_start;
             result.bottom=limit_end;
             return result;
          }
          else//有富余,考虑中间位置
          {
             Midpoint=pre->MenuitemSpace.height*number+pre->MenuitemSpace.height/2;
             if(((Midpoint-limit_start)>=length_need/2)&&(limit_end-Midpoint)>=length_need/2)//两边都满足,可以放在中间
             {
                 result.top=Midpoint-length_need/2;
                 result.bottom=length_need+result.top;
             }
             else if((Midpoint-limit_start)<length_need/2)//上边不够
             {
                 result.top=limit_start;
                 result.bottom=length_need+result.top;
             }
             else//下边不够
             {
                  result.bottom=limit_end;
                  result.top=result.bottom-length_need;
             }
             return  result;
          }
      }
    }
}