liguangqang 发表于 2009-12-10 09:49:39

占用资源小的简单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)

liguangqang 发表于 2009-12-10 09:52:33

源码:

点击此处下载 ourdev_512675.rar(文件大小:23K) (原文件名:lwGUI.rar)

liguangqang 发表于 2009-12-10 10:03:20

移植:将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();
}
//==================================================================================

liguangqang 发表于 2009-12-10 10:18:05

看来没什么用呀,自认为对认识图形用户界面编程还是有帮助的。自已顶一下吧?

lixuyongzd 发表于 2009-12-10 10:43:03

有用呀,我特意登陆顶一下

naipeng 发表于 2009-12-10 11:18:05

手机登录中。每顶一次要好些流量,先mark,开电脑了看看。

yangsen 发表于 2009-12-10 11:24:26

LZ的照片实在是台朦胧了,不过感谢楼主的共享

xyz2008 发表于 2009-12-10 11:50:15

mark,感谢楼主

liguangqang 发表于 2009-12-10 12:13:15

这个程序是用在流明ARM系列测试的,带有ucos操作系统,上ucGUI太占用空间了,所以简简实现菜单功能。最初就是想做一个移植方便的简单界面操作程序。大部分菜单采用的常量操作点用空间小,做了常用的字体和小型汉字库。自已用起来感觉方便,对于本论坛的菜单编程序都有所了解,自认为有独特之处。将菜单数据和菜单显示分开,程序可读性较强。在不同的LCD上移植方便。特对于资源少的单片机做界面编程可简化大量工作。不过还不太完整。望大家做完整一些。

oldmen 发表于 2009-12-10 12:15:32

mark

eduhf_123 发表于 2009-12-10 12:48:59

MARK GUI

menghong_4 发表于 2009-12-10 13:05:48

顶~~~

learner123 发表于 2009-12-10 13:28:23

不错,写的很清晰。
不过很多地方也是参考别人的做,其实可以独创一些东西哦

liguangqang 发表于 2009-12-10 14:07:26

是的参考了过些别人,但还是有很多还是多原创的。思路借用过ZLG的,看过很多GUI比如ucGUI,流明图形化库,微芯的GUI,这些都去了解过。总觉得有些不合我的要求。这些都采用了消息循环处理,功能强大但占用资源多。在小型点阵LCD中大都不会有触摸屏,这种应用中这的方案自认为比较方便。当初的目的就是为了这类程序做个通用微型界面操作。

eddia2000 发表于 2009-12-10 19:10:12

不错,顶下!

xingcai 发表于 2009-12-10 19:34:54

MARK

stefgq 发表于 2009-12-10 22:27:07

mark

touch_mcu 发表于 2009-12-10 22:44:02

很好,顶下!

onorg 发表于 2009-12-10 23:24:40

PSP of mark

ljt8015 发表于 2009-12-21 22:31:08

和zlg-gui的很像

huohuansong 发表于 2009-12-22 01:06:39

mARK

Excellence 发表于 2009-12-22 08:20:00

学习一下啊。谢。

mxtt 发表于 2010-1-1 13:59:40

I love

DIDADI 发表于 2010-1-1 15:30:28

顶GUI

a403154812 发表于 2010-1-1 17:11:00

MARK!!!!

quzegang 发表于 2010-1-1 18:14:09

MARK

shanyan 发表于 2010-1-1 20:20:27

MARK

ralfak 发表于 2010-1-1 23:23:33

好帖,留着以后做界面用,以前的一次界面玩惨了

chqing1361 发表于 2010-1-1 23:30:09

MARK

cgbabc 发表于 2010-1-2 08:26:53

mrak

hongyancl 发表于 2010-1-2 09:39:09

mark

zywy 发表于 2010-1-2 23:13:50

记号

lovely-teddy 发表于 2010-1-3 20:09:28

楼主可以公布一个测试的工程文件吗

cuikai12345 发表于 2010-1-3 21:51:26

mark

qilin3 发表于 2010-1-3 21:53:29

顶你~~

jchqxl 发表于 2010-2-4 23:22:48

.

cyxavr 发表于 2010-2-4 23:30:11

MARK!GUI!

ggyyll8683 发表于 2010-2-5 07:57:03

mark

zlutian 发表于 2010-2-5 08:11:33

谢谢楼主,mark

avrmk 发表于 2010-2-5 08:22:56

mark!

cat_li 发表于 2010-2-5 09:14:10

好东西mark

ljqlaq 发表于 2010-2-6 12:53:45

mark!

liandao 发表于 2010-2-6 21:52:18

个人认为这不能称之为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)

uoow 发表于 2011-5-20 15:56:19

附件下载不了        ./emotion/em045.gif                 ./emotion/em046.gif
        ./emotion/em047.gif                 ./emotion/em048.gif
        ./emotion/em049.gif

ljt8015 发表于 2011-5-20 16:15:24

mark!~

l09046162 发表于 2011-10-8 14:02:09

MARK!!!!!

jackrich 发表于 2011-10-9 09:38:35

楼主用的是不是ST7920控制的液晶模块?

215661599 发表于 2012-10-24 16:09:09

jetimchen 发表于 2012-10-24 16:29:31

这个好啊

王者归来 发表于 2012-12-5 01:37:44

感谢了,看看再说

fengtianzhifeng 发表于 2013-4-7 17:14:33


谢谢楼主,mark

zhj12688 发表于 2013-4-22 22:44:53

需要备用

SNOOKER 发表于 2013-4-22 23:07:15

学习学习,有没有版本更新

jpjavr 发表于 2013-6-17 23:11:49

MARK,这个做单片机简单控制时有用

zenghl 发表于 2013-6-17 23:14:53

{:lol:}{:lol:}顶你~~

wsm80828 发表于 2013-6-23 21:25:14

好东西 留用

211LIRUISHUO 发表于 2013-6-23 21:29:46

感谢楼主的共享

流浪人 发表于 2013-6-23 22:01:45

好东西{:huffy:}{:smile:}

滴答滴答下雨啦 发表于 2013-9-1 15:37:04

学过了……

滴答滴答下雨啦 发表于 2013-9-1 16:49:40

非常有用,顶一下!

wsm80828 发表于 2013-9-1 19:02:25

谢谢分享

LiLi-Long 发表于 2018-9-23 09:10:59

学习了,谢谢
页: [1]
查看完整版本: 占用资源小的简单GUI的实现。对于类似51资源有限的单片机和点陈LCD比较实用。