//创建窗口 //top,left,width,height:坐标及尺寸. //id:window的ID //type:window类型 //[7]:0,没有关闭按钮.1,有关闭按钮 //[6]:0,不读取背景色.1,读取背景色. //[5]:0,标题靠左.1,标题居中. //[4:2]:保留 //[1:0]:0,标准的窗口(仿XP);1,圆边窗口(仿Android) //font:窗体标题文字字体大小 _window_obj *window_creat(u16 left, u16 top, u16 width, u16 height, u8 id, u8 type, u8 font) { _window_obj *window_crt; if(width < (WIN_BTN_SIZE + 20) || height < WIN_CAPTION_HEIGHT) { return NULL; //尺寸不能太小 } window_crt = (_window_obj *)gui_memin_malloc(sizeof(_window_obj)); //分配内存 if(window_crt == NULL) { return NULL; //内存分配不够. } window_crt->top = top; window_crt->left = left; window_crt->width = width; window_crt->height = height; window_crt->id = id; window_crt->type = type; window_crt->sta = 0; window_crt->caption = 0; window_crt->captionheight = WIN_CAPTION_HEIGHT; //默认高度 window_crt->font = font; //设置字体大小 window_crt->arcwinr = 6; //默认圆角的半径 window_crt->captionbkcu = WIN_CAPTION_UPC; //默认caption上部分背景色 window_crt->captionbkcd = WIN_CAPTION_DOWNC; //默认caption下部分背景色 window_crt->captioncolor = WIN_CAPTION_COLOR; //默认caption的颜色 window_crt->windowbkc = WIN_BODY_BKC; //默认背景色 if(type & (1 << 7)) { //需要关闭按钮(仅适用仿XP窗口) window_crt->closebtn = btn_creat(left + width - WIN_BTN_SIZE - WIN_BTN_OFFSIDE, top + (window_crt->captionheight - WIN_BTN_SIZE) / 2, WIN_BTN_SIZE, WIN_BTN_SIZE, 0, 2); //创建边角按钮 if(window_crt->closebtn == NULL) { window_delete(window_crt); //释放之前申请的内存 return NULL; //内存分配不够. } window_crt->closebtn->caption = "×"; //关闭图标 window_crt->closebtn->bcfucolor = WIN_BTN_FUPC; //默认松开的颜色 window_crt->closebtn->bcfdcolor = WIN_BTN_FDOWNC; //默认按下的颜色 window_crt->closebtn->bkctbl[0] = WIN_BTN_RIMC; //圆角按钮边框颜色 window_crt->closebtn->bkctbl[1] = WIN_BTN_TP1C; //第一行的颜色 window_crt->closebtn->bkctbl[2] = WIN_BTN_UPHC; //上半部分颜色 window_crt->closebtn->bkctbl[3] = WIN_BTN_DNHC; //下半部分颜色 } else { window_crt->closebtn = NULL; } if(type & (1 << 6)) { //需要读取背景色 window_crt->bkctbl = (u16 *)gui_memin_malloc(width * height * 2); //要分配完整的背景色表 if(window_crt->bkctbl == NULL) { window_delete(window_crt); //释放之前申请的内存 return NULL; //内存分配不够. } window_read_backcolor(window_crt); //读取背景色 } return window_crt; }
//创建进度条 //top,left,width,height:坐标.及尺寸. //type:按键类型 //[bit7]:方向,0,水平;1,垂直; //[bit6]:0,不显示浮标;1,显示浮标(百分进度条的时候,表示百分数); //[bit5]:0,不显示进度柱,1,显示进度柱(其实就是颜色是否填充,是否跟着浮标填充颜色.) //[bit4:2]:保留; //[bit1:0]:0,标准进度条;1,百分数进度条;2,3,保留. _progressbar_obj * progressbar_creat(u16 left,u16 top,u16 width,u16 height,u8 type) { _progressbar_obj * progressbar_crt; if(width<2||height<2)return NULL;//尺寸不能太小 progressbar_crt=(_progressbar_obj*)gui_memin_malloc(sizeof(_progressbar_obj));//分配内存 if(progressbar_crt==NULL)return NULL;//内存分配不够. progressbar_crt->top=top; progressbar_crt->left=left; progressbar_crt->width=width; progressbar_crt->height=height; progressbar_crt->type=type; progressbar_crt->sta=0; progressbar_crt->id=0; progressbar_crt->totallen=0; progressbar_crt->curpos=0; //当使用百分数进度条和屏蔽进度条时,确保prgbarlen设置为0. 也就是不用显示浮标 if(type&PRGB_TYPE_TEXT||(type&PRGB_TYPE_FEN)==0)progressbar_crt->prgbarlen=0;//默认滚条长度为10 else progressbar_crt->prgbarlen=10; //默认滚条长度为10 progressbar_crt->inbkcolora=PRGB_DFT_BKACOLOR; //默认色 progressbar_crt->inbkcolorb=PRGB_DFT_BKBCOLOR; //默认色 progressbar_crt->infcolora=PRGB_DFT_FILLACOLOR; //默认色 progressbar_crt->infcolorb=PRGB_DFT_FILLBCOLOR; //默认色 progressbar_crt->btncolor=PRGB_DFT_BTNCOLOR; //默认色 progressbar_crt->rimcolor=PRGB_DFT_RIMCOLOR; //默认色 return progressbar_crt; }
//创建滚动条 //top,left,width,height:坐标.及尺寸. //type:[bit7]:方向,0,水平;1,垂直;bit[6:2]:保留;[bit1:0]:按钮类型,0,标准滚动条;1,没有端按钮的滚动条;2,3,保留. _scrollbar_obj *scrollbar_creat(u16 left, u16 top, u16 width, u16 height, u8 type) { _scrollbar_obj *scrollbar_crt; if((type & 0x80) == SCROLLBAR_DIR_HOR && (width < 2 * SCROLLBAR_PART_LEN || height < SCROLLBAR_MIN_THICK)) { return NULL; //尺寸不能太小 } if((type & 0x80) == SCROLLBAR_DIR_VER && (width < SCROLLBAR_MIN_THICK || height < 2 * SCROLLBAR_PART_LEN)) { return NULL; //尺寸不能太小 } scrollbar_crt = (_scrollbar_obj *)gui_memin_malloc(sizeof(_scrollbar_obj)); //分配内存 if(scrollbar_crt == NULL) { return NULL; //内存分配不够. } gui_memset((u8 *)scrollbar_crt, 0, sizeof(_scrollbar_obj)); //将scrollbar_crt的值全部设置为0 scrollbar_crt->top = top; scrollbar_crt->left = left; scrollbar_crt->width = width; scrollbar_crt->height = height; scrollbar_crt->type = type; scrollbar_crt->sta = 0; scrollbar_crt->id = 0; scrollbar_crt->totalitems = 0; scrollbar_crt->itemsperpage = 0; scrollbar_crt->topitem = 0; scrollbar_crt->scbbarlen = 0; scrollbar_crt->inbkcolor = SCLB_DFT_INBKCOLOR; scrollbar_crt->btncolor = SCLB_DFT_BTNCOLOR; scrollbar_crt->rimcolor = SCLB_DFT_RIMCOLOR; return scrollbar_crt; }
//增加一条listbox的条目 //0,增加成功; //1,增加失败 u8 listbox_addlist(_listbox_obj * listbox,u8 *name) { _listbox_list * listx; _listbox_list * listtemp; listx=(_listbox_list*)gui_memin_malloc(sizeof(_listbox_list));//分配内存 if(listx==NULL)return 1;//内存分配不够. listx->name=name;//得到名字 listx->nextlist=NULL; if(listbox->list==NULL)//还未创建链表 { listx->prevlist=NULL; listbox->list=listx; }else //已经创建了 { listtemp=listbox->list; while(listtemp->nextlist!=NULL)listtemp=listtemp->nextlist; listx->prevlist=listtemp; listtemp->nextlist=listx; } listbox->scbv->totalitems++;//总条目数增加1条 if(listbox->scbv->totalitems>listbox->scbv->itemsperpage)listbox->type|=0x80;//需要显示滚条 else listbox->type&=~0x80;//不需要显示滚条 return 0; }
//创建listbox //top,left,width,height:坐标.及尺寸. //width的范围:必须大于等于LBOX_ITEM_HEIGHT //height的范围:必须是LBOX_ITEM_HEIGHT的整数倍. //type:bit7,用于是否显示滚动条,其他位保留. //font:字体类型 12/16表示字体为12*12或者16*16. _listbox_obj * listbox_creat(u16 left,u16 top,u16 width,u16 height,u8 type,u8 font) { _listbox_obj * listbox_crt; _scrollbar_obj * scb_crt; if(height%gui_phy.listheight)return NULL;//尺寸不合格 if(height<gui_phy.listheight||width<gui_phy.listheight)return NULL; //尺寸不合格 listbox_crt=(_listbox_obj*)gui_memin_malloc(sizeof(_listbox_obj));//分配内存 if(listbox_crt==NULL)return NULL; //内存分配不够. scb_crt=scrollbar_creat(left+width-LBOX_SCB_WIDTH,top,LBOX_SCB_WIDTH,height,0x80);//创建scrollbar. if(scb_crt==NULL)//内存分配不够. { gui_memin_free(listbox_crt); return NULL; } scb_crt->itemsperpage=height/gui_phy.listheight; //每页显示的条目数 listbox_crt->top=top; listbox_crt->left=left; listbox_crt->width=width; listbox_crt->height=height; listbox_crt->type=type; //类型 listbox_crt->sta=0; listbox_crt->id=0; listbox_crt->dbclick=0; //双击标志清零 listbox_crt->font=font; //字体大小 listbox_crt->selindex=0; //当前选中的索引 listbox_crt->lbkcolor=LBOX_DFT_LBKCOLOR; //内部背景色 listbox_crt->lnselcolor=LBOX_DFT_LSELCOLOR; //选中list后的字体颜色 listbox_crt->lnselbkcolor=LBOX_DFT_LSELBKCOLOR; //选中list后的背景色 listbox_crt->lncolor=LBOX_DFT_LNCOLOR; //未选中的list字体颜色 listbox_crt->rimcolor=LBOX_DFT_RIMCOLOR; //边框颜色 listbox_crt->fname=NULL; //名字为空 listbox_crt->namelen=0; //长度清零 listbox_crt->curnamepos=0; //当前位置清零 listbox_crt->oldtime=0; //时间清零 listbox_crt->scbv=scb_crt; //滚动条 listbox_crt->list=NULL; //无链表 return listbox_crt; }
//闹铃处理(尺寸:44*20) //x,y:坐标 //返回值,处理结果 u8 calendar_alarm_msg(u16 x,u16 y) { u8 rval=0; u16 *lcdbuf=0; //LCD显存 lcdbuf=(u16*)gui_memin_malloc(44*20*2); //申请内存 if(lcdbuf) //申请成功 { app_read_bkcolor(x,y,44,20,lcdbuf); //读取背景色 gui_fill_rectangle(x,y,44,20,LIGHTBLUE); gui_draw_rectangle(x,y,44,20,BROWN); gui_show_num(x+2,y+2,2,RED,16,alarm.hour,0X81); gui_show_ptchar(x+2+16,y+2,x+2+16+8,y+2+16,0,RED,16,':',1); gui_show_num(x+2+24,y+2,2,RED,16,alarm.min,0X81); OSTaskSuspend(6); //挂起主任务 while(rval==0) { tp_dev.scan(0); if(tp_dev.sta&TP_PRES_DOWN)//触摸屏被按下 { if(app_tp_is_in_area(&tp_dev,x,y,44,20))//判断某个时刻,触摸屏的值是不是在某个区域内 { rval=0XFF;//取消 break; } } delay_ms(5); if(system_task_return)break; //需要返回 } app_recover_bkcolor(x,y,44,20,lcdbuf); //读取背景色 }else rval=1; system_task_return=0; alarm.ringsta&=~(1<<7); //取消闹铃 calendar_alarm_init((_alarm_obj*)&alarm,&calendar); //重新初始化闹钟 gui_memin_free(lcdbuf); OSTaskResume(6); //恢复主任务 system_task_return=0; return rval; }
//时间显示模式 u8 calendar_play(void) { u8 second=0; short temperate=0; //温度值 u8 t=0; u8 tempdate=0; u8 rval=0; //返回值 u8 res; u16 xoff=0; u16 yoff=0; //表盘y偏移量 u16 r=0; //表盘半径 u8 d=0; //指针长度 u8 TEMP_SEN_TYPE=0; //默认使用DS18B20 FIL* f_calendar=0; f_calendar=(FIL *)gui_memin_malloc(sizeof(FIL));//开辟FIL字节的内存区域 if(f_calendar==NULL)rval=1; //申请失败 else { res=f_open(f_calendar,(const TCHAR*)APP_ASCII_S6030,FA_READ);//打开文件 if(res==FR_OK) { asc2_s6030=(u8*)gui_memex_malloc(f_calendar->fsize); //为大字体开辟缓存地址 if(asc2_s6030==0)rval=1; else { res=f_read(f_calendar,asc2_s6030,f_calendar->fsize,(UINT*)&br); //一次读取整个文件 } f_close(f_calendar); } if(res)rval=res; } if(rval==0)//无错误 { LCD_Clear(BLACK);//清黑屏 second=calendar.sec;//得到此刻的秒钟 POINT_COLOR=GBLUE; Show_Str(48,60,lcddev.width,lcddev.height,(u8*)calendar_loading_str[gui_phy.language][0],16,0x01); //显示进入信息 if(DS18B20_Init()) { Show_Str(48,76,lcddev.width,lcddev.height,(u8*)calendar_loading_str[gui_phy.language][1],16,0x01); delay_ms(500); Show_Str(48,92,lcddev.width,lcddev.height,(u8*)calendar_loading_str[gui_phy.language][2],16,0x01); TEMP_SEN_TYPE=1; } delay_ms(1100);//等待1.1s BACK_COLOR= BLACK; LCD_Clear(BLACK);//清黑屏 if(lcddev.width==240) { r=80; d=7; }else if(lcddev.width==320) { r=120; d=9; }else if(lcddev.width==480) { r=160; d=12; } yoff=(lcddev.height-r*2-140)/2; TIME_TOPY=yoff+r*2+10; OTHER_TOPY=TIME_TOPY+60+10; xoff=(lcddev.width-240)/2; calendar_circle_clock_drawpanel(lcddev.width/2,yoff+r,r*2,d);//显示指针时钟表盘 calendar_date_refresh(); //加载日历 tempdate=calendar.w_date;//天数暂存器 gui_phy.back_color=BLACK; gui_show_ptchar(xoff+70-4,TIME_TOPY,lcddev.width,lcddev.height,0,GBLUE,60,':',0); //":" gui_show_ptchar(xoff+150-4,TIME_TOPY,lcddev.width,lcddev.height,0,GBLUE,60,':',0); //":" } while(rval==0) { RTC_Get(); //更新时间 if(system_task_return)break;//需要返回 if(second!=calendar.sec) //秒钟改变了 { second=calendar.sec; calendar_circle_clock_showtime(lcddev.width/2,yoff+r,r*2,d,calendar.hour,calendar.min,calendar.sec);//指针时钟显示时间 gui_phy.back_color=BLACK; gui_show_num(xoff+10,TIME_TOPY,2,GBLUE,60,calendar.hour,0X80); //显示时 gui_show_num(xoff+90,TIME_TOPY,2,GBLUE,60,calendar.min,0X80); //显示分 gui_show_num(xoff+170,TIME_TOPY,2,GBLUE,60,calendar.sec,0X80); //显示秒 if(t%2==0)//等待2秒钟 { if(TEMP_SEN_TYPE)temperate=Get_Temp();//得到内部温度传感器的温度值,0.1℃ else temperate=DS18B20_Get_Temp();//得到18b20温度 if(temperate<0)//温度为负数的时候,红色显示 { POINT_COLOR=RED; temperate=-temperate; //改为正温度 }else POINT_COLOR=BRRED; //正常为棕红色字体显示 gui_show_num(xoff+90,OTHER_TOPY,2,GBLUE,60,temperate/10,0X80); //XX gui_show_ptchar(xoff+150,OTHER_TOPY,lcddev.width,lcddev.height,0,GBLUE,60,'.',0); //"." gui_show_ptchar(xoff+180-15,OTHER_TOPY,lcddev.width,lcddev.height,0,GBLUE,60,temperate%10+'0',0);//显示小数 gui_show_ptchar(xoff+210-10,OTHER_TOPY,lcddev.width,lcddev.height,0,GBLUE,60,95+' ',0);//显示℃ if(t>0)t=0; } if(calendar.w_date!=tempdate) { calendar_date_refresh(); //天数变化了,更新日历. tempdate=calendar.w_date; //修改tempdate,防止重复进入 } t++; } delay_ms(20); }; while(tp_dev.sta&TP_PRES_DOWN)tp_dev.scan(0);//等待TP松开. gui_memex_free(asc2_s6030); //删除申请的内存 asc2_s6030=0; //清零 gui_memin_free(f_calendar); //删除申请的内存 POINT_COLOR=BLUE; BACK_COLOR=WHITE ; return rval; }
//图片浏览 u8 picviewer_play(void) { DIR picdir; //picdir专用 FILINFO picinfo; u8 rval=0; //返回值 u8 *pname=0; u8 *fn=0; u8 picsta=0; //ebook状态 //0,属于文件浏览状态 //1,顺序播放图片 //2,暂停状态 u16 curindex=0; //当前浏览的图片文件的索引号 u8 endecode=0; //使能解码 u8 key; u16 dtime=0; //延时时间 u8 keyup=1; //松开标记 u8 pictype=0; //图片类型 _filelistbox_obj * flistbox; _filelistbox_list * filelistx; //文件 _btn_obj* rbtn; //返回按钮控件 app_filebrower((u8*)APP_MFUNS_CAPTION_TBL[1][gui_phy.language],0X07);//选择目标文件,并得到目标数量 flistbox=filelistbox_creat(0,gui_phy.tbheight,lcddev.width,lcddev.height-gui_phy.tbheight*2,1,gui_phy.listfsize);//创建一个filelistbox if(flistbox==NULL)rval=1; //申请内存失败. else { flistbox->fliter=FLBOX_FLT_PICTURE; //图片文件 filelistbox_add_disk(flistbox); //添加磁盘路径 filelistbox_draw_listbox(flistbox); } //为长文件名申请缓存区 picinfo.lfsize = _MAX_LFN * 2 + 1; picinfo.lfname = gui_memin_malloc(picinfo.lfsize); if(picinfo.lfname==NULL)rval=1;//申请内存失败 else gui_memset((u8*)picinfo.lfname,0,picinfo.lfsize); rbtn=btn_creat(lcddev.width-2*gui_phy.tbfsize-8-1,lcddev.height-gui_phy.tbheight,2*gui_phy.tbfsize+8,gui_phy.tbheight-1,0,0x03);//创建文字按钮 if(rbtn==NULL)rval=1; //没有足够内存够分配 else { rbtn->caption=(u8*)GUI_BACK_CAPTION_TBL[gui_phy.language];//返回 rbtn->font=gui_phy.tbfsize;//设置新的字体大小 rbtn->bcfdcolor=WHITE; //按下时的颜色 rbtn->bcfucolor=WHITE; //松开时的颜色 btn_draw(rbtn);//画按钮 } LED1=1;//关闭LED1 while(rval==0)//主循环 { tp_dev.scan(0); in_obj.get_key(&tp_dev,IN_TYPE_TOUCH); //得到按键键值 delay_ms(5); if(system_task_return)break; //TPAD返回 if(picsta==0) { filelistbox_check(flistbox,&in_obj); //扫描文件 if(flistbox->dbclick==0X81) //双击文件了 { curindex=flistbox->selindex-flistbox->foldercnt;//得到当前图片索引号 picsta=1; //图片播放状态 endecode=1; //第一张图片自动播放 LCD_Clear(0x0);//黑屏 } } key=btn_check(rbtn,&in_obj); if(key&&((rbtn->sta&0X80)==0)) { if(flistbox->dbclick!=0X81)//在文件浏览的时候按了返回按钮,则返回上一层目录 { filelistx=filelist_search(flistbox->list,flistbox->selindex);//得到此时选中的list的信息 if(filelistx->type==FICO_DISK)//已经不能再往上了,则退出图片浏览 { break; }else filelistbox_back(flistbox);//退回上一层目录 } } if(endecode) { rval=f_opendir(&picdir,(const TCHAR*)flistbox->path); //打开选中的目录 if(rval)break; ff_enter(picdir.fs);//进入fatfs,防止被打断. dir_sdi(&picdir,flistbox->findextbl[curindex]); ff_leave(picdir.fs);//退出fatfs,继续运行os等 rval=f_readdir(&picdir,&picinfo);//读取文件信息 if(rval)break;//打开成功 fn=(u8*)(*picinfo.lfname?picinfo.lfname:picinfo.fname); pname=gui_memin_malloc(strlen((const char*)fn)+strlen((const char*)flistbox->path)+2);//申请内存 if(pname==NULL)break; //申请失败 pname=gui_path_name(pname,flistbox->path,fn); //文件名加入路径 pictype=f_typetell(pname); if(pictype==T_GIF)gui_show_string(fn,5,5,lcddev.width-5,gui_phy.tbfsize,gui_phy.tbfsize,RED); //显示GIF名字 ai_load_picfile(pname,0,0,lcddev.width,lcddev.height,1); //播放这个图片 if(pictype!=T_GIF)gui_show_string(fn,5,5,lcddev.width-5,gui_phy.tbfsize,gui_phy.tbfsize,RED); //显示图片名字 gui_memin_free(pname); //释放内存 pname=NULL; endecode=0; } keyup=0; dtime=0; while(picsta)//按键扫描循环 { key=pic_tp_scan(); dtime++; if(dtime>400&&(picsta==1))key=3;//顺序播放状态下时间溢出,自动播放下一张图片 if(key)//有按键按下 { dtime=0; if(keyup) { keyup=0; if(key==1)//上一幅图片 { if(curindex)curindex--; else curindex=flistbox->filecnt-1; endecode=1; LCD_Clear(0x0);//黑屏 break; }else if(key==2)//在暂停和非暂停之间切换 { if(picsta==1) { picsta=2; LED1=0; //表示暂停 }else { picsta=1; LED1=1; //暂停结束 } }else if(key==3) { if(systemset.picmode==0)//顺序播放 { if(curindex<(flistbox->filecnt-1))curindex++; else curindex=0; }else //随机播放 { curindex=app_get_rand(flistbox->filecnt);//随机得到下一张图片的编号 } endecode=1; LCD_Clear(0x0);//黑屏 break; } } }else keyup=1;//标记按键松开 delay_ms(10); if(system_task_return)picsta=0;//TPAD返回 if(picsta==0)//回到文件浏览状态之前的处理 { LED1=1; //关闭LED1 flistbox->dbclick=0; //设置非文件浏览状态 app_filebrower((u8*)APP_MFUNS_CAPTION_TBL[1][gui_phy.language],0X07);//选择目标文件,并得到目标数量 btn_draw(rbtn); //画按钮 filelistbox_rebuild_filelist(flistbox);//重建flistbox system_task_return=0; //还不能退出图片浏览 break; } } } LED1=1;//关闭LED1 filelistbox_delete(flistbox); //删除filelist btn_delete(rbtn); //删除按钮 gui_memin_free(pname); //释放内存 gui_memin_free(picinfo.lfname); return rval; }