// ========================================================================= // 函数功能:获取提供菜单项的最小弟菜单 // 输入参数: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; }
// ========================================================================= // 函数功能:为九格显示参数创建显示参数 // 输入参数: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; }
// ========================================================================= // 函数功能:根据九格的形式进行显示项的调整 // 输入参数:待调整的显示参数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; }
// ========================================================================= // 函数功能:根据下拉模进行显示项的调整 // 输入参数:待调整的显示参数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; }