#include "mywin_inc.h" //定义列表类型 #define WIN_LIST_TYPE "WIN_ListStruct" //在堆中创建一个列表窗口 WIN_ListStruct *WIN_CreatList (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))LIST_DefaultMsgLoop; } WIN_ListStruct *ret=mymalloc (sizeof ( WIN_ListStruct)); //调用父类的构造函数 if (ret) { mymemset (ret,0,sizeof ( WIN_ListStruct)); 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_LIST_TYPE; //构造一个列表 ret->itemHeigh=WIN_GetFontHight(); ret->list_y=0; } } return ret; } //设置列表框显示的条目 void LIST_SetItem (WIN_ListStruct *list,char **item,int itemNum) { if (list->button) { //如果已经设置过,先清除以前的 for (int i=0;iitemNum;i++) { ((WIN_WindowStruct *)(list->button[i]))->deleteWindow((WIN_WindowStruct *)(list->button[i])); } myfree (list->button); } list->item=item; list->itemNum=itemNum; list->button=mymalloc (sizeof (WIN_ButtonStruct *)*list->itemNum); mymemset (list->button,0,sizeof (WIN_ButtonStruct *)*list->itemNum); //创建每个条目按钮 for (int i=0;iitemNum;i++) { list->button[i]= WIN_CreatButton ((WIN_WindowStruct *)list,0,0,list->list_y+i*list->itemHeigh, ((WIN_WindowStruct *)list)->x_size,list->itemHeigh); BUTTON_SetKeyString(list->button[i],list->item[i]); } } //设置每个条目的高度 void LIST_SetItemHeight (WIN_ListStruct *list,int height) { list->itemHeigh=height; } //设置列表Y轴方向的原点 void LIST_SetYOrigin (WIN_ListStruct *list,int ori) { list->list_y=ori; } //设置Y轴方向的移动距离 void LIST_SetYMove (WIN_ListStruct *list,int move) { list->list_y+=move; int temp=((WIN_WindowStruct *)list)->y_size-list->itemHeigh*list->itemNum; if (list->list_ylist_y=temp; } else if (list->list_y>0) { list->list_y=0; } } //默认绘制函数 void LIST_DefaultPaint (WIN_ListStruct *list) { int x=0; int y=0; } //默认消息处理函数 void LIST_DefaultMsgLoop (WIN_ListStruct *list,WIN_MsgStruct *msg) { WIN_MoveStruct *m=0; switch (msg->msg) { case WIN_MSG_PAINT: LIST_DefaultPaint(list); break; case WIN_MSG_INIT: break; case WIN_MSG_KEY: break; case WIN_MSG_TOUCH: break; case WIN_MSG_CHID: break; case WIN_MSG_DELETE: break; case WIN_MSG_MOVE: m=msg->data.p; switch (m->moveType) { case MOVE_DATA_MOVEIN: break; case MOVE_DATA_MOVED: break; case MOVE_DATA_LONG: break; case MOVE_DATA_MOVEOUT: case MOVE_DATA_OUTSIDE: break; case MOVE_DATA_TOUCHOUT: break; case MOVE_DATA_TOUCHIN: WIN_SetInvalid ((WIN_WindowStruct *)list); break; default: WIN_DefaultMsgLoop((WIN_WindowStruct *)list,msg); break; } break; default: WIN_DefaultMsgLoop((WIN_WindowStruct *)list,msg); break; } }