Menu.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. /********************************************************************************
  2. * File Name: Menu.c
  3. * Function Describe: Menu 控件
  4. * Relate Module: GUI.c
  5. * Writer: Shliangwen
  6. * Date: 2016-1-8
  7. *******************************************************************************/
  8. #include "includes.h"
  9. /******************************************************************
  10. 返回串str在LCD显示所占的x坐标长度
  11. *******************************************************************/
  12. int GetStrXLen(char *str)
  13. {
  14. unsigned char ch;
  15. unsigned short len=0;
  16. // while ((ch=*str++)){
  17. // if(ch=='M')len+=16;
  18. // else len+=8;
  19. // if(len>LCD_WIDTH-1){//191
  20. // len=LCD_WIDTH-1;
  21. // break;
  22. // }
  23. // }
  24. while ((ch=*str++)){
  25. if(ch=='M')len+=12;
  26. else if(ch>='A'&&ch<='Z')len+=8;
  27. else if(ch>='a'&&ch<='z')len+=8;
  28. else if(ch>='0'&&ch<='9')len+=8;
  29. else if(ch>=0x20&& ch<=0x60)len+=8; //特殊字符
  30. else len+=6;
  31. }
  32. return (unsigned char )len;
  33. }
  34. int GetStrXLen16(char *str)
  35. {
  36. unsigned char ch;
  37. unsigned short len=0;
  38. while ((ch=*str++)){
  39. if(ch=='M')len+=16;
  40. else len+=8;
  41. if(len>LCD_WIDTH-1){//191
  42. len=LCD_WIDTH-1;
  43. break;
  44. }
  45. }
  46. // while ((ch=*str++)){
  47. // if(ch=='M')len+=12;
  48. // else if(ch>='A'&&ch<='Z')len+=8;
  49. // else if(ch>='a'&&ch<='z')len+=8;
  50. // else if(ch>='0'&&ch<='9')len+=8;
  51. // else if(ch>=0x20&& ch<=0x60)len+=8; //特殊字符
  52. // else len+=6;
  53. // }
  54. return (unsigned char )len;
  55. }
  56. #if 1
  57. /*************************************************************************
  58. *居中显示
  59. ***************************************************************************/
  60. void ShowCaption(const char *str,unsigned char y)
  61. {
  62. char buf[30];
  63. int len;
  64. len=GetStrXLen((char *)str);
  65. y=STATUS_BAR_HEIGH;
  66. GuiShowStr((LCD_WIDTH-len)/2,y,str,0x01,0);
  67. }
  68. void ShowCaption16(const char *str,unsigned char y)
  69. {
  70. int len;
  71. len=GetStrXLen16((char *)str);
  72. GuiShowStr((LCD_WIDTH-len)/2,y,str,0x10,0);
  73. }
  74. /*************************************************************************
  75. MenuInit
  76. ***************************************************************************/
  77. void MenuInit(struct SUT_MENU *p,const char **item)
  78. {
  79. unsigned char i,ch;
  80. unsigned char index;
  81. //calculate menu item number
  82. p->item = item;
  83. i = 0;
  84. for(;;)
  85. {
  86. ch=p->item[i][0];
  87. if(ch==0)break;
  88. i ++;
  89. }
  90. i=i-1;
  91. p->itemnum = i+1;
  92. p->pgaenum=i/MENU_ROW;
  93. if(p->pgaenum%MENU_ROW)p->pgaenum+=1;
  94. //
  95. if(g_ulKeyValue==KEY_PANEL_EXIT||UI_Stack.OK_back)
  96. {
  97. index=PullUiStack(&UI_Stack);
  98. // if(index>9){
  99. // p->page=2;
  100. // p->handle=index;//
  101. //
  102. // }else if(index>4){
  103. // p->page=1;
  104. // p->handle=index;//
  105. // }else{
  106. // p->page=0;
  107. // p->handle=index;
  108. // }
  109. p->page=(index+1)/5;
  110. p->handle=index;
  111. UI_Stack.OK_back=0;
  112. }else if(g_ulKeyValue==KEY_PANEL_MENU){
  113. p->page=0;
  114. p->handle=0;
  115. }
  116. // p->page = 0;
  117. // p->handle = 0;
  118. MenuShow(p);
  119. }
  120. /********************************************************************************
  121. * Function:MenuShowItem
  122. * display menu item
  123. *******************************************************************************/
  124. void MenuShowItem(struct SUT_MENU *p,unsigned char handle)
  125. {
  126. unsigned char y,hand;
  127. hand=handle % MENU_ROW;
  128. y=MENU_TOPY+hand*(12+MENU_SPACE);//16
  129. GuiClearArea((LCD_WIDTH-MENU_BAR_LEN)/2,y-1,MENU_BAR_LEN,18);
  130. //ShowCaption(p->item[handle],y);
  131. GuiShowStr(0,y,p->item[handle],0x01,0);
  132. }
  133. /********************************************************************************
  134. * Function:MenuShowBar
  135. * display a bar
  136. *******************************************************************************/
  137. void MenuShowBar(struct SUT_MENU *p,char type)
  138. {
  139. unsigned char x,y,h,handle;
  140. char *str;
  141. short len;
  142. x=0;
  143. handle=p->handle%MENU_ROW;
  144. y=MENU_TOPY+handle*(12+MENU_SPACE);//16
  145. //GuiReverseRect(x,y-1,MENU_BAR_LEN,18);
  146. str=(char *)p->item[p->handle];
  147. len=GetStrXLen(str);
  148. //GuiShowStr((LCD_WIDTH-len)/2, y, str, 1, type);
  149. if(type)GuiFillRect(x,y,140,y+14,COLOR_SELECT_BLUE);
  150. else GuiFillRect(x,y,140,y+14,COLOR_WHITE_BACK);
  151. GuiShowStr(x, y, str, 1, type);
  152. }
  153. /********************************************************************************
  154. * Function:MenuShow
  155. * display menu
  156. *******************************************************************************/
  157. void MenuShow(struct SUT_MENU *p)
  158. {
  159. unsigned char i,j;
  160. u16 x,y;
  161. j=p->page*MENU_ROW;
  162. for(i = j ; i <j+MENU_ROW ; i ++)
  163. {
  164. if(i >= p->itemnum){
  165. y=MENU_TOPY+(i % MENU_ROW)*(12+MENU_SPACE);//16
  166. //GuiClearArea((LCD_WIDTH-MENU_BAR_LEN)/2,y-1,MENU_BAR_LEN,(12+MENU_SPACE));//
  167. GuiClearArea(0,y-1,MENU_BAR_LEN,(12+MENU_SPACE));
  168. }else{
  169. MenuShowItem(p,i);
  170. }
  171. }
  172. MenuShowBar(p,1);
  173. //显示箭头
  174. x=MENU_BAR_LEN+(LCD_WIDTH-MENU_BAR_LEN)/2;
  175. if(p->page>0){
  176. GuiShowArrow(x+10,MENU_TOPY,8,3);//向上箭头
  177. }else{
  178. GuiClearArea(x,MENU_TOPY,18,8+10);
  179. }
  180. y=MENU_TOPY+MENU_ROW*(12+MENU_SPACE);
  181. if(p->page<(p->pgaenum-1)){
  182. GuiShowArrow(x+10,y-2,8,4);//向下箭头
  183. }else{
  184. GuiClearArea(x,y-8-2,19,8);
  185. }
  186. }
  187. /********************************************************************************
  188. * Function:MenuResponse
  189. *******************************************************************************/
  190. unsigned long MenuResponse(struct SUT_MENU *p)
  191. {
  192. unsigned char temp;
  193. switch(g_ulKeyValue)
  194. {
  195. case KEY_PANEL_UP:
  196. MenuShowBar(p,0);
  197. if(p->handle==0)p->handle=(p->itemnum-1);
  198. else p->handle --;
  199. temp=p->page;
  200. p->page=p->handle/MENU_ROW;
  201. if(temp!=p->page)MenuShow(p);
  202. else MenuShowBar(p,1);
  203. break;
  204. case KEY_PANEL_DOWN:
  205. MenuShowBar(p,0);
  206. p->handle ++;
  207. if(p->handle>=p-> itemnum)p->handle=0;
  208. temp = p->page;
  209. p->page=p->handle/MENU_ROW;
  210. if(temp!=p->page)MenuShow(p);
  211. else MenuShowBar(p,1);
  212. break;
  213. // case KEY_PANEL_OK:
  214. // return MENU_KEY_ENTER;
  215. //
  216. // case KEY_PANEL_EXIT:
  217. // return MENU_KEY_BACK;
  218. //
  219. default:
  220. return g_ulKeyValue;
  221. break;
  222. }
  223. return 0;
  224. }
  225. /********************************************************************************
  226. * Function:MenuGetHandle
  227. * get menu 's handle
  228. *******************************************************************************/
  229. unsigned char MenuGetHandle(struct SUT_MENU *p)
  230. {
  231. unsigned char handle;
  232. handle = p->handle;
  233. /*
  234. for(i = 0 ; i <= p->handle ; i ++)
  235. {
  236. if(p->item[i][0] == 0)handle --;
  237. }
  238. */
  239. return handle;
  240. }
  241. #endif