/******************************************************************************** * File Name: ListBox.c * Function Describe: ListBox 控件 * Relate Module: GUI.c * Writer: Shliangwen * Date: 2016-1-8 *******************************************************************************/ #include "includes.h" //#define NEED_ROOP //未实现 #define N 100 void ListBoxShow(struct SUT_LIST_BOX *p); //SUT_LIST_BOX ListBox; SUT_LIST_BOX sutListBox; /************************************************************************* ListBoxInit ***************************************************************************/ void ListBoxInit(struct SUT_LIST_BOX *p,char **itemlist,char unicode,const char **iconlist,char *features,unsigned int type) { UI_STACKDEF *uiPtr=getStackStruct(); unsigned int kk; /////////////////////// unsigned char i,ch,index; //统计item p->item = itemlist; i = 0; while(iitem[i][0]; if(ch==0)break; i ++; } i=i-1; p->itemnum = i+1; p->pagenum=i/LIST_ROW; if(p->pagenum%LIST_ROW)p->pagenum+=1; //统计icon i=0; p->icon=iconlist; while(iicon[i][0]; if(ch==0)break; i ++; } p->iconnum=i; //特? for(i=0;iitemnum){ p->features[i]=features[i]; }else{ p->features[i]=0; } } //unicode p->unicode=unicode; //默认? p->page = 0; p->handle = type; //显示 ListBoxShow(p); } /****************************************************************************** 指定允许的长度截取字符串,如果源长度超过指定长度,则截取之并将最后字符改?.."?..." 同时处理中文字符 *******************************************************************************/ void StrIntercept(char *des,char *src,unsigned short len) //预期len { int srclen; unsigned char d1,d2; unsigned char *p; int i; srclen=strlen(src); des[len-1]='\0'; strncpy(des,src,len-1); //if(srclen=len-1 && len>5){ if(srclen>=len-1 && len>5){//防止最后一条没显示.. //将最后两个字符转?.." des[len-2]='.'; des[len-3]='.'; //判断倒数?个字符是否为半个中文字符,如果是则将其转为?’,避免显示乱码 p=(unsigned char *)des; i=0; while(i<(len-4)){ if(*p>0x9f){ p+=2; i+=2; }else{ p+=1; i+=1; } } if(i==(len-4) && *p>0x9f){//半个汉字 des[len-4]='.'; } } } /******************************************************************************** ListBoxShowItem *******************************************************************************/ void ListBoxShowItem(struct SUT_LIST_BOX *p,unsigned short handle) { unsigned short len; unsigned short x,y,hand; unsigned char buf[LIST_ITEM_TEXT_LEN_MAX+3]; char str[LIST_ITEM_TEXT_LEN_MAX+1]; char f; hand=handle % LIST_ROW; x=LIST_TOPX; y=LIST_TOPY+hand*LIST_ITEM_HEGH; //换页时清理干净 guiClearArea(x,y,LIST_BAR_LEN+16,LIST_ITEM_HEGH,guiGetBackColor()); memset(buf,0,sizeof(buf)); if(p->unicode){ buf[LIST_ITEM_TEXT_LEN_MAX+2]=0; }else{ strncpy((char *)buf,p->item[handle],sizeof(buf)); buf[LIST_ITEM_TEXT_LEN_MAX+2]=0; } //截取并适当?. StrIntercept(str,(char *)buf,LIST_ITEM_TEXT_LEN_MAX); if(p->icon!=NULL){//有图? f= p->features[handle]; guiShowBmp(x,y+8,p->icon[f]);//0 guiShowStr(x+24+2,y,str, FONT_MODE_16X16, REVERSED_NO, guiGetForeColor(),guiGetBackColor()); }else{//无图? guiShowStr(x,y,str, FONT_MODE_16X16, REVERSED_NO, guiGetForeColor(),guiGetBackColor()); } } void showHexBuf(char *str){ char buf[100]={0}; char info[3]; int i; for(i=0;iicon!=NULL){//有图? x+=24+2; } handle=p->handle%LIST_ROW; y=LIST_TOPY+handle*LIST_ITEM_HEGH; //截取并适当?. StrIntercept(str,p->item[p->handle],LIST_ITEM_TEXT_LEN_MAX); if(REVERSED_YES==rev) guiFillRect(x,y,LIST_BAR_LEN,y+32,guiGetBackColor()); else guiFillRect(x,y,LIST_BAR_LEN,y+32,COLOR_STATUS_BAR); if(REVERSED_YES==rev) guiShowStr(x,y,str, FONT_MODE_16X16, rev,guiGetBackColor(),guiGetForeColor()); else guiShowStr(x,y,str, FONT_MODE_16X16, rev,guiGetForeColor(), COLOR_STATUS_BAR);//COLOR_SEL_BAR } /******************************************************************************** * Function:ListBoxShow * display ListBox *******************************************************************************/ void ListBoxShow(struct SUT_LIST_BOX *p) { unsigned char i,j; unsigned short x,y; if(p->itemnum==0)return; j=p->page*LIST_ROW; for(i = j ; i = p->itemnum){ y=LIST_TOPY+(i % LIST_ROW)*LIST_ITEM_HEGH; guiClearArea(LIST_TOPX,y,LIST_BAR_LEN+18,LIST_ITEM_HEGH,guiGetBackColor()); }else{ ListBoxShowItem(p,i); } } ListBoxShowBar(p,REVERSED_NO); //show arrow x=UI_MENU_BAR_LEN+(GLCD_WIDTH-UI_MENU_BAR_LEN)/2-2; if(p->page>0) guiDrawArrow(GLCD_WIDTH-5, UI_MENU_TOPY, 8, ARROW_UP, COLOR_STATUS_BAR); else guiClearArea(x, UI_MENU_TOPY, 18,8+10,guiGetBackColor()); y=UI_MENU_TOPY+UI_MENU_ROW*(BAR_HIGHT+UI_MENU_SPACE); if(p->page<(p->pagenum-1)) guiDrawArrow(GLCD_WIDTH-5, y-2,8, ARROW_DOWN, COLOR_STATUS_BAR); else guiClearArea(x,y-8-2,19,8,guiGetBackColor()); } void LeftMoveSelectedItem(struct SUT_LIST_BOX *p){ #ifdef USE_LEFT_MOVING #define LIST_MAX_ROW_BYTE (30+1+2) #define LIST_MAX_SHOW_BYTE 13 //15 static char item[LIST_MAX_ROW_BYTE]; static unsigned short sum; unsigned short tsum; int len,i; char showMax[LIST_MAX_ROW_BYTE]; char *str=p->item[p->handle]; unsigned short x=24+2; unsigned short y=LIST_TOPY+p->handle*LIST_ITEM_HEGH; static unsigned int cnt=0xffff; if(++cnt<500/APP_SUB_DIV_TIME) return; cnt=0; if(strlen(str)<=LIST_MAX_SHOW_BYTE-1) return; snprintf(showMax, sizeof(showMax), "%s ", str); len=strlen(showMax); tsum=0; for(i=0;iLIST_MAX_SHOW_BYTE){ if(sum != tsum){ sum=tsum; memcpy(item, showMax, LIST_MAX_ROW_BYTE); }else leftMoveStr(item, strlen(item)); getRealShow(showMax, item,LIST_MAX_SHOW_BYTE); guiFillRect(x,y ,LIST_BAR_LEN,y+BAR_HIGHT,COLOR_STATUS_BAR);//LIST_BAR_LEN //GLCD_WIDTH-1 guiShowStr(x,y, showMax, FONT_MODE_16X16, REVERSED_NO, guiGetForeColor(), COLOR_STATUS_BAR); } #endif } /******************************************************************************** ListBoxResponse ListBox控件的键盘响应处? 底层 *******************************************************************************/ unsigned long ListBoxResponse(struct SUT_LIST_BOX *p) { unsigned char temp; unsigned long g_ulKeyValue=getKeyValue(); if(p->itemnum==0)return g_ulKeyValue; // SUT_PHONE_NUM PhoneNum[N]; // int i = 0; switch(g_ulKeyValue) { case MKEY_VALUE_UP: ListBoxShowBar(p,REVERSED_YES); #if 0 if(p->handle==0) { p->handle=(p->itemnum-1); //清预览位? GuiClearArea(LIST_TOPX,LIST_TOPY,LIST_BAR_LEN,16*LIST_ROW); } #else if(p->handle==0)p->handle=(p->itemnum-1); #endif else p->handle --; temp=p->page; p->page=p->handle/LIST_ROW; if(temp!=p->page)ListBoxShow(p); else ListBoxShowBar(p,REVERSED_NO); break; case MKEY_VALUE_DOWN: ListBoxShowBar(p,REVERSED_YES); p->handle ++; #if 0 if(p->handle>=p-> itemnum) { p->handle=0; //清预览位? GuiClearArea(LIST_TOPX,LIST_TOPY,LIST_BAR_LEN+16,16*LIST_ROW); } #else if(p->handle>=p-> itemnum)p->handle=0; #endif temp = p->page; p->page=p->handle/LIST_ROW; if(temp!=p->page)ListBoxShow(p); else ListBoxShowBar(p,REVERSED_NO); break; default: return g_ulKeyValue; break; } return 0; } /******************************************************************************** ListBoxGetHandle 获取ListBox当前手柄 *******************************************************************************/ unsigned short ListBoxGetHandle(struct SUT_LIST_BOX *p) { return p->handle; }