Files
player/Project/Src/MyWin/Window/mywin_page.c
2025-07-05 19:47:28 +08:00

301 lines
5.9 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;i<page->itemNum;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;i<one_page_num;i++)
{
item_index_now=page_now*one_page_num+i;
int img_xsize=0;
int img_ysize=0;
if (item_index_now<page->itemNum)
{
//显示图标
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;
}
}