社区导航

 

搜索
查看: 5316|回复: 3

[讨论] 占用资源小的简单GUI的实现~~(转)

[复制链接]

6412

TA的帖子

19

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2009-12-22 09:52 | 显示全部楼层 |阅读模式
对于类似51资源有限的单片机和点陈LCD比较实用

1.jpg

2.jpg

3.jpg



源码: lwGUI.rar (22.95 KB, 下载次数: 179)

6412

TA的帖子

19

TA的资源

纯净的硅(初级)

Rank: 4

 楼主| 发表于 2009-12-22 09:54 | 显示全部楼层
移植:将GUI_hw.c 中接口函数替换即可.

功能:其它画线就不用讲了,菜单编程简单说明一下.程序亮点也在此(自认为)

  1. //----------------------------------------------------------------------------------
  2. //菜单结构
  3. typedef struct
  4. {
  5. INT8U x; //菜单框架左上角X坐标
  6. INT8U y; //菜单框架左上角Y坐标
  7. INT8U width; //菜单框架宽度
  8. INT8U height; //菜单框架高度

  9. INT8U itemTop; //显示菜单框中最上面项
  10. INT8U sItem; //当前选择项
  11. INT8U itemMax; //最大顶数

  12. const char *title; //菜单标题
  13. const BMP **pbmp; //菜单项位图列表
  14. const char ***ptext; //菜单项文本列表

  15. void(*Paint)(void); //重绘菜单
  16. void(*MegProc)(INT8U); //消息处理
  17. }MENU;

  18. 1.每个菜单项都有一个重绘菜单函数void(*Paint)(void); 通过它可画出想要的任何菜单样式。源码中画了大图标菜单和选择条菜单样式。每个菜单都有一个消息响应函数void(*MegProc)(INT8U); 传入消息如上页下页返回等操作。
  19. 2.定义菜单中的项采用分开方式编程,可读性强如:
  20. //==================================================================================
  21. //定义菜单字符串
  22. const char *sCtrl = "控制";
  23. const char *sSet = "设置";
  24. const char *sGame = "游戏";
  25. const char *sHelp = "帮助";

  26. const char *sCtrl2 = "智能插座 ";
  27. const char *sCtrl3 = "浴缸 ";
  28. const char *sCtrl4 = "脸盆 ";
  29. const char *sCtrl5 = "空调 ";
  30. //==================================================================================
  31. //定义菜单文本
  32. const char **MMenuText[] ={&sCtrl,&sSet,&sGame,&sHelp};
  33. const char **SCtrlText[] ={&sCtrl2,&sCtrl3,&sCtrl4,&sCtrl5};
  34. //==================================================================================
  35. //定义菜单位图列表
  36. const BMP *MMenuBmp[] ={&ctrl,&set,&game,&help};
  37. //==================================================================================
  38. //声明菜单消息处理事件
  39. void MMegProc(INT8U meg);
  40. void SCtrlMegProc(INT8U meg);
  41. //==================================================================================
  42. //定义菜单项
  43. MENU MMenu=
  44. {
  45. 0,
  46. 0,
  47. 128,
  48. 48,
  49. 0,
  50. 0,
  51. 4,
  52. "Main menu",
  53. MMenuBmp,
  54. MMenuText,
  55. GUI_MenuBmpPaint,
  56. MMegProc
  57. };
  58. MENU SCtrl=
  59. {
  60. 0,
  61. 0,
  62. 128,
  63. 48,
  64. 0,
  65. 0,
  66. 4,
  67. "控制",
  68. 0,
  69. SCtrlText,
  70. GUI_MenuPaint,
  71. SCtrlMegProc
  72. };
  73. //----------------------------------------------------------------------------------
  74. // 主菜单消息处理
  75. //描述: 处理主菜单消息
  76. //参数:meg :消息
  77. //返回: 无
  78. //----------------------------------------------------------------------------------
  79. void MMegProc(INT8U meg)
  80. {
  81. if(meg==KEY_UP)
  82. {
  83. if(MMenu.sItem>0)
  84. MMenu.sItem--;
  85. else
  86. MMenu.sItem = MMenu.itemMax-1;
  87. }
  88. else if(meg==KEY_DOWN)
  89. {
  90. if(MMenu.sItem<(MMenu.itemMax-1))
  91. MMenu.sItem++;

  92. else
  93. MMenu.sItem = 0;
  94. }
  95. else if(meg==KEY_EN)
  96. {
  97. if(MMenu.sItem==0)
  98. {
  99. pCMenu=&SCtrl;
  100. GUI_Clear();
  101. }
  102. if(MMenu.sItem==2)
  103. {
  104. TetrisMain();
  105. GUI_Clear();
  106. BuzzerOn;
  107. OSTimeDly(5);
  108. BuzzerOff;
  109. }
  110. }
  111. else if(meg==KEY_CLR)
  112. {
  113. GUI_Clear();
  114. pCMenu = 0;
  115. return;
  116. }
  117. pCMenu->Paint();
  118. }
  119. //----------------------------------------------------------------------------------
  120. // 控制菜单消息处理
  121. //描述: 处理控制菜单菜单消息
  122. //参数:meg :消息
  123. //返回: 无
  124. //----------------------------------------------------------------------------------
  125. void SCtrlMegProc(INT8U meg)
  126. {
  127. if(meg==KEY_UP)
  128. {
  129. if(SCtrl.sItem>0)
  130. SCtrl.sItem--;
  131. else
  132. SCtrl.sItem = SCtrl.itemMax-1;

  133. if(SCtrl.sItem
  134. SCtrl.itemTop--;
  135. if(SCtrl.sItem>SCtrl.itemTop+1)
  136. SCtrl.itemTop= SCtrl.sItem-1;
  137. pCMenu->Paint();
  138. }
  139. else if(meg==KEY_DOWN)
  140. {
  141. if(SCtrl.sItem<(SCtrl.itemMax-1))
  142. SCtrl.sItem++;

  143. else
  144. SCtrl.sItem = 0;

  145. if(SCtrl.sItem>1)
  146. SCtrl.itemTop=SCtrl.sItem-1;
  147. else
  148. SCtrl.itemTop=0;
  149. pCMenu->Paint();
  150. }
  151. else if(meg==KEY_CLR)
  152. {
  153. pCMenu=&MMenu;
  154. GUI_Clear();
  155. pCMenu->Paint();
  156. }
  157. else LCD_Refresh();
  158. }
  159. //==================================================================================
复制代码

回复

使用道具 举报

2186

TA的帖子

0

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

发表于 2009-12-23 22:38 | 显示全部楼层
很早就想写一个51的GUI,一直没能实施,看下你的构思。凑下热闹

回复

使用道具 举报

1

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2019-11-21 09:02 | 显示全部楼层
6666,感谢

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 1/7 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-5-27 09:56 , Processed in 0.186205 second(s), 25 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表