menu.c
上传用户:zfj3589
上传日期:2022-07-13
资源大小:635k
文件大小:14k
源码类别:

微处理器开发

开发平台:

C/C++

  1. /****************************************************************************************
  2. * 文件名:MENU.C
  3. * 功能:菜单显示及操作(下拉式菜单)。
  4. * 作者:黄绍斌
  5. * 日期:2004.02.26
  6. * 备注:使用GUI_SetBackColor()函数设置显示颜色及背景色。
  7. ****************************************************************************************/
  8. #include "config.h"
  9. #if  GUI_MenuDown_EN==1
  10. /****************************************************************************
  11. * 名称:GUI_MMenuDraw()
  12. * 功能:显示主菜单,加上边框。
  13. * 入口参数:men 主菜单句柄
  14. * 出口参数:返回0表示操作失败,返回1表示操作成功
  15. ****************************************************************************/
  16. uint8  GUI_MMenuDraw(MMENU *men)
  17. {  WINDOWS  *mwin;
  18.    uint8  i;
  19.    uint8  xx;
  20.    /* 参数过滤 */
  21.    if( (men->no)==0 ) return(0);
  22.    
  23.    mwin = men->win; // 取得窗口句柄
  24.    /* 判断是否可以显示主菜单 */
  25.    if( (mwin->hight)<50 ) return(0);
  26.    if( (mwin->with)<50 ) return(0);
  27.    
  28.    /* 画菜单条,并显示菜主单 */
  29.    GUI_HLine(mwin->x, mwin->y + 17, mwin->x + mwin->with - 1, disp_color);
  30.    
  31.    xx = mwin->x;
  32.    for(i=0; i<(men->no); i++)
  33.    {  if( (xx+MMENU_WIDTH) > (mwin->x + mwin->with) ) return(0);
  34.       
  35.       GUI_PutNoStr(xx+2, mwin->y + 9, men->str[i], 4); // 书写主菜单文字
  36.       xx += MMENU_WIDTH;
  37.       GUI_RLine(xx, mwin->y + 7, mwin->y + 17, disp_color); // 显示主菜单分界线      
  38.    }
  39.    
  40.    return(1);
  41. }
  42. /****************************************************************************
  43. * 名称:GUI_MMenuSelect()
  44. * 功能:当前主菜单,加下划线,表示当前主菜单。
  45. * 入口参数:men 主菜单句柄
  46. *          no 所选的主菜单项
  47. * 出口参数:无
  48. ****************************************************************************/
  49. void  GUI_MMenuSelect(MMENU *men, uint8 no)
  50. {  WINDOWS  *mwin;
  51.    uint8  xx;
  52.    /* 参数过滤 */
  53.    if( (men->no)==0 ) return;
  54.    if( no>(men->no) ) return;
  55.   
  56.    mwin = men->win; // 取得窗口句柄
  57.    /* 判断是否可以显示主菜单 */
  58.    if( (mwin->hight)<50 ) return;
  59.    if( (mwin->with)<50 ) return;
  60.    
  61.    /* 显示下划线 */
  62.    xx = mwin->x + no*MMENU_WIDTH;
  63.    GUI_HLine(xx+1, mwin->y + 22-1, xx+MMENU_WIDTH- 1, disp_color);
  64. }
  65. /****************************************************************************
  66. * 名称:GUI_MMenuNSelect()
  67. * 功能:取消当前主菜单,去除下划线。
  68. * 入口参数:men 主菜单句柄
  69. *          no 所选的主菜单项
  70. * 出口参数:无
  71. ****************************************************************************/
  72. void  GUI_MMenuNSelect(MMENU *men, uint8 no)
  73. {  WINDOWS  *mwin;
  74.    uint8  xx;
  75.    /* 参数过滤 */
  76.    if( (men->no)==0 ) return;
  77.    if( no>(men->no) ) return;
  78.   
  79.    mwin = men->win; // 取得窗口句柄
  80.    /* 判断是否可以显示主菜单 */
  81.    if( (mwin->hight)<50 ) return;
  82.    if( (mwin->with)<50 ) return;
  83.    
  84.    /* 显示下划线 */
  85.    xx = mwin->x + no*MMENU_WIDTH;
  86.    GUI_HLine(xx+1, mwin->y + 22-1, xx+MMENU_WIDTH- 1, back_color);
  87. }
  88. /****************************************************************************
  89. * 名称:GUI_SMenuDraw()
  90. * 功能:显示子菜单,加上边框。
  91. * 入口参数:men 子菜单句柄
  92. * 出口参数:返回0表示操作失败,返回1表示操作成功
  93. ****************************************************************************/
  94. uint8  GUI_SMenuDraw(SMENU *men)
  95. {  WINDOWS  *mwin;
  96.    uint32   xx, yy;
  97.    uint8    i;
  98.    mwin = men->win;
  99.    /* 判断是否可以显示主菜单 */
  100.    if( (mwin->hight)<50 ) return(0);
  101.    if( (mwin->with)<50 ) return(0);
  102.     
  103.    /* 画菜子单项。下拉子菜单,以向左下拉为原则,若右边溢出则以右下拉显示 */
  104.    xx = mwin->x;
  105.    xx += (men->mmenu_no)*MMENU_WIDTH;
  106.    yy = mwin->y + 22;
  107.    yy +=  (men->no) * 11 + 2;
  108.    if( (xx+SMENU_WIDTH) <= (mwin->x + mwin->with - 1) ) 
  109.    {  /* 以左下拉为原则显示子菜单 */
  110.       if( (men->mmenu_no) == 0 )
  111.       {  GUI_RLine(xx+SMENU_WIDTH, mwin->y + 22, yy, disp_color);
  112.          GUI_HLine(xx, yy, xx+SMENU_WIDTH, disp_color);
  113.       }
  114.       else
  115.       {  GUI_Rectangle(xx, mwin->y + 22, xx+SMENU_WIDTH, yy, disp_color);
  116.       }
  117.       GUI_HLine(xx+1, mwin->y + 22, xx+MMENU_WIDTH-1, back_color);
  118.       
  119.    }
  120.    else
  121.    {  /* 以右下拉为原则 */
  122.       if( (xx+MMENU_WIDTH) == (mwin->x + mwin->with - 1) )
  123.       {  GUI_RLine(xx-(SMENU_WIDTH-MMENU_WIDTH), mwin->y + 22, yy, disp_color);
  124.          GUI_HLine(xx-(SMENU_WIDTH-MMENU_WIDTH), yy, xx+MMENU_WIDTH, disp_color);
  125.          
  126.       }
  127.       else
  128.       {  GUI_Rectangle(xx-(SMENU_WIDTH-MMENU_WIDTH), mwin->y + 22, xx+MMENU_WIDTH, yy, disp_color);
  129.       }
  130.       GUI_HLine(xx+1, mwin->y + 22, xx+MMENU_WIDTH-1, back_color);
  131.       
  132.       xx = xx-(SMENU_WIDTH-MMENU_WIDTH);
  133.    }
  134.    
  135.    /* 显示菜单文字 */
  136.    xx++;
  137.    yy = mwin->y + 22 + 2;
  138.    for(i=0; i<(men->no); i++)
  139.    {  if( i == (men->state) ) // 判断所选择的菜单项
  140.       {  /* 显示背景色 */
  141.          GUI_RectangleFill(xx, yy, xx+SMENU_WIDTH-2, yy+10, disp_color);
  142.          /* 显示菜单字符 */
  143.          GUI_ExchangeColor();
  144.          GUI_PutNoStr(xx+1, yy+1, men->str[i], 8); // 书写子菜单文字
  145.          GUI_ExchangeColor();
  146.       }
  147.       else
  148.       {  /* 显示背景色 */
  149.          GUI_RectangleFill(xx, yy, xx+SMENU_WIDTH-2, yy+10, back_color);
  150.          /* 显示菜单字符 */
  151.          GUI_PutNoStr(xx+1, yy+1, men->str[i], 8); // 书写子菜单文字
  152.       }   
  153.       
  154.       yy += 11;
  155.    }
  156.     
  157.    return(1);
  158. }
  159. /****************************************************************************
  160. * 名称:GUI_SMenuSelect()
  161. * 功能:选择新的子菜单。
  162. * 入口参数:men 子菜单句柄
  163. *          old_no 原先选择的子菜单项
  164. *    new_no 现要选择的子菜单项
  165. * 出口参数:无
  166. ****************************************************************************/
  167. void  GUI_SMenuSelect(SMENU *men, uint8 old_no, uint8 new_no)
  168. {  WINDOWS  *mwin;
  169.    uint8  xx, yy;
  170.    /* 参数过滤 */ 
  171.    if(old_no==new_no) return;
  172.    xx = men->no;
  173.    if( (old_no>xx) || (new_no>xx) ) return;
  174.    
  175.    /* 设置新的选择的子菜单项 */
  176.    men->state = new_no;
  177.    
  178.    /* 进行菜单反相显示 */
  179.    mwin = men->win;  
  180.    xx = mwin->x;
  181.    xx +=  (men->mmenu_no)*MMENU_WIDTH;
  182.    if( (xx+SMENU_WIDTH) > (mwin->x + mwin->with - 1) ) 
  183.    {  /* 以右下拉为原则显示子菜单,所以xx设置在左端 */
  184.       xx = xx-(SMENU_WIDTH-MMENU_WIDTH);
  185.    }
  186.    xx++;
  187.  
  188.    /* 取消原子菜单选择 */  
  189.    yy = mwin->y + 22 + 2;
  190.    yy += old_no*11;
  191.    GUI_RectangleFill(xx, yy, xx+SMENU_WIDTH-2, yy+10, back_color);
  192.    GUI_PutNoStr(xx+1, yy+1, men->str[old_no], 8);
  193.    /* 选择新的子菜单 */
  194.    yy = mwin->y + 22 + 2;
  195.    yy += new_no*11;
  196.    GUI_RectangleFill(xx, yy, xx+SMENU_WIDTH-2, yy+10, disp_color);
  197.    GUI_ExchangeColor();
  198.    GUI_PutNoStr(xx+1, yy+1, men->str[new_no], 8);
  199.    GUI_ExchangeColor();
  200. }
  201. /****************************************************************************
  202. * 名称:GUI_SMenuHide()
  203. * 功能:消隐子菜单项。
  204. * 入口参数:men 子菜单句柄
  205. * 出口参数:返回0表示操作失败,返回1表示操作成功
  206. ****************************************************************************/
  207. uint8  GUI_SMenuHide(SMENU *men)
  208. {  WINDOWS  *mwin;
  209.    uint8    xx, yy;
  210.    mwin = men->win;
  211.    /* 判断是否可以显示主菜单 */
  212.    if( (mwin->hight)<50 ) return(0);
  213.    if( (mwin->with)<50 ) return(0);
  214.     
  215.    /* 画菜子单项。下拉子菜单,以向左下拉为原则,若右边溢出则以右下拉显示 */
  216.    xx = mwin->x;
  217.    xx +=  (men->mmenu_no)*MMENU_WIDTH;
  218.    yy = mwin->y + 22;
  219.    yy +=  (men->no) * 11 + 2;
  220.    if( (xx+SMENU_WIDTH) <= (mwin->x + mwin->with - 1) ) 
  221.    {  /* 以左下拉为原则显示子菜单 */
  222.       if( (men->mmenu_no) == 0 )
  223.       {  GUI_RectangleFill(xx+1, mwin->y + 22+1, xx+SMENU_WIDTH, yy, back_color);
  224.       }
  225.       else
  226.       {  GUI_RectangleFill(xx, mwin->y + 22+1, xx+SMENU_WIDTH, yy, back_color);
  227.       }
  228.       GUI_HLine(xx+1, mwin->y + 22, xx+MMENU_WIDTH-1, disp_color);
  229.    }
  230.    else
  231.    {  /* 以右下拉为原则 */
  232.       if( (xx+MMENU_WIDTH) == (mwin->x + mwin->with - 1) )
  233.       {  GUI_RectangleFill(xx-(SMENU_WIDTH-MMENU_WIDTH), mwin->y + 22+1, xx+MMENU_WIDTH-1, yy, back_color);
  234.       }
  235.       else
  236.       {  GUI_RectangleFill(xx-(SMENU_WIDTH-MMENU_WIDTH), mwin->y + 22+1, xx+MMENU_WIDTH, yy, back_color);
  237.       }
  238.       GUI_HLine(xx+1, mwin->y + 22, xx+MMENU_WIDTH-1, disp_color);
  239.    }
  240.     
  241.    return(1);
  242. }
  243. #endif
  244. #if  GUI_MenuIco_EN==1
  245. /*--  调入了一幅图像:C:WINDOWSDesktopOK.bmp  --*/
  246. /*--  宽度x高度=49x14  --*/
  247. /*--  宽度不是8的倍数,现调整为:宽度x高度=56x14  --*/
  248. uint8  const  button_ok[] = 
  249. {
  250. 0x07,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x18,0x00,0x00,0x00,0x00,0x0C,0x00,0x20,0x00,
  251. 0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x0E,0x76,0x00,0x01,0x00,0x80,0x00,0x11,0x24,
  252. 0x00,0x00,0x80,0x80,0x00,0x11,0x28,0x00,0x00,0x80,0x80,0x00,0x11,0x30,0x00,0x00,
  253. 0x80,0x80,0x00,0x11,0x28,0x00,0x00,0x80,0x80,0x00,0x11,0x28,0x00,0x00,0x80,0x80,
  254. 0x00,0x11,0x24,0x00,0x00,0x80,0x40,0x00,0x0E,0x76,0x00,0x01,0x00,0x20,0x00,0x00,
  255. 0x00,0x00,0x02,0x00,0x18,0x00,0x00,0x00,0x00,0x0C,0x00,0x07,0xFF,0xFF,0xFF,0xFF,
  256. 0xF0,0x00
  257. };
  258. /*--  调入了一幅图像:C:WINDOWSDesktopOK1.bmp  --*/
  259. /*--  宽度x高度=49x14  --*/
  260. /*--  宽度不是8的倍数,现调整为:宽度x高度=56x14  --*/
  261. uint8  const  button_ok1[] = 
  262. {
  263. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x1F,0xFF,
  264. 0xFF,0xFF,0xFF,0xFC,0x00,0x3F,0xFF,0xF1,0x89,0xFF,0xFE,0x00,0x7F,0xFF,0xEE,0xDB,
  265. 0xFF,0xFF,0x00,0x7F,0xFF,0xEE,0xD7,0xFF,0xFF,0x00,0x7F,0xFF,0xEE,0xCF,0xFF,0xFF,
  266. 0x00,0x7F,0xFF,0xEE,0xD7,0xFF,0xFF,0x00,0x7F,0xFF,0xEE,0xD7,0xFF,0xFF,0x00,0x7F,
  267. 0xFF,0xEE,0xDB,0xFF,0xFF,0x00,0x3F,0xFF,0xF1,0x89,0xFF,0xFE,0x00,0x1F,0xFF,0xFF,
  268. 0xFF,0xFF,0xFC,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,
  269. 0x00,0x00
  270. };
  271. /*--  调入了一幅图像:C:WINDOWSDesktopCancle.bmp  --*/
  272. /*--  宽度x高度=49x14  --*/
  273. /*--  宽度不是8的倍数,现调整为:宽度x高度=56x14  --*/
  274. uint8  const  button_cancle[] =
  275. {
  276. 0x07,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x18,0x00,0x00,0x00,0x00,0x0C,0x00,0x20,0x00,
  277. 0x00,0x00,0x00,0x02,0x00,0x40,0xF0,0x00,0x00,0x07,0x01,0x00,0x81,0x10,0x00,0x00,
  278. 0x01,0x00,0x80,0x81,0x00,0x00,0x00,0x01,0x00,0x80,0x81,0x01,0x9E,0x1C,0x61,0x00,
  279. 0x80,0x81,0x02,0x49,0x24,0x91,0x00,0x80,0x81,0x01,0xC9,0x20,0xF1,0x00,0x80,0x81,
  280. 0x12,0x49,0x20,0x81,0x00,0x80,0x40,0xE1,0xFD,0x9C,0x77,0xC1,0x00,0x20,0x00,0x00,
  281. 0x00,0x00,0x02,0x00,0x18,0x00,0x00,0x00,0x00,0x0C,0x00,0x07,0xFF,0xFF,0xFF,0xFF,
  282. 0xF0,0x00
  283. };
  284. /*--  调入了一幅图像:C:WINDOWSDesktopCancle1.bmp  --*/
  285. /*--  宽度x高度=49x14  --*/
  286. /*--  宽度不是8的倍数,现调整为:宽度x高度=56x14  --*/
  287. uint8  const  button_cancle1[] =
  288. {
  289. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x1F,0xFF,
  290. 0xFF,0xFF,0xFF,0xFC,0x00,0x3F,0x0F,0xFF,0xFF,0xF8,0xFE,0x00,0x7E,0xEF,0xFF,0xFF,
  291. 0xFE,0xFF,0x00,0x7E,0xFF,0xFF,0xFF,0xFE,0xFF,0x00,0x7E,0xFE,0x61,0xE3,0x9E,0xFF,
  292. 0x00,0x7E,0xFD,0xB6,0xDB,0x6E,0xFF,0x00,0x7E,0xFE,0x36,0xDF,0x0E,0xFF,0x00,0x7E,
  293. 0xED,0xB6,0xDF,0x7E,0xFF,0x00,0x3F,0x1E,0x02,0x63,0x88,0x3E,0x00,0x1F,0xFF,0xFF,
  294. 0xFF,0xFF,0xFC,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,
  295. 0x00,0x00
  296. };
  297. /****************************************************************************
  298. * 名称:GUI_Button49x14()
  299. * 功能:显示49*14按钮。
  300. * 入口参数: x 指定显示位置,x坐标
  301. *           y 指定显示位置,y坐标
  302. *           dat 显示的数据地址
  303. * 出口参数:无
  304. ****************************************************************************/
  305. void  GUI_Button49x14(uint32 x, uint32 y, uint8 *dat)
  306. {  GUI_LoadPic(x, y, (uint8 *)dat, 49, 14);
  307. }
  308. /****************************************************************************
  309. * 名称:GUI_Button_OK()
  310. * 功能:显示49*14按钮"OK"。
  311. * 入口参数: x 指定显示位置,x坐标
  312. *           y 指定显示位置,y坐标
  313. * 出口参数:无
  314. ****************************************************************************/
  315. void  GUI_Button_OK(uint32 x, uint32 y)
  316. {  GUI_LoadPic(x, y, (uint8 *) button_ok, 49, 14);
  317. }
  318. /****************************************************************************
  319. * 名称:GUI_Button_OK1()
  320. * 功能:显示49*14按钮,选择状态的"OK"。
  321. * 入口参数: x 指定显示位置,x坐标
  322. *           y 指定显示位置,y坐标
  323. * 出口参数:无
  324. ****************************************************************************/
  325. void  GUI_Button_OK1(uint32 x, uint32 y)
  326. {  GUI_LoadPic(x, y, (uint8 *) button_ok1, 49, 14);
  327. }
  328. /****************************************************************************
  329. * 名称:GUI_Button_Cancle()
  330. * 功能:显示49*14按钮"Cancle"。
  331. * 入口参数: x 指定显示位置,x坐标
  332. *           y 指定显示位置,y坐标
  333. * 出口参数:无
  334. ****************************************************************************/
  335. void  GUI_Button_Cancle(uint32 x, uint32 y)
  336. {  GUI_LoadPic(x, y, (uint8 *) button_cancle, 49, 14);
  337. }
  338. /****************************************************************************
  339. * 名称:GUI_Button_Cancle1()
  340. * 功能:显示49*14按钮,选择状态的"Cancle"。
  341. * 入口参数: x 指定显示位置,x坐标
  342. *           y 指定显示位置,y坐标
  343. * 出口参数:无
  344. ****************************************************************************/
  345. void  GUI_Button_Cancle1(uint32 x, uint32 y)
  346. {  GUI_LoadPic(x, y, (uint8 *) button_cancle1, 49, 14);
  347. }
  348. /****************************************************************************
  349. * 名称:GUI_MenuIcoDraw()
  350. * 功能:显示图标菜单。
  351. * 入口参数:ico 图标菜单句柄
  352. * 出口参数:返回0表示操作失败,返回1表示操作成功
  353. ****************************************************************************/
  354. uint8  GUI_MenuIcoDraw(MENUICO *ico)
  355. {  
  356.    /* 参数过滤 */
  357.    if( ( (ico->x)<5 ) || ( (ico->x)>(GUI_LCM_XMAX-37 ) ) ) return(0); // 显示起始地址判断
  358.    if( ( (ico->icodat)==NULL ) || ( (ico->title)==NULL ) ) return(0); // 显示数据内容判断
  359.    
  360.    GUI_LoadPic(ico->x, ico->y, (uint8 *) ico->icodat, 32, 32); // 显示ICO图
  361.    GUI_HLine(ico->x-5, ico->y+32, ico->x+37, back_color); // 显示一空行
  362.    if( (ico->state)==0 )
  363.    {  GUI_LoadPic(ico->x-5, ico->y+33, (uint8 *) ico->title, 42, 13);
  364.    }
  365.    else
  366.    {  GUI_LoadPic1(ico->x-5, ico->y+33, (uint8 *) ico->title, 42, 13);
  367.    }
  368.    
  369.    return(1);
  370. }
  371. #endif