📄 gui.c
字号:
#include "gui.h"
#include "lcd.h"
#include "delay.h"
#include "text.h"
#include "touch.h"
#include "fat.h"
#include "sysfile.h"
#include "jpegbmp.h"
#include "usart.h"
#include "led.h"
//////////////////////////////////////////////////////////////////////////////////
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//Mini STM32开发板
//综合实验 驱动代码
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2010/6/6
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 正点原子 2009-2019
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////
//系统主菜单
const u8 *Menu[9]=
{
"电子图书",
"数码相框",
"拼图游戏",
"触摸画板",
"系统时间",
"鼠标画板",
"USB连接 ",
"红外遥控",
"无线传书",
};
//////////////////////////GUI 按钮///////////////////////////////
void GUI_DrawLine(u16 x,u16 y,u16 xlen,u16 ylen,u16 color)
{
u16 tempcolor=POINT_COLOR;
POINT_COLOR=color;
LCD_DrawLine(x,y,x+xlen,y+ylen);
POINT_COLOR=tempcolor;
}
//在指定位置显示指定颜色的按钮
//(x,y):按钮起始坐标
//xlen,ylen:x,y方向的长度
//str:按钮上要显示的字符
//color:字符颜色
void GUI_Draw_Button(u16 x,u16 y,u16 xlen,u16 ylen,u8 *str,u16 color)
{
u16 tback_color,tpoint_color;
//////////////////画按钮部分//////////////////////
LCD_Fill(x,y,x+xlen,y+ylen,LGRAY);//画实体
GUI_DrawLine(x,y,xlen,0,WHITE); //上外边框
GUI_DrawLine(x,y,0,ylen,WHITE); //左外边框
GUI_DrawLine(x+1,y+1,xlen-1,0,0XB5B6);//上内边框
GUI_DrawLine(x+1,y+1,0,ylen-1,0XB5B6);//左内边框
GUI_DrawLine(x,y+ylen,xlen,0,0X8431); //下外边框
GUI_DrawLine(x+xlen,y,0,ylen,0X8431); //右外边框
GUI_DrawLine(x+1,y+ylen-1,xlen-2,0,0XA535);//下内边框
GUI_DrawLine(x+xlen-1,y,0,ylen-1,0XA535); //右内边框
//////////////////显示按钮上面的信息///////////////
if(ylen<16)return;//不够画
tback_color=BACK_COLOR;
tpoint_color=POINT_COLOR;
BACK_COLOR=LGRAY;
POINT_COLOR=color;
Show_Str_Mid(x,y+(ylen-16)/2,str,16,xlen);//只对16字体
BACK_COLOR=tback_color; //恢复之前的颜色
POINT_COLOR=tpoint_color;
}
/////////////////////////界面图形加载/////////////////////////////
//选择菜单
void Select_Menu(u8 M_Type,u8 Cnt,u8 En)
{
u8 tx;
u16 ty;
u8 t;
ty=10;
if(M_Type==0)//主菜单
{
tx=80*(Cnt%3)+10;//10,90,170
if(Cnt>5)ty=216;
else if(Cnt>2)ty=113;
//显示外框部分
if(En)POINT_COLOR=BLUE;
else POINT_COLOR=WHITE;
for(t=0;t<4;t++)
{
LCD_DrawRectangle(tx-7+t,ty-7+t,tx+66-t,ty+67-t);
}
//显示字体,反白
if(En)//选中当前的菜单
{
POINT_COLOR=WHITE;//白色字体
BACK_COLOR=LBBLUE; //蓝色背景
}else
{
POINT_COLOR=DARKBLUE;//深蓝色字体
BACK_COLOR=WHITE; //白色背景
}
Show_Str(tx-3,ty+74,(u8*)Menu[Cnt],16,0);
}
}
//加载主界面
void Load_Sys_ICO(void)
{
u8 t,tx;
u16 ty;
FileInfoStruct temp;
POINT_COLOR=RED;//黑色字体
LCD_Clear(WHITE);//清屏
temp.F_Type=T_BMP;//文件属性设置
tx=10;ty=10;
for(t=0;t<9;t++)
{
temp.F_StartCluster=sys_ico[t];
tx=80*(t%3)+10;//10,90,170
AI_LoadPicFile(&temp,tx,ty,tx+59,ty+60);
Select_Menu(0,t,0);//加载字体
if(t>=5)ty=216;
else if(t>=2)ty=113;
}
}
//加载游戏界面
//size:3,3*3图片
// 4,4*4图片
// 5,5*5图片
//#define FRAME1 0XBC40 //棕色
void Load_Game_ICO(u8 size)
{
u8 i;
LCD_Clear(LGRAY);//清屏
for(i=0;i<4;i++)//画大边框
{
POINT_COLOR=FRAME1;
LCD_DrawRectangle(i,i,239-i,239-i);
}
if(size==3)
{
for(i=0;i<4;i++)//画小边框
{
POINT_COLOR=FRAME1;
LCD_DrawRectangle(154+i,235+i,239-i,316-i);
}
LCD_Fill(158,235,235,239,WHITE);//把多余的去掉
POINT_COLOR=RED;
LCD_DrawRectangle(158,235,235,312);//画空的方框,事先不放图片
LCD_DrawRectangle(4,4,235,235); //画最大的红框
LCD_DrawLine(81,4,81,235); //画内部红框
LCD_DrawLine(158,4,158,235);//画内部红框
LCD_DrawLine(4,81,235,81); //画内部红框
LCD_DrawLine(4,158,235,158);//画内部红框
}else if(size==4)
{
for(i=0;i<4;i++)//画小边框
{
POINT_COLOR=FRAME1;
LCD_DrawRectangle(174+i,236+i,239-i,298-i);
}
LCD_Fill(178,236,236,240,WHITE);//把多余的去掉
POINT_COLOR=RED;
LCD_DrawRectangle(178,236,236,294);//画空的方框,第十六格
LCD_DrawRectangle(4,4,236,236); //画最大的红框
for(i=0;i<size;i++)LCD_DrawLine(4,4+58*i,236,4+58*i); //画内部横网格线
for(i=0;i<size;i++)LCD_DrawLine(4+58*i,4,4+58*i,236); //画内部竖网格线
}else if(size==5)
{
for(i=0;i<4;i++)//画小边框
{
POINT_COLOR=FRAME1;
LCD_DrawRectangle(184+i,234+i,239-i,284-i);
}
LCD_DrawLine(4,235,236,235); //误差横线填充线
LCD_DrawLine(235,4,235,281); //误差竖线填充线
LCD_Fill(188,234,234,239,WHITE);//把多余的去掉
POINT_COLOR=RED;
LCD_DrawRectangle(188,234,234,280);//画空的方框,第十六格
LCD_DrawRectangle(4,4,234,234); //画最大的红框
for(i=0;i<size;i++)LCD_DrawLine(4,4+46*i,234,4+46*i); //画内部横网格线
for(i=0;i<size;i++)LCD_DrawLine(4+46*i,4,4+46*i,234); //画内部竖网格线
}
LCD_DrawRectangle(2,241,79,318);//包括预览图片
BACK_COLOR=WHITE;
POINT_COLOR=BLUE;//画笔颜色
Show_Str(81,242,"等级:",16,0x01);
POINT_COLOR=RED;//画笔颜色
if(size==3)Show_Str(121,242,"简单",16,0x01);
else if(size==4)Show_Str(121,242,"一般",16,0x01);
else Show_Str(121,242,"困难",16,0x01);
POINT_COLOR=BLUE;//画笔颜色
Show_Str(81,258,"步数:",16,0x01);
Show_Str(81,274,"用时:",16,0x01);
GUI_Draw_Button(98,298,37,20,"退出",BLACK);
}
//加载浏览界面
//设置界面
//str:"选择/确定"
void Load_Gui_Bro(u8 * str)
{
LCD_Clear(WHITE);//清屏
//顶部
LCD_Fill(0,0,239,9,LIGHTBLUE); //填充底部颜色(浅蓝色)
LCD_Fill(0,10,239,20,GRAYBLUE); //填充底部颜色(灰蓝色)
//中部
POINT_COLOR=DARKBLUE;//深蓝色
LCD_DrawLine(0,21,239,21);
LCD_Fill(0,22,239,41,LIGHTBLUE);//填充中部部颜色(浅灰蓝色)
LCD_DrawLine(0,41,239,41);
//底部
LCD_DrawLine(0,298,239,298);
LCD_Fill(0,299,239,308,LIGHTBLUE);//填充底部颜色(浅蓝色)
LCD_Fill(0,308,239,319,GRAYBLUE);//填充底部颜色(灰蓝色)
POINT_COLOR=DARKBLUE;
Show_Str(0,23,"请选择:",16,0x01); //叠加模式,非自动换行
POINT_COLOR=WHITE;
Show_Str(5,300,str,16,0x01); //叠加模式,非自动换行
Show_Str(203,300,"返回",16,0x01); //叠加模式,非自动换行
}
//加载显示界面
//在PS2/触控画图时用到
//设置界面
//str:"选择/确定"
void Load_Gui_Show(u8 *lbtstr,u8 *mbtstr,u8 *rbtstr)
{
LCD_Clear(WHITE); //清屏
POINT_COLOR=DARKBLUE;//深蓝色
LCD_DrawLine(0,297,239,297);
LCD_Fill(0,298,239,308,LIGHTBLUE);//填充底部颜色(浅蓝色)
LCD_Fill(0,308,239,319,GRAYBLUE); //填充底部颜色(灰蓝色)
POINT_COLOR=WHITE;//白色字体
Show_Str(5,300,lbtstr,16,0x01); //叠加模式,非自动换行
Show_Str(104,300,mbtstr,16,0x01); //叠加模式,非自动换行
Show_Str(203,300,rbtstr,16,0x01); //叠加模式,非自动换行
}
////////////////////////////////与触摸屏控制相关的函数////////////////////////////
//把触摸屏得到的数据转换为数字(按钮值)
//M_Type:按钮模式;
//0,系统菜单
//1,文件浏览模式
//2,时间模式下,按键的获取,连按支持!
//3,音乐播放模式下
//4,功能选择模式下
//5,收音机模式下
//6,闹钟中断程序按键
//7,TXT浏览/JPEG浏览 时按键处理
//返回值:对应的按键值(1~n)
//返回0,则表示此次按键无效
u8 Touch_To_Num(u8 M_Type)
{
u8 xtemp;
u16 t,ytemp;
switch(M_Type)
{
case 0://系统菜单下
ytemp=10;
for(t=0;t<9;t++)
{
xtemp=80*(t%3)+10;
if(t>5)ytemp=216;
else if(t>2)ytemp=113;
if(Is_In_Area(xtemp,ytemp,59,90))return t+1;//返回按键值
}
case 1://1,文件浏览模式
for(t=0;t<8;t++)
{
if(Is_In_Area(0,42+t*32,240,32))return t+1;
}
if(Is_In_Area(0,300,40,20))return 9;//选择按钮被按下
if(Is_In_Area(200,300,40,20))return 10;//返回按钮被按下
return 0;//按键无效
// if(xtemp)return xtemp&0xf0;//滑动触摸了!!
//break;
case 2://4,功能选择模式下
for(t=0;t<8;t++)
{
if(Is_In_Area(0,42+t*32,240,32))return t+1;
}
if(Is_In_Area(0,300,40,20))return 9;//选择按钮被按下
if(Is_In_Area(200,300,40,20))return 10;//返回按钮被按下
return 0;//按键无效
//break;
case 3:
break;
case 4:
break;
case 5://5,收音机模式下
break;
case 6://6,闹钟中断程序按键
break;
case 7://JPEG/BMP/TXT浏览按键模式
if(Is_In_Area(0,0,239,60))return KEY_PREV; //向上
else if(Is_In_Area(0,60,239,200))return KEY_FUNC; //不定
else if(Is_In_Area(0,260,239,60))return KEY_NEXT; //向下翻
return 0;//按键无效
//break;
}
return 0;
}
//按键滑动检测
u8 KEY_Move_Check(void)
{
#define MOVE_PIXES 30 //滑动距离
if(Pen_Point.X>Pen_Point.X0)//右移
{
if(T_abs(Pen_Point.X0,Pen_Point.X)>MOVE_PIXES&&T_abs(Pen_Point.Y0,Pen_Point.Y)<MOVE_PIXES)return MOVE_RIGHT;
}else //左移
{
if(T_abs(Pen_Point.X0,Pen_Point.X)>MOVE_PIXES&&T_abs(Pen_Point.Y0,Pen_Point.Y)<MOVE_PIXES)return MOVE_LEFT;
}
if(Pen_Point.Y>Pen_Point.Y0)//下移
{
if(T_abs(Pen_Point.Y0,Pen_Point.Y)>MOVE_PIXES&&T_abs(Pen_Point.X0,Pen_Point.X)<MOVE_PIXES)return MOVE_DOWN;
}else //上移
{
if(T_abs(Pen_Point.Y0,Pen_Point.Y)>MOVE_PIXES&&T_abs(Pen_Point.X0,Pen_Point.X)<MOVE_PIXES)return MOVE_UP;
}
return 0;
}
//////////////////////////////与文件浏览相关的函数//////////////////////////////
//功能选择调度函数
//list :功能条目指针
//title :标题
//func :选择/确定/。。。
//len :功能条目的个数(1~8)
//sel :开始选中的条目(0~7)
//返回值:0~7,选中的条目;8,没有选择任何条目。
u8 Load_Fun_Sel(const u8 * *list,const u8 *title,u8 *func,u8 len,u8 sel)
{
u8 t,key;
Load_Gui_Bro(func);
//显示标题
POINT_COLOR=WHITE;
Show_Str_Mid(0,2,(u8*)title,16,240); //叠加模式,非自动换行
POINT_COLOR=DARKBLUE;
Show_Str(0,23,"请选择:",16,0x01); //叠加模式,非自动换行
//加载条目信息
for(t=0;t<len;t++)
{
if(t==sel)
{
LCD_Fill(0,45+sel*32,239,37+(sel+1)*32,LBBLUE );//对选中的条目,填充棕色
POINT_COLOR=WHITE;
}else POINT_COLOR=DARKBLUE;
Show_Str(0,50+t*32,(u8*)list[t],16,0x01); //叠加模式,非自动换行
}
key=0;
Pen_Point.Key_Sta=Key_Up;//释放显示期间的触发
while(1)//等待按键
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -