| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283 |
- /********************************************************************************
- * File Name: Menu.c
- * Function Describe: Menu 控件
- * Relate Module: GUI.c
- * Writer: Shliangwen
- * Date: 2016-1-8
- *******************************************************************************/
- #include "includes.h"
- /******************************************************************
- 返回串str在LCD显示所占的x坐标长度
- *******************************************************************/
- int GetStrXLen(char *str)
- {
- unsigned char ch;
- unsigned short len=0;
- // while ((ch=*str++)){
- // if(ch=='M')len+=16;
- // else len+=8;
- // if(len>LCD_WIDTH-1){//191
- // len=LCD_WIDTH-1;
- // break;
- // }
- // }
- while ((ch=*str++)){
- if(ch=='M')len+=12;
- else if(ch>='A'&&ch<='Z')len+=8;
- else if(ch>='a'&&ch<='z')len+=8;
- else if(ch>='0'&&ch<='9')len+=8;
- else if(ch>=0x20&& ch<=0x60)len+=8; //特殊字符
- else len+=6;
- }
- return (unsigned char )len;
- }
- int GetStrXLen16(char *str)
- {
- unsigned char ch;
- unsigned short len=0;
- while ((ch=*str++)){
- if(ch=='M')len+=16;
- else len+=8;
- if(len>LCD_WIDTH-1){//191
- len=LCD_WIDTH-1;
- break;
- }
- }
- // while ((ch=*str++)){
- // if(ch=='M')len+=12;
- // else if(ch>='A'&&ch<='Z')len+=8;
- // else if(ch>='a'&&ch<='z')len+=8;
- // else if(ch>='0'&&ch<='9')len+=8;
- // else if(ch>=0x20&& ch<=0x60)len+=8; //特殊字符
- // else len+=6;
- // }
- return (unsigned char )len;
- }
- #if 1
- /*************************************************************************
- *居中显示
- ***************************************************************************/
- void ShowCaption(const char *str,unsigned char y)
- {
- char buf[30];
- int len;
- len=GetStrXLen((char *)str);
- y=STATUS_BAR_HEIGH;
- GuiShowStr((LCD_WIDTH-len)/2,y,str,0x01,0);
- }
- void ShowCaption16(const char *str,unsigned char y)
- {
- int len;
- len=GetStrXLen16((char *)str);
- GuiShowStr((LCD_WIDTH-len)/2,y,str,0x10,0);
- }
- /*************************************************************************
- MenuInit
- ***************************************************************************/
- void MenuInit(struct SUT_MENU *p,const char **item)
- {
- unsigned char i,ch;
- unsigned char index;
- //calculate menu item number
- p->item = item;
- i = 0;
- for(;;)
- {
- ch=p->item[i][0];
- if(ch==0)break;
- i ++;
- }
- i=i-1;
- p->itemnum = i+1;
- p->pgaenum=i/MENU_ROW;
- if(p->pgaenum%MENU_ROW)p->pgaenum+=1;
- //
- if(g_ulKeyValue==KEY_PANEL_EXIT||UI_Stack.OK_back)
- {
- index=PullUiStack(&UI_Stack);
-
-
- // if(index>9){
- // p->page=2;
- // p->handle=index;//
- //
- // }else if(index>4){
- // p->page=1;
- // p->handle=index;//
- // }else{
- // p->page=0;
- // p->handle=index;
- // }
- p->page=(index+1)/5;
- p->handle=index;
- UI_Stack.OK_back=0;
- }else if(g_ulKeyValue==KEY_PANEL_MENU){
- p->page=0;
- p->handle=0;
- }
-
- // p->page = 0;
- // p->handle = 0;
- MenuShow(p);
- }
- /********************************************************************************
- * Function:MenuShowItem
- * display menu item
- *******************************************************************************/
- void MenuShowItem(struct SUT_MENU *p,unsigned char handle)
- {
- unsigned char y,hand;
- hand=handle % MENU_ROW;
- y=MENU_TOPY+hand*(12+MENU_SPACE);//16
- GuiClearArea((LCD_WIDTH-MENU_BAR_LEN)/2,y-1,MENU_BAR_LEN,18);
- //ShowCaption(p->item[handle],y);
- GuiShowStr(0,y,p->item[handle],0x01,0);
- }
- /********************************************************************************
- * Function:MenuShowBar
- * display a bar
- *******************************************************************************/
- void MenuShowBar(struct SUT_MENU *p,char type)
- {
- unsigned char x,y,h,handle;
- char *str;
- short len;
- x=0;
- handle=p->handle%MENU_ROW;
- y=MENU_TOPY+handle*(12+MENU_SPACE);//16
- //GuiReverseRect(x,y-1,MENU_BAR_LEN,18);
- str=(char *)p->item[p->handle];
- len=GetStrXLen(str);
- //GuiShowStr((LCD_WIDTH-len)/2, y, str, 1, type);
- if(type)GuiFillRect(x,y,140,y+14,COLOR_SELECT_BLUE);
- else GuiFillRect(x,y,140,y+14,COLOR_WHITE_BACK);
- GuiShowStr(x, y, str, 1, type);
- }
- /********************************************************************************
- * Function:MenuShow
- * display menu
- *******************************************************************************/
- void MenuShow(struct SUT_MENU *p)
- {
- unsigned char i,j;
- u16 x,y;
-
- j=p->page*MENU_ROW;
-
- for(i = j ; i <j+MENU_ROW ; i ++)
- {
- if(i >= p->itemnum){
- y=MENU_TOPY+(i % MENU_ROW)*(12+MENU_SPACE);//16
- //GuiClearArea((LCD_WIDTH-MENU_BAR_LEN)/2,y-1,MENU_BAR_LEN,(12+MENU_SPACE));//
- GuiClearArea(0,y-1,MENU_BAR_LEN,(12+MENU_SPACE));
- }else{
- MenuShowItem(p,i);
- }
-
- }
-
- MenuShowBar(p,1);
- //显示箭头
- x=MENU_BAR_LEN+(LCD_WIDTH-MENU_BAR_LEN)/2;
- if(p->page>0){
- GuiShowArrow(x+10,MENU_TOPY,8,3);//向上箭头
- }else{
- GuiClearArea(x,MENU_TOPY,18,8+10);
- }
-
- y=MENU_TOPY+MENU_ROW*(12+MENU_SPACE);
- if(p->page<(p->pgaenum-1)){
- GuiShowArrow(x+10,y-2,8,4);//向下箭头
- }else{
- GuiClearArea(x,y-8-2,19,8);
- }
-
- }
- /********************************************************************************
- * Function:MenuResponse
- *******************************************************************************/
- unsigned long MenuResponse(struct SUT_MENU *p)
- {
- unsigned char temp;
- switch(g_ulKeyValue)
- {
- case KEY_PANEL_UP:
- MenuShowBar(p,0);
- if(p->handle==0)p->handle=(p->itemnum-1);
- else p->handle --;
- temp=p->page;
- p->page=p->handle/MENU_ROW;
- if(temp!=p->page)MenuShow(p);
- else MenuShowBar(p,1);
- break;
- case KEY_PANEL_DOWN:
- MenuShowBar(p,0);
- p->handle ++;
- if(p->handle>=p-> itemnum)p->handle=0;
- temp = p->page;
- p->page=p->handle/MENU_ROW;
- if(temp!=p->page)MenuShow(p);
- else MenuShowBar(p,1);
-
- break;
-
- // case KEY_PANEL_OK:
- // return MENU_KEY_ENTER;
- //
- // case KEY_PANEL_EXIT:
- // return MENU_KEY_BACK;
- //
- default:
- return g_ulKeyValue;
- break;
- }
- return 0;
- }
- /********************************************************************************
- * Function:MenuGetHandle
- * get menu 's handle
- *******************************************************************************/
- unsigned char MenuGetHandle(struct SUT_MENU *p)
- {
- unsigned char handle;
- handle = p->handle;
- /*
- for(i = 0 ; i <= p->handle ; i ++)
- {
- if(p->item[i][0] == 0)handle --;
- }
- */
- return handle;
- }
- #endif
|