#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; i < list->itemNum; 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; i < list->itemNum; 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_y < temp) { list->list_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; } }