#include "mywin_inc.h" //定义页面类型 #define WIN_TYPE_TYPE "WIN_PageStruct" WIN_PageStruct *WIN_CreatPage (WIN_WindowStruct *base, void (*msgLoop)(struct _WIN_WindowStruct *win,WIN_MsgStruct *msg), int x,int y,int x_size,int y_size) { //重设消息循环 if (msgLoop==0) { msgLoop=(void (*)(struct _WIN_WindowStruct *win,WIN_MsgStruct *msg))PAGE_DefaultMsgLoop; } WIN_PageStruct *ret=mymalloc (sizeof ( WIN_PageStruct)); //调用父类的构造函数 if (ret) { mymemset (ret,0,sizeof ( WIN_PageStruct)); if (0==WIN_CreatWindowExt((WIN_WindowStruct *)ret,base,msgLoop,x,y,x_size,y_size)) { //创建失败 myfree (ret); ret=0; } else { //重新设置析构函数 ((WIN_WindowStruct *)ret)->winType=WIN_TYPE_TYPE; ((WIN_WindowStruct *)ret)->deleteWindow=(void (*)(struct _WIN_WindowStruct *win))WIN_DeletePage; //构造一个 ret->title="列表"; ret->itemHeight=WIN_GetFontHight(); ret->titleHeight=WIN_GetFontHight(); ret->itemIndent=80; } } return ret; } //销毁页面 void WIN_DeletePage (WIN_PageStruct *page) { //回收堆内存 if (page->item) { myfree(page->item); } //调用父类的销毁函数 WIN_DeleteWindow ( (WIN_WindowStruct *)page); } //设置页面的背景图片 void PAGE_SetBackPic (WIN_PageStruct *page,WIN_PicStruct *pic) { if (pic) { page->pic.data=pic->data; page->pic.xsize=pic->xsize; page->pic.ysize=pic->ysize; } else { page->pic.data=0; page->pic.xsize=0; page->pic.ysize=0; } } //设置列表框显示的条目 void PAGE_SetItem (WIN_PageStruct *page,const PAGE_ItemStruct *item,int itemNum) { if (page->item) { myfree(page->item); } page->itemNum=itemNum; page->item=mymalloc ((sizeof (PAGE_ItemStruct *)*page->itemNum)); for (int i=0;iitemNum;i++) { page->item[i] =(PAGE_ItemStruct *)&item[i]; } } //设置标题高度 void PAGE_SetTitleHeight (WIN_PageStruct *page,int height) { page->titleHeight=height; } //设置条目缩进 void PAGE_SetItemIndent (WIN_PageStruct *page,int indent) { page->itemIndent=indent; } //设置条目高度 void PAGE_SetItemHeight (WIN_PageStruct *page,int height) { page->itemHeight=height; } //索引增加 void PAGE_IndexAdd (WIN_PageStruct *page) { page->index++; if (page->index>=page->itemNum) { page->index=0; } } //索引减少 void PAGE_IndexSub (WIN_PageStruct *page) { if (page->index>0) { page->index--; } else { page->index=page->itemNum-1; } } //默认绘制函数 void PAGE_DefaultPaint (WIN_PageStruct *page) { //使用双缓冲,防止闪烁 // LCD_LayerBufferOn(); int x=0; int y=0; int x_size=((WIN_WindowStruct *)page)->x_size; int y_size=page->titleHeight; int one_page_num=0; //每页显示的条目数 int item_size=0; //条目的实际高度 int item_index_now; //当前页面的索引 int page_now; //当前页 WIN_SetLcdBkColor (0xf8f8f8); //如果有图片就显示图片 if (page->pic.data) { WIN_FillRect (0,0,((WIN_WindowStruct *)page)->x_size,((WIN_WindowStruct *)page)->y_size, page->pic.data,0,0,page->pic.xsize,page->pic.ysize); } else { WIN_Clear(); } //显示标题 WIN_SetFontMode (WIN_DRAWMODE_ALONE); WIN_SetLcdColor (0); WIN_DrawTxtHCenterAt (page->title,x_size/2,y_size/2-WIN_GetFontHight()/2); //显示选中栏 y+=y_size; y_size=((WIN_WindowStruct *)page)->y_size-y_size; one_page_num=y_size/page->itemHeight; item_size=y_size/one_page_num; item_index_now=page->index%one_page_num; WIN_SetLcdColor (0x8080a0); WIN_FillRectByColor (x,y+item_index_now*item_size,x_size,item_size); //显示条目 page_now=page->index/one_page_num; for (int i=0;iitemNum) { //显示图标 if (page->item[item_index_now]->image) { WIN_GetImageSize (page->item[item_index_now]->image,&img_xsize,&img_ysize); if (img_xsize>page->itemIndent) img_xsize=page->itemIndent; if (img_ysize>item_size) img_ysize=item_size; WIN_DrawImag (x+page->itemIndent/2-img_xsize/2,item_size/2-img_ysize/2+y+i*item_size, img_xsize,img_ysize,page->item[item_index_now]->image); } //显示横线和字符 WIN_SetLcdColor (0x808080); WIN_DrawHLine (x+page->itemIndent,y+i*item_size+item_size-2,x_size-1); WIN_SetLcdColor (0); WIN_DrawTxtAt (page->item[item_index_now]->str, x+page->itemIndent,y+i*item_size+item_size/2-WIN_GetFontHight()/2); } } // LCD_LayerBuffShow(); } //默认消息处理函数 void PAGE_DefaultMsgLoop (WIN_PageStruct *page,WIN_MsgStruct *msg) { WIN_MoveStruct *m=0; WIN_TouchStruct *t=0; WIN_KeyStruct *k=0; switch (msg->msg) { case WIN_MSG_PAINT: PAGE_DefaultPaint(page); break; case WIN_MSG_KEY: k=msg->data.p; if (k->shortPress&KEY_VALUE_UP)//短按 { PAGE_IndexSub (page); } else if (k->shortPress&KEY_VALUE_DOWN) { PAGE_IndexAdd (page); } else if (k->shortPress&KEY_VALUE_ENTER) { static char tips[20]={0}; sprintf (tips,"内存使用:mem:%d,exmem:%d",mem_perused(),exmem_perused()); MSGBOX_Tips((WIN_WindowStruct *)page,"警告",tips,"确定"); } if (k->shortPress) { WIN_SetInvalidRect ((WIN_WindowStruct *)page,0,page->titleHeight, ((WIN_WindowStruct *)page)->x_size,((WIN_WindowStruct *)page)->y_size-page->titleHeight); } break; case WIN_MSG_TOUCH: t=msg->data.p; if (page->touchIn) { page->touchIn=0; //模拟上键按下 if (t->y[0]<((WIN_WindowStruct *)page)->y_size/2) { PAGE_IndexSub (page); } else { PAGE_IndexAdd (page); } WIN_SetInvalidRect ((WIN_WindowStruct *)page,0,page->titleHeight, ((WIN_WindowStruct *)page)->x_size,((WIN_WindowStruct *)page)->y_size-page->titleHeight); } break; case WIN_MSG_MOVE: m=msg->data.p; switch (m->moveType) { case MOVE_DATA_TOUCHOUT: page->touchIn=1;//标识触屏已经按下 break; default: WIN_DefaultMsgLoop((WIN_WindowStruct *)page,msg); break; } default: WIN_DefaultMsgLoop((WIN_WindowStruct *)page,msg); break; } }