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

📄 mfw_mnu.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 5 页
字号:
            attr = attr->items[mnu->lCursor[lvl]].menu;
            lvl++;
        }
        mnu->curAttr = attr;
        mnuUpdate(mnu);
    }
    else
    {
        mnu->flags |= E_MNU_ESCAPE;
        if( mnu->handler )
            if( mnu->mask & E_MNU_ESCAPE )
                mnu->handler(E_MNU_ESCAPE,mnu);
    }

    dspl_Enable(uMode);//NM
    return MfwResOk;
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
| STATE   : code                        ROUTINE : mnuDone            |
+--------------------------------------------------------------------+

  PURPOSE : reset menu

*/

MfwRes mnuDone (MfwHnd m)
{
    MfwMnu *mnu;

    if( (mnu = mfwControl(m)) == 0 )
        return MfwResIllHnd;

    mnu->curAttr = mnu->attr;
    mnu->level = 0;
    memset(mnu->lCursor,UNUSED,sizeof(mnu->lCursor));
    memset(mnu->lShift,1,sizeof(mnu->lShift));
    mnu->lCursor[0] = 0;

    return MfwResOk;
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
| STATE   : code                        ROUTINE : mnuKeyAction       |
+--------------------------------------------------------------------+

  PURPOSE : perform direct jumping if there was pressed KCD_1
            through KCD_9; in this case function returns 1;
            otherwise function returns 0

*/

MfwRes mnuKeyAction (MfwHnd m, U8 keycode)
{
    MfwMnu *mnu;
    U8 directAccess;

    if( (mnu = mfwControl(m)) == 0 )
        return MfwResIllHnd;

    switch( keycode )
    {
    case KCD_1: directAccess = 0; break;
    case KCD_2: directAccess = 1; break;
    case KCD_3: directAccess = 2; break;
    case KCD_4: directAccess = 3; break;
    case KCD_5: directAccess = 4; break;
    case KCD_6: directAccess = 5; break;
    case KCD_7: directAccess = 6; break;
    case KCD_8: directAccess = 7; break;
    case KCD_9: directAccess = 8; break;
    default: return 0;
    }

    if( directAccess >= mnu->curAttr->nItems )
        return 0;
    //disabled hided menu key action 
    if( mnu->curAttr->items[directAccess].flagFunc(mnu,mnu->curAttr,&(mnu->curAttr->items[directAccess])) & MNU_ITEM_HIDE )
        return 0;
    mnu->lCursor[mnu->level] = directAccess;
    MenuBrowseAction=BrowseNew;   //xsf add 2003.03.13
    mnuShow(m);
    //mnuSelect(m);  xsf remarked it 2003.02.18

    return 1;
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
| STATE   : code                        ROUTINE : mnuChooseItem      |
+--------------------------------------------------------------------+

  PURPOSE : Chooses the nItemst Item.

*/

MfwRes mnuChooseVisibleItem(MfwHnd m,U8 nItem)
{

    MfwMnu *mnu;
    int i;

    if( (mnu = mfwControl(m)) == 0 )
        return MfwResIllHnd;

    if( (int)nItem<0 )
        return MfwResIllHnd;

    for( i = 0; i < mnu->curAttr->nItems; i++ )
    {
        if( !(mnu->curAttr->items[i].flagFunc(mnu,
                                              mnu->curAttr,
                                              &(mnu->curAttr->items[i]))==FLAGFUNC_GRAY)//zy change for flagFunction retun vlaue
            & MNU_ITEM_HIDE )
        {
            if( !nItem )
            {
                mnu->lCursor[mnu->level] = i;
                MenuBrowseAction=BrowseNew;   //ganchh 2002/9/13
                mnuUpdate(mnu);
                return MfwResOk;
            }
            else
                nItem--;
        }
    }
    return MfwResIllHnd;

}



/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
| STATE   : code                        ROUTINE : menuIsEmpty        |
+--------------------------------------------------------------------+

  PURPOSE : check for empty submenu

*/

static int menuIsEmpty (MfwMnu *m, MfwMnuAttr *ma)
{
    int i;

    for( i = 0; i < ma->nItems; i++ )
        if( !(ma->items[i].flagFunc(m,ma,&(ma->items[i]))==FLAGFUNC_GRAY)//zy change for flagFunction retun vlaue
            & MNU_ITEM_HIDE )
            return 0;

    return 1;
}





/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
| STATE   : code                        ROUTINE : countVisible       |
+--------------------------------------------------------------------+

  PURPOSE : count visible items up to current item

*/

static int countVisible (MfwMnu *m, MfwMnuAttr *ma, int start)
{
    int i, count;

    for( i = 0, count = 0; i < start; i++ )
    {
        if( !(ma->items[i].flagFunc(m,ma,&(ma->items[i]))==FLAGFUNC_GRAY)//zy change for flagFunction retun vlaue
            & MNU_ITEM_HIDE )
            count++;
    }

    return count;
}

/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
| STATE   : code                        ROUTINE : countVisible       |
+--------------------------------------------------------------------+

  PURPOSE : search the last be visible line

*/
static int MenuVisibleLastCursor (MfwMnu *m, MfwMnuAttr *ma, int end)
{
    int i, count;

    for( i =end ; i >=0; i-- )
    {
        if( !(ma->items[i].flagFunc(m,ma,&(ma->items[i]))==FLAGFUNC_GRAY)//zy change for flagFunction retun vlaue
            & MNU_ITEM_HIDE )
        {
            count=i;
            i=-1;
        }
    }

    return count;
}
/*****************************************
$Function:
$Description:search the visible item by specied step forword or backwork
*****************************************************/
U8 getVisibleByStep(MfwMnu *m, MfwMnuAttr *ma,int start,int step)
{
    U8 i;
    for( i  = start; i< ma->nItems && i>=0; i+=step )
    {
        if( !(ma->items[i].flagFunc(m,ma,&(ma->items[i]))==FLAGFUNC_GRAY)
            & MNU_ITEM_HIDE )
            return i;
    }
    return 0xff;
}

/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
| STATE   : code                        ROUTINE : countVisibleItems  |
+--------------------------------------------------------------------+

  PURPOSE : count visible items in the current branch

*/

U8 mnuCountVisibleItems (MfwHnd m)
{
    MfwMnu *mnu;

    if( (mnu = mfwControl(m)) == 0 )
        return 0;

    return(U8)countVisible(mnu, mnu->curAttr,mnu->curAttr->nItems);
}


/*
+--------------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU                  |
| STATE   : code                        ROUTINE : countCurrentVisibleItem  |
+--------------------------------------------------------------------------+

  PURPOSE : returns the position of the current Item
*/
#if 0
U8 mnuCountCurrentVisibleItem(MfwMnu* mnu)
{
    U8 i;
    U8 pos=0;

    for( i = 0; i < mnu->curAttr->nItems; i++ )
    {
        if( (mnu->lCursor[mnu->level]) == i )
            return pos;
        if( !(mnu->curAttr->items[i].flagFunc(mnu,
                                              mnu->curAttr,
                                              &(mnu->curAttr->items[i]))==FLAGFUNC_GRAY)//zy change for flagFunction retun vlaue
            & MNU_ITEM_HIDE )
            pos++;
    }
    return pos;

}

#endif


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
| STATE   : code                        ROUTINE : checkPredraw       |
+--------------------------------------------------------------------+

  PURPOSE : check / generate predraw event

*/

static int checkPredraw (MfwMnu *mnu, MfwMnuItem *mi,
                         char **t, MfwIcnAttr **icn)
{
    int res = 0;

    if( (mi->flagFunc(mnu,mnu->curAttr,mi)==FLAGFUNC_GRAY)& MNU_ITEM_NOTIFY )//zy change for flagFunction retun vlaue
    {
        mnu->flags |= E_MNU_PREDRAW;
        if( mnu->handler )
            if( mnu->mask & E_MNU_PREDRAW )
            {
                if( mi->exta )
                {
                    ((MfwItmExtPredraw*)(mi->exta))->str = *t;
                    ((MfwItmExtPredraw*)(mi->exta))->icon = *icn;
                }
                res = mnu->handler(E_MNU_PREDRAW,mi);
                if( mi->exta )
                {
                    *t = ((MfwItmExtPredraw*)(mi->exta))->str;
                    *icn = ((MfwItmExtPredraw*)(mi->exta))->icon;
                }
            }
        mnu->flags &= ~E_MNU_PREDRAW;
    }

    return res;
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
| STATE   : code                        ROUTINE : checkPostdraw      |
+--------------------------------------------------------------------+

  PURPOSE : check / generate postdraw event

*/

static int checkPostdraw (MfwMnu *mnu, MfwMnuItem *mi)
{
    int res = 0;

    if( (mi->flagFunc(mnu,mnu->curAttr,mi)==FLAGFUNC_GRAY) & MNU_ITEM_NOTIFY )//zy change for flagFunction retun vlaue
    {
        mnu->flags |= E_MNU_POSTDRAW;
        if( mnu->handler )
            if( mnu->mask & E_MNU_POSTDRAW )
                res = mnu->handler(E_MNU_POSTDRAW,mi);
        mnu->flags &= ~E_MNU_POSTDRAW;
    }

    return res;
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
| STATE   : code                        ROUTINE : checkStatus        |
+--------------------------------------------------------------------+

  PURPOSE : check / insert item status (string MUST be in RAM)

*/

static int checkStatus (MfwMnu *m, MfwMnuAttr *ma, MfwMnuItem *mi,
                        char *p)
{
    char *e;                            /* ES!! UNICODE             */

    if( !(mi->flagFunc(m,ma,mi)==FLAGFUNC_GRAY)& MNU_ITEM_STATED )//zy change for flagFunction retun vlaue
        return 0;
    e = mi->exta;
    if( !e )
        return 0;
    while( *p )
    {
        if( *p == '%' )                  /* ES!! : UNICODE           */
        {
            switch( *(p+1) )
            {
            case 'c':               /* single char              */
                strcpy(p+1,p+2);
                *p = *e;
                e++;
                break;
            }
        }
        p++;
    }

    return 1;
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_MNU            |
| STATE   : code                        ROUTINE : drawPageMenu       |
+--------------------------------------------------------------------+

  PURPOSE : draws menu in page mode

  GW 05/10/01 - Changed single value 'lng' to 2 values indicating if ID's should be 
            used (useStrID) and if the strings are ascii or unicode (uesDefLang).

*/

static void drawPageMenu (MfwMnu *mnu)
{
    MfwMnuAttr *ma;                     /* menu attributes          */
    U16 th, tw, tl;                     /* text height, width, len  */
    U16 ax, ay, aw, ah, x;              /* menu area dimensions     */
    int tLines;                         /* lines in item text       */
    int nLines;                         /* lines in menu area       */
    char *txt, *t2, save;               /* item text & clip saver   */
    MfwIcnAttr * icn;                    /* item icon                */
    U8 oldFont = -1;                    /* save previous font       */
    MfwMnuItem *mi;                     /* current item             */
    char tt [64], *t;                   /* temp item string         */
    int i,currentTheme;

    ma = mnu->curAttr;
    if( ma->font != (U8) -1 )
        oldFont = dspl_SelectFontbyID(ma->font); /* setup font */

    ax = ma->area->px; ay = ma->area->py;
    aw = ma->area->sx; ah = ma->area->sy;
    th = dspl_GetFontHeight();
    currentTheme=FlashSettingData.theme;
    mi = ma->items + mnu->lCursor[mnu->level];
    icn = mi->icon;
    txt =  mi->str;
    if( mnu->useStrID )                       /* use language handler     */

⌨️ 快捷键说明

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