#include "newMessage.h" #include "log.h" #define MAX_PAGES 20 //最多显示20页 #define START_SHOW_Y (UI_CONTENT_SHOW_Y+3) //开始显示的Y坐标 #define END_SHOW_Y (UI_BOTTOM_LINE_Y) //显示结束的Y坐标 #define START_SHOW_X 3 #define MAX_ROW_NUM 5 //每页最多显示多少行 typedef struct{ unsigned short SY;//开始显示的Y坐标 unsigned char font;//显示字体 unsigned char xlen;//根据font配置固定的单字x长度->显示中文时占的宽度 unsigned char ylen;//根据font配置固定的单字y高度 unsigned char validIndexNum;//有效页数目 unsigned short indexTable[MAX_PAGES];//一页最多显示5行,每行最多30字节,一页最多150字节 unsigned char showIndex;//当前显示表的索引 char *info;//显示的缓存 }SUT_NEW_MESSAGE; SUT_NEW_MESSAGE sutNewMessage={ .info=NULL, }; #define MAX_INFO_NUM 3 char newMessageInit(FONT_MODEENUM fontMode,char *info1, char *info2, char *info3){ int i,len=0; char *infos[MAX_INFO_NUM]={info1,info2,info3}; char spacesBuf[2]={0x0a,0x00}; unsigned char unNullNum=0; char strcatAlready; sutNewMessage.SY=START_SHOW_Y; sutNewMessage.font=fontMode; if(fontMode==FONT_MODE_12X12){ sutNewMessage.ylen=12; sutNewMessage.xlen=13; }else{ sutNewMessage.ylen=16; sutNewMessage.xlen=16; } //申请下显示的缓存 for(i=0;i0 && unNullNum){ len+=(unNullNum-1)+1;//申请多三个字节(unNullNum个0x0a和多一个空字节位置) p=(char *)malloc(sizeof(char)*len); if(p==NULL) return 1; sutNewMessage.info=p; sutNewMessage.info[0]=0; strcatAlready=0; for(i=0;i 0x9f){//中文 if(leftDot>=sutNewMessage.xlen){//还可以显示 showIndex += 2;//移动源串索引 ptr += 2;//移动源串地址 leftDot -= sutNewMessage.xlen;//减去剩下可显示点数 }else{//不足够显示了 nextLine=1; } }else if(ch==0x0a){//换行符 showIndex ++; ptr ++; nextLine=1; }else{//非中文 if(leftDot>=8){//还可以显示 showIndex ++; ptr ++; leftDot -= 8; }else{//不足够显示了 nextLine=1; } } if(nextLine!=0){ page++; nextLine=0; leftDot=validWidthDot; if(((sutNewMessage.SY+(page+1)*yHeight) >= END_SHOW_Y) || //Y 已不够显示了(有可能还不够显示MAX_ROW_NUM行) (page>=MAX_ROW_NUM)){//显示完一页了 if(num < MAX_PAGES){ page=0; sutNewMessage.indexTable[num++]=showIndex; } } } } sutNewMessage.validIndexNum=num; thisDir=SHOW_DOWN; sutNewMessage.showIndex=0; }else if(thisDir==SHOW_DOWN){ if(sutNewMessage.validIndexNum<=1) return;//只有一页的就不用再重显示了 if(++sutNewMessage.showIndex>=sutNewMessage.validIndexNum) sutNewMessage.showIndex=0; }else if(thisDir==SHOW_UP){ if(sutNewMessage.validIndexNum<=1) return;//只有一页的就不用再重显示了 if(sutNewMessage.showIndex==0) sutNewMessage.showIndex=sutNewMessage.validIndexNum-1; else sutNewMessage.showIndex--; }else if(thisDir==SHOW_HEAD){//显示开头 sutNewMessage.showIndex=0; } guiClearRect(0,sutNewMessage.SY,GLCD_WIDTH-1,END_SHOW_Y-1,guiGetBackColor()); //下面按实际显示 leftDot=validWidthDot; showIndex=sutNewMessage.indexTable[sutNewMessage.showIndex];//获取源串显示开始索引 page=0; fillindex=0; nextLine=0; ptr=sutNewMessage.info+showIndex; while(*ptr !=0){ ch=*ptr; if(ch > 0x9f){//中文 if(leftDot>=sutNewMessage.xlen){//还可以显示 memcpy(showBuf+fillindex, ptr, 2); fillindex += 2;//移动源串索引 ptr += 2;//移动源串地址 leftDot -= sutNewMessage.xlen;//减去剩下可显示点数 }else{//不足够显示了 nextLine=1; } }else if(ch==0x0a){//换行符 ptr ++; nextLine=1; }else{//非中文 if(leftDot>=8){//还可以显示 showBuf[fillindex++] = ch; ptr ++; leftDot -= 8; }else{//不足够显示了 nextLine=1; } } if(nextLine!=0){ nextLine=0; if(fillindex= END_SHOW_Y) || //Y 已不够显示了(有可能还不够显示MAX_ROW_NUM行) (page>=MAX_ROW_NUM)){//显示完一页了 return; } } } if(fillindex>0){ if(fillindex