占用资源小的简单GUI的实现。对于类似51资源有限的单片机和点陈LCD比较实用。
先上二张图片,手机拍的不好,呵呵http://cache.amobbs.com/bbs_upload782111/files_23/ourdev_512671.JPG
(原文件名:反白显示.JPG)
http://cache.amobbs.com/bbs_upload782111/files_23/ourdev_512672.JPG
(原文件名:方块游戏.JPG)
http://cache.amobbs.com/bbs_upload782111/files_23/ourdev_512673.JPG
(原文件名:Ctrl.JPG) 源码:
点击此处下载 ourdev_512675.rar(文件大小:23K) (原文件名:lwGUI.rar) 移植:将GUI_hw.c 中接口函数替换即可.
功能:其它画线就不用讲了,菜单编程简单说明一下.程序亮点也在此(自认为)
//----------------------------------------------------------------------------------
//菜单结构
typedef struct
{
INT8U x; //菜单框架左上角X坐标
INT8U y; //菜单框架左上角Y坐标
INT8U width; //菜单框架宽度
INT8U height; //菜单框架高度
INT8U itemTop; //显示菜单框中最上面项
INT8U sItem; //当前选择项
INT8U itemMax; //最大顶数
const char *title; //菜单标题
const BMP **pbmp; //菜单项位图列表
const char ***ptext; //菜单项文本列表
void(*Paint)(void); //重绘菜单
void(*MegProc)(INT8U); //消息处理
}MENU;
1.每个菜单项都有一个重绘菜单函数void(*Paint)(void); 通过它可画出想要的任何菜单样式。源码中画了大图标菜单和选择条菜单样式。每个菜单都有一个消息响应函数void(*MegProc)(INT8U); 传入消息如上页下页返回等操作。
2.定义菜单中的项采用分开方式编程,可读性强如:
//==================================================================================
//定义菜单字符串
const char*sCtrl = "控制";
const char*sSet = "设置";
const char*sGame = "游戏";
const char*sHelp = "帮助";
const char*sCtrl2 = "智能插座 ";
const char*sCtrl3 = "浴缸 ";
const char*sCtrl4 = "脸盆 ";
const char*sCtrl5 = "空调 ";
//==================================================================================
//定义菜单文本
const char **MMenuText[]={&sCtrl,&sSet,&sGame,&sHelp};
const char **SCtrlText[]={&sCtrl2,&sCtrl3,&sCtrl4,&sCtrl5};
//==================================================================================
//定义菜单位图列表
const BMP *MMenuBmp[] ={&ctrl,&set,&game,&help};
//==================================================================================
//声明菜单消息处理事件
void MMegProc(INT8U meg);
void SCtrlMegProc(INT8U meg);
//==================================================================================
//定义菜单项
MENU MMenu=
{
0,
0,
128,
48,
0,
0,
4,
"Main menu",
MMenuBmp,
MMenuText,
GUI_MenuBmpPaint,
MMegProc
};
MENU SCtrl=
{
0,
0,
128,
48,
0,
0,
4,
"控制",
0,
SCtrlText,
GUI_MenuPaint,
SCtrlMegProc
};
//----------------------------------------------------------------------------------
// 主菜单消息处理
//描述: 处理主菜单消息
//参数:meg :消息
//返回: 无
//----------------------------------------------------------------------------------
void MMegProc(INT8U meg)
{
if(meg==KEY_UP)
{
if(MMenu.sItem>0)
MMenu.sItem--;
else
MMenu.sItem = MMenu.itemMax-1;
}
else if(meg==KEY_DOWN)
{
if(MMenu.sItem<(MMenu.itemMax-1))
MMenu.sItem++;
else
MMenu.sItem = 0;
}
else if(meg==KEY_EN)
{
if(MMenu.sItem==0)
{
pCMenu=&SCtrl;
GUI_Clear();
}
if(MMenu.sItem==2)
{
TetrisMain();
GUI_Clear();
BuzzerOn;
OSTimeDly(5);
BuzzerOff;
}
}
else if(meg==KEY_CLR)
{
GUI_Clear();
pCMenu = 0;
return;
}
pCMenu->Paint();
}
//----------------------------------------------------------------------------------
// 控制菜单消息处理
//描述: 处理控制菜单菜单消息
//参数:meg :消息
//返回: 无
//----------------------------------------------------------------------------------
void SCtrlMegProc(INT8U meg)
{
if(meg==KEY_UP)
{
if(SCtrl.sItem>0)
SCtrl.sItem--;
else
SCtrl.sItem = SCtrl.itemMax-1;
if(SCtrl.sItem<SCtrl.itemTop)
SCtrl.itemTop--;
if(SCtrl.sItem>SCtrl.itemTop+1)
SCtrl.itemTop= SCtrl.sItem-1;
pCMenu->Paint();
}
else if(meg==KEY_DOWN)
{
if(SCtrl.sItem<(SCtrl.itemMax-1))
SCtrl.sItem++;
else
SCtrl.sItem = 0;
if(SCtrl.sItem>1)
SCtrl.itemTop=SCtrl.sItem-1;
else
SCtrl.itemTop=0;
pCMenu->Paint();
}
else if(meg==KEY_CLR)
{
pCMenu=&MMenu;
GUI_Clear();
pCMenu->Paint();
}
else LCD_Refresh();
}
//================================================================================== 看来没什么用呀,自认为对认识图形用户界面编程还是有帮助的。自已顶一下吧? 有用呀,我特意登陆顶一下 手机登录中。每顶一次要好些流量,先mark,开电脑了看看。 LZ的照片实在是台朦胧了,不过感谢楼主的共享 mark,感谢楼主 这个程序是用在流明ARM系列测试的,带有ucos操作系统,上ucGUI太占用空间了,所以简简实现菜单功能。最初就是想做一个移植方便的简单界面操作程序。大部分菜单采用的常量操作点用空间小,做了常用的字体和小型汉字库。自已用起来感觉方便,对于本论坛的菜单编程序都有所了解,自认为有独特之处。将菜单数据和菜单显示分开,程序可读性较强。在不同的LCD上移植方便。特对于资源少的单片机做界面编程可简化大量工作。不过还不太完整。望大家做完整一些。 mark MARK GUI 顶~~~ 不错,写的很清晰。
不过很多地方也是参考别人的做,其实可以独创一些东西哦 是的参考了过些别人,但还是有很多还是多原创的。思路借用过ZLG的,看过很多GUI比如ucGUI,流明图形化库,微芯的GUI,这些都去了解过。总觉得有些不合我的要求。这些都采用了消息循环处理,功能强大但占用资源多。在小型点阵LCD中大都不会有触摸屏,这种应用中这的方案自认为比较方便。当初的目的就是为了这类程序做个通用微型界面操作。 不错,顶下! MARK mark 很好,顶下! PSP of mark 和zlg-gui的很像 mARK 学习一下啊。谢。 I love 顶GUI MARK!!!! MARK MARK 好帖,留着以后做界面用,以前的一次界面玩惨了 MARK mrak mark 记号 楼主可以公布一个测试的工程文件吗 mark 顶你~~ . MARK!GUI! mark 谢谢楼主,mark mark! 好东西mark mark! 个人认为这不能称之为GUI,是个菜单的框架,跟下面的这个相似,当然也可以认为是另外一种思路的实现
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=798580&bbs_page_no=1&search_mode=3&search_text=liandao&bbs_id=9999
"一个占用内存极少的菜单系统的实现"
当时就是在51的128BYTE的内存下实现的。
演示+文档+源代码
。。。
http://cache.amobbs.com/bbs_upload782111/files_26/ourdev_532831.gif
Demo (原文件名:menu.gif) 附件下载不了 ./emotion/em045.gif ./emotion/em046.gif
./emotion/em047.gif ./emotion/em048.gif
./emotion/em049.gif mark!~ MARK!!!!! 楼主用的是不是ST7920控制的液晶模块? 这个好啊 感谢了,看看再说
谢谢楼主,mark 需要备用 学习学习,有没有版本更新 MARK,这个做单片机简单控制时有用 {:lol:}{:lol:}顶你~~ 好东西 留用 感谢楼主的共享 好东西{:huffy:}{:smile:} 学过了…… 非常有用,顶一下! 谢谢分享 学习了,谢谢
页:
[1]