⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 menutop.c

📁 本代码包为本人的一篇文章<一个占用内存极少的菜单系统的实现>在在PC上的测试移植代码。 ------------------------------ Menu_Src目录为Menu的源
💻 C
📖 第 1 页 / 共 2 页
字号:
    if (Item >= Where) {//未跨越零点
        Menu_j = Item -Where;
    } else {            //跨越零点
        Menu_j = ItemNum  - (Where - Item);
    }

    //显示全部的子菜单项
    for (Menu_i = 0; Menu_i < DispMin; Menu_i++) {
        if (Menu_j == Item){ //反显第Item项,位置是Where
            BarDisp(*(DispItem+Item),BarXOffset,Where*BarYSize+BarYOffset,1);
        } else {             //其它项 正常显示
            BarDisp(*(DispItem+Menu_j),BarXOffset,Menu_i*BarYSize+BarYOffset,0);
        }
        if (Menu_j == (ItemNum-1)) {//到了最后一项,回环到最开始的一项
            Menu_j = 0;
        } else {                    //下一项
            Menu_j++;
        }
    }
#if 0
            Menu_j = Item;
            Menu_i = 0;
            //项是 Item 位置 0
            BarDisp(*(DispItem+Menu_j),BarXOffset,Menu_i*BarYSize+BarYOffset,1);
            if (Menu_j == (ItemNum-1)) {   //维护Menu_j
                Menu_j=0;
            } else {
                Menu_j++;
            }
            //显示其他项
            for (Menu_i = 1; Menu_i < DispMax; Menu_i++) {
                BarDisp(*(DispItem+Menu_j),BarXOffset,Menu_i*BarYSize+BarYOffset,0);
                if (Menu_j == (ItemNum-1)) {
                    Menu_j=0;
                } else {
                    Menu_j++;
                }
            }
            Where = 0;//当前位置依然在开头的0位置
#endif            
        } else {//单屏能显示完全部菜单项,"顶部 上移"应当跳转到底部(或者什么都不做)
            //当仅仅只有一项的时候,应当一直在Where=0的地方反显的!!!这里也能实现,因为最后是反显的函数
            Where = ItemNum-1;
            //取消顶部的原有的反显  项ItemBack  位置0
            BarDisp(*(DispItem+ItemBack),BarXOffset,0*BarYSize+BarYOffset,0);
            //反显根部  项Item  位置ItemNum-1
            BarDisp(*(DispItem+Item),BarXOffset,Where*BarYSize+BarYOffset,1);//反显
        }
#ifdef RockBack
    }
#else
    }else{
        Item = ItemBack;//Restore
    }

#endif

    Bar(Item,ItemNum,125,120);                  //维护滚动条
    Jump2Menu(SelfMenuIndex,FlashMode_NoAction);
}
//Bar项菜单向右按键的行为
//维护Bar显示
void BarMenuRight(void)
{
    U8 Menu_i;          //计数变量 在菜单函数中用到
    U8 Menu_j;          //计数变量
    U8 ItemBack;
    ItemBack = Item;
//---维护Item
    if (Item == (ItemNum-1)) {
        Item = 0;
    } else {
        Item++;
    }
//------------
//---维护显示
    if (Where != (DispMin-1)) {//当前位置不为最末,两次反显


#ifdef LessCPUUseage
        /*
        如果是使用">"这样的符号标志当前反显项,那么直接反显该标志好了 2007、1、8
        */
        MenuGUI_SetEnFont(En_8x16);
        MenuGUI_DispCharAt(' ',BarXOffset,(Where++)*BarYSize+BarYOffset);
        MenuGUI_DispCharAt('>',BarXOffset,Where*BarYSize+BarYOffset);
#else
        //原来位置取消反显   项是ItemBack  位置Where
        BarDisp(*(DispItem+ItemBack),BarXOffset,(Where++)*BarYSize+BarYOffset,0);
        //下移后的位置反显   项是Item      位置Where+1(Where++实现)
        BarDisp(*(DispItem+Item),BarXOffset,Where*BarYSize+BarYOffset,1);//反显
#endif

#ifdef RockBack
    } else {    //当前位置为DispMax    底部  下移
    #ifdef DynamicBar
        if ((ItemNum > DispMax)||(BarDataMode == DynamicData)){//需要显示的Bar多于单屏可以显示的Bar,那么重新显示//08/29
    #else
        if (ItemNum > DispMax) {//需要显示的Bar多于单屏可以显示的Bar,那么重新显示
    #endif
#else
    }else if(ItemBack != (ItemNum-1)){//当前位置为DispMax    如果原来显示位置不是最后一项,则 底部  下移
        if (ItemNum > DispMax) {//需要显示的Bar多于单屏可以显示的Bar,那么重新显示
#endif

//    Where = DispMax-1;//当前位置依然末尾位置
    if(Item == 0){
        Where = 0;//当前位置依然在开头的0位置    
    }else{
        Where = DispMax-1;//当前位置依然末尾位置
    }
    if (Item >= Where) {//未跨越零点
        Menu_j = Item -Where;
    } else {            //跨越零点
        Menu_j = ItemNum  - (Where - Item);
    }    

    //显示全部的子菜单项
    for (Menu_i = 0; Menu_i < DispMin; Menu_i++) {
        if (Menu_j == Item){ //反显第Item项,位置是Where
            BarDisp(*(DispItem+Item),BarXOffset,Where*BarYSize+BarYOffset,1);
        } else {             //其它项 正常显示
            BarDisp(*(DispItem+Menu_j),BarXOffset,Menu_i*BarYSize+BarYOffset,0);
        }
        if (Menu_j == (ItemNum-1)) {//到了最后一项,回环到最开始的一项
            Menu_j = 0;
        } else {                    //下一项
            Menu_j++;
        }
    }
#if 0
            Menu_j = Item;
            Menu_i = DispMax;
            //项是 Item  位置是 DispMax
            BarDisp(*(DispItem+Menu_j),BarXOffset,(Menu_i-1)*BarYSize+BarYOffset,1);
            if (Menu_j == 0) {
                Menu_j = ItemNum-1;
            } else {
                Menu_j--;
            }
            //显示其他项
            for (Menu_i = DispMax-1; Menu_i > 0; Menu_i--) {
                BarDisp(*(DispItem+Menu_j),BarXOffset,(Menu_i-1)*BarYSize+BarYOffset,0);
                if (Menu_j == 0) {
                    Menu_j = ItemNum-1;
                } else {
                    Menu_j--;
                }
            }
            Where = DispMax-1;//当前位置依然末尾位置
#endif            
        } else {//单屏能显示完全部菜单项,"底部 下移"应当跳转到顶部反显(或者什么都不做)
            Where = 0;
            //取消底部原有反显   项ItemBack  位置ItemNum-1
            BarDisp(*(DispItem+ItemBack),BarXOffset,(ItemNum-1)*BarYSize+BarYOffset,0);
            //反显顶部 项Item  位置0
            BarDisp(*(DispItem+Item),BarXOffset,Where*BarYSize+BarYOffset,1);//反显
        }
#ifdef RockBack
    }
#else
    }else{
        Item = ItemBack;//Restore
    }
#endif

    Bar(Item,ItemNum,MenuBarPosX,MenuBarNumPosX);                  //维护滚动条
    Jump2Menu(SelfMenuIndex,FlashMode_NoAction);

}
//*********************************************************


/*
*****************************************************************************
* DispIcoMenuInit - 图标层菜单界面
* DESCRIPTION: -
* 共有5个函数
 DispIcoMenuInit    DispIcoMenuUp   DispIcoMenuDown
 DispIcoMenuLeft    DispIcoMenuRight
* @Return :
*
*****************************************************************************
*/
void DispIcoMenuInit()
{

    ItemNum = IcoMenu[language].TextNum;//多少数据项
    DispItem = IcoMenu[language].Text;  //数据


    MenuGUI_Clear();
//-------------------
    if(Flash == FlashMode_AutoInit){//从0进入,初始化Item等值
        PUSH();
        Item = 0;
        Where = 0;
    }
    MenuGUI_DispStringAtBar(*(DispItem+Item),0,ICO_PosY+ICO_YSize,126,MenuGUI_TA_HCENTER);//菜单名字
    MenuGUI_DrawIcon(icos[Item],ICO_PosX,ICO_PosY);             //图标

    //显示按键对应的文字提示,1-->"进入"
    MenuGUI_DispStringAtBar(*(Tip[language].Text+1),0,Enter_PosY,126,MenuGUI_TA_HCENTER);

    Bar(Item,ItemNum,MenuBarPosX,MenuBarNumPosX);                  //维护滚动条
    return;
}

/*
*****************************************************************************
* DispIcoMenuUp - 图标层下确定键的行为
* DESCRIPTION: -
* 分发处理各个跳转
* 第一层菜单的Up键处理
* Return :
*
*****************************************************************************
*/
void DispIcoMenuUp()
{

    switch(Item){
        case 0:{
            MenuGUI_Clear();
            //功能
            Jump2Menu(MenuFuncIndex,FlashMode_AutoInit);
            return;
        }
        case 1:{
            MenuGUI_Clear();
            //参数
            Jump2Menu(MenuParaIndex,FlashMode_AutoInit);
            return;
        }
        case 2:{
            MenuGUI_Clear();
            //测量
            Jump2Menu(MenuMeasureIndex,FlashMode_AutoInit);
            return;
        }
        case 3:{
            MenuGUI_Clear();
            //语言
            Jump2Menu(MenuLanguageIndex,FlashMode_ManualInit);
            //在MenuLanguage.C中的DispMenuLanguageInit函数中修改Item Where!
            return;
        }
        case 4:{
            Jump2Menu(SelfMenuIndex,FlashMode_NoAction);
            return;
        }
        case 5:{
            Jump2Menu(SelfMenuIndex,FlashMode_NoAction);
            return;
        }
        default:{
            Jump2Menu(MenuTopIndex,FlashMode_NoAction);
            return;
        }
    }

}

void DispIcoMenuDown()
{
    POP();
}

void DispIcoMenuLeft()
{
    if(Item==0){
        Item = ItemNum-1;
    }else{
        Item--;
    }

    MenuGUI_DispStringAtBar(*(DispItem+Item),0,ICO_PosY+ICO_YSize,126,MenuGUI_TA_HCENTER);//菜单名字
    MenuGUI_DrawIcon(icos[Item],ICO_PosX,ICO_PosY);             //图标
    Bar(Item,ItemNum,MenuBarPosX,MenuBarNumPosX);                  //维护滚动条
    Jump2Menu(SelfMenuIndex,FlashMode_NoAction);
}

void DispIcoMenuRight()
{
    if(Item==(ItemNum-1)){
        Item = 0;
    }else{
        Item++;
    }

    MenuGUI_DispStringAtBar(*(DispItem+Item),0,ICO_PosY+ICO_YSize,126,MenuGUI_TA_HCENTER);//菜单名字
    MenuGUI_DrawIcon(icos[Item],ICO_PosX,ICO_PosY);             //图标
    Bar(Item,ItemNum,MenuBarPosX,MenuBarNumPosX);                  //维护滚动条
    Jump2Menu(SelfMenuIndex,FlashMode_NoAction);
}
//---------------------------------------------------------



//---------------------------

void DispBuildTime(void)//编译时间
{

    MenuGUI_DispStringAt("Build Time:",0,0);
    MenuGUI_DispStringAt(__DATE__,0,2);
    MenuGUI_DispStringAt(__TIME__,0,4);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -