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

📄 menu.c

📁 uccos2的的源码文件
💻 C
字号:
//
// 菜单显示
// by liaonh 2008/1
//

#include "test.h"


char gi_MenuReshow = 0;
void SetMenuReShow(int reshow)
{
    gi_MenuReshow = reshow;
}


#define MENU_LINE_HEIGHT        (FONT_HEIGHT*pset->ey+pset->linespace)

void DrawMenu(const Menu* pMenu,MenuSetting* pset)
{
    int i;
    int x,y;

    x = pset->x;
    y = pset->y;
    SetBkColor(MENU_BKCOLOR);
    SetTextMode(TM_TRANSPARENT);
    SetHoriEnlarge(pset->ex);
    SetVertEnlarge(pset->ey);

    SetTextColor(MENU_CAPTIONCOLOR);
    TextOut(pset->captionx,pset->captiony,pset->maincaption);
    for( i = 0; i < pset->ItemCount; i++)
    {
        SetTextColor(( i == pset->CurrentItem ) ? MENU_SELCOLOR : MENU_TEXTCOLOR);
        SetBkColor(( i == pset->CurrentItem ) ? MENU_SELBKCOLOR : MENU_BKCOLOR);
        sprintf((char*)buf,"%c.%s",(i<10) ? (i+'0') : (i-10+'a'),pMenu[i].caption);
        TextOut(x,y+i*MENU_LINE_HEIGHT,(char*)buf);
    }
    ResetTextOut();
}

void GetMenuItemSize(const Menu* pMenu,const MenuSetting* pset,int index,int* w,int* h)
{
    *w = pset->ex*FONT_WIDTH*strlen(pMenu[index].caption);
    *h = pset->ey*FONT_HEIGHT;
}

int GetMouseInItem(const Menu* pMenu,const MenuSetting* pset)
{
    int i;
    int x,y,w,h,rx,ry;

    GetMouseLastPos(&x,&y);
    Touch2Screen(&x,&y);
    rx = pset->x;
    ry = pset->y;

    for( i = 0; i < pset->ItemCount; i++)
    {
        GetMenuItemSize(pMenu,pset,i,&w,&h);
        if( IsPtInRect(x,y,rx,ry,w,h) )
        {
//            Tell4(x,y,rx,ry);
//            Tell4(i,w,h,0);
            return i;
        }
        ry += MENU_LINE_HEIGHT;
    }
	return -1;
}

int ExecMenuItem(const Menu* pMenu,MenuSetting* pset)
{
    int ret;
    if( pMenu[pset->CurrentItem].pAction != NULL )
    {
        gi_MenuReshow = 1;
        ret = (*pMenu[pset->CurrentItem].pAction)(pMenu[pset->CurrentItem].para);
        switch(ret)
        {
            case MENU_RETAIN: break;
            case MENU_EXIT:
                pset->toExit = 1;
                pset->ExitCode = 0;
                break;
        }
        if( gi_MenuReshow != 0 )
        {
            RestoreDesktop();
            pset->NeedDrawMenu = 1;
        }
    }
    else
    {
        if( pMenu[pset->CurrentItem].para != 0 )
        {
            pset->toExit = 1;
            pset->ExitCode = pMenu[pset->CurrentItem].para;
        }
        else
        {
            printf("undefined MenuAction\r\n");
        }
    }
    return 0;
}

int ExecMenu(const Menu* pMenu,MenuSetting* pset)
{
    int ch = 0,bakch;
    int myevent = 0;

    pset->NeedDrawMenu = 1;
    pset->ItemCount = 0;
    while( pMenu[pset->ItemCount].caption != NULL )
    {
        pset->ItemCount++;
    }

    while( !pset->toExit)
    {
        if( pset->NeedDrawMenu )
        {
            DrawMenu(pMenu,pset);
            pset->NeedDrawMenu = 0;
        }

        ch = FetchChar();
        myevent = 1;
        bakch = ch;
        switch(ch)
        {
            case KEY_ESC:
                pset->toExit = 1;
                break;
            case KEY_UP:
                if( pset->CurrentItem > 0 )
                    pset->CurrentItem--;
                else
                    pset->CurrentItem = pset->ItemCount-1;
                pset->NeedDrawMenu = 1;
                break;
           case KEY_DOWN:
               if( pset->CurrentItem < pset->ItemCount-1 )
                    pset->CurrentItem++;
                else
                    pset->CurrentItem = 0;
                pset->NeedDrawMenu = 1;
                break;
           case MOUSE_DOWN:
                if( (ch = GetMouseInItem(pMenu,pset)) > -1 )
                {
                    pset->CurrentItem = ch;
                    pset->NeedDrawMenu = 1;
                }
                else
                {
                    myevent = 0;
                }
                pset->MouseDownItem = ch;
                break;
           case MOUSE_MOVE:
               if( (ch = GetMouseInItem(pMenu,pset)) > -1 )
               {
                   pset->NeedDrawMenu = 1;
                   pset->CurrentItem = ch;
               }
               else
               {
                   myevent = 0;
               }
                break;
           case MOUSE_RELEASE:
               if( (ch = GetMouseInItem(pMenu,pset)) > -1 )
               {
                    pset->CurrentItem = ch;
                    //Tell2(ch,pset->MouseDownItem);
                    if( ch == pset->MouseDownItem )
                    {
                       ExecMenuItem(pMenu,pset);
                    }
               }
               else
                    myevent = 0;
                pset->MouseDownItem = -1;
                break;
           case KEY_ENTER:
                ExecMenuItem(pMenu,pset);
                break;
           default:
                if( ch >= '0' && ch <= '9' )
                {
                        ch -= '0';
                }
                else if( ch >= 'A' && ch <= 'Z' )
                {
                    ch -= 'A';
                    ch += 10;
                }
                else if( ch >= 'a' && ch <= 'z' )
                {
                    ch -= 'a';
                    ch += 10;
                }
                else
                {
                    myevent = 0;
                }

                if ( ch > -1 && ch < pset->ItemCount && myevent)
                {
                    pset->NeedDrawMenu = 1;
                    pset->CurrentItem = ch;
                    if( pset->ExtraFlag & 0x01 )
                        ExecMenuItem(pMenu,pset);
                }
                break;
        }

        if( myevent == 0 )
        {
            if( pset->pIdleAction )
                (*pset->pIdleAction)(bakch);
        }

    }

    return pset->ExitCode;
}

⌨️ 快捷键说明

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