Menu.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  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. #if 1
  35. /*************************************************************************
  36. *居中显示
  37. ***************************************************************************/
  38. void ShowCaption(const char *str,unsigned char y)
  39. {
  40. char buf[30];
  41. int len;
  42. len=GetStrXLen((char *)str);
  43. y=STATUS_BAR_HEIGH;
  44. GuiShowStr((LCD_WIDTH-len)/2,y,str,0x01,0);
  45. }
  46. /*************************************************************************
  47. MenuInit
  48. ***************************************************************************/
  49. void MenuInit(struct SUT_MENU *p,const char **item)
  50. {
  51. unsigned char i,ch;
  52. unsigned char index;
  53. //calculate menu item number
  54. p->item = item;
  55. i = 0;
  56. for(;;)
  57. {
  58. ch=p->item[i][0];
  59. if(ch==0)break;
  60. i ++;
  61. }
  62. i=i-1;
  63. p->itemnum = i+1;
  64. p->pgaenum=i/MENU_ROW;
  65. if(p->pgaenum%MENU_ROW)p->pgaenum+=1;
  66. //
  67. if(g_ulKeyValue==KEY_PANEL_EXIT||UI_Stack.OK_back)
  68. {
  69. index=PullUiStack(&UI_Stack);
  70. if(index>9){
  71. p->page=2;
  72. p->handle=index;//
  73. }
  74. else if(index>4){
  75. p->page=1;
  76. p->handle=index;//
  77. }else{
  78. p->page=0;
  79. p->handle=index;
  80. }
  81. UI_Stack.OK_back=0;
  82. }else {
  83. p->page=0;
  84. p->handle=0;
  85. }
  86. //if(g_ulKeyValue==KEY_PANEL_MENU||g_ulKeyValue==KEY_OPTION)
  87. // p->page = 0;
  88. // p->handle = 0;
  89. MenuShow(p);
  90. }
  91. /********************************************************************************
  92. * Function:MenuShowItem
  93. * display menu item
  94. *******************************************************************************/
  95. void MenuShowItem(struct SUT_MENU *p,unsigned char handle)
  96. {
  97. unsigned char y,hand;
  98. hand=handle % MENU_ROW;
  99. y=MENU_TOPY+hand*(12+MENU_SPACE);//16
  100. GuiClearArea((LCD_WIDTH-MENU_BAR_LEN)/2,y-1,MENU_BAR_LEN,18);
  101. //ShowCaption(p->item[handle],y);
  102. GuiShowStr(0,y,p->item[handle],0x01,0);
  103. }
  104. /********************************************************************************
  105. * Function:MenuShowBar
  106. * display a bar
  107. *******************************************************************************/
  108. void MenuShowBar(struct SUT_MENU *p,char type)
  109. {
  110. unsigned char x,y,h,handle;
  111. char *str;
  112. short len;
  113. x=0;
  114. handle=p->handle%MENU_ROW;
  115. y=MENU_TOPY+handle*(12+MENU_SPACE);//16
  116. //GuiReverseRect(x,y-1,MENU_BAR_LEN,18);
  117. str=(char *)p->item[p->handle];
  118. len=GetStrXLen(str);
  119. //GuiShowStr((LCD_WIDTH-len)/2, y, str, 1, type);
  120. if(type)GuiFillRect(x,y,140,y+14,COLOR_SELECT_BLUE);
  121. else GuiFillRect(x,y,140,y+14,COLOR_WHITE_BACK);
  122. GuiShowStr(x, y, str, 1, type);
  123. }
  124. /********************************************************************************
  125. * Function:MenuShow
  126. * display menu
  127. *******************************************************************************/
  128. void MenuShow(struct SUT_MENU *p)
  129. {
  130. unsigned char i,j;
  131. u16 x,y;
  132. j=p->page*MENU_ROW;
  133. for(i = j ; i <j+MENU_ROW ; i ++)
  134. {
  135. if(i >= p->itemnum){
  136. y=MENU_TOPY+(i % MENU_ROW)*(12+MENU_SPACE);//16
  137. //GuiClearArea((LCD_WIDTH-MENU_BAR_LEN)/2,y-1,MENU_BAR_LEN,(12+MENU_SPACE));//
  138. GuiClearArea(0,y-1,MENU_BAR_LEN,(12+MENU_SPACE));
  139. }else{
  140. MenuShowItem(p,i);
  141. }
  142. }
  143. MenuShowBar(p,1);
  144. //显示箭头
  145. x=MENU_BAR_LEN+(LCD_WIDTH-MENU_BAR_LEN)/2;
  146. if(p->page>0){
  147. GuiShowArrow(x+10,MENU_TOPY,8,3);//向上箭头
  148. }else{
  149. GuiClearArea(x,MENU_TOPY,18,8+10);
  150. }
  151. y=MENU_TOPY+MENU_ROW*(12+MENU_SPACE);
  152. if(p->page<(p->pgaenum-1)){
  153. GuiShowArrow(x+10,y-2,8,4);//向下箭头
  154. }else{
  155. GuiClearArea(x,y-8-2,19,8);
  156. }
  157. }
  158. /********************************************************************************
  159. * Function:MenuResponse
  160. *******************************************************************************/
  161. unsigned long MenuResponse(struct SUT_MENU *p)
  162. {
  163. unsigned char temp;
  164. switch(g_ulKeyValue)
  165. {
  166. case KEY_PANEL_UP:
  167. MenuShowBar(p,0);
  168. if(p->handle==0)p->handle=(p->itemnum-1);
  169. else p->handle --;
  170. temp=p->page;
  171. p->page=p->handle/MENU_ROW;
  172. if(temp!=p->page)MenuShow(p);
  173. else MenuShowBar(p,1);
  174. break;
  175. case KEY_PANEL_DOWN:
  176. MenuShowBar(p,0);
  177. p->handle ++;
  178. if(p->handle>=p-> itemnum)p->handle=0;
  179. temp = p->page;
  180. p->page=p->handle/MENU_ROW;
  181. if(temp!=p->page)MenuShow(p);
  182. else MenuShowBar(p,1);
  183. break;
  184. // case KEY_PANEL_OK:
  185. // return MENU_KEY_ENTER;
  186. //
  187. // case KEY_PANEL_EXIT:
  188. // return MENU_KEY_BACK;
  189. //
  190. default:
  191. return g_ulKeyValue;
  192. break;
  193. }
  194. return 0;
  195. }
  196. /********************************************************************************
  197. * Function:MenuGetHandle
  198. * get menu 's handle
  199. *******************************************************************************/
  200. unsigned char MenuGetHandle(struct SUT_MENU *p)
  201. {
  202. unsigned char handle;
  203. handle = p->handle;
  204. /*
  205. for(i = 0 ; i <= p->handle ; i ++)
  206. {
  207. if(p->item[i][0] == 0)handle --;
  208. }
  209. */
  210. return handle;
  211. }
  212. #endif