Files
player/Project/Src/MyWin/Window/mywin_list.c
2025-07-06 18:46:13 +08:00

132 lines
3.4 KiB
C

#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;
}
}