极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 17295|回复: 3

U8g 交互式菜单?!

[复制链接]
发表于 2015-11-13 02:08:03 | 显示全部楼层 |阅读模式
本帖最后由 迷你强 于 2015-11-13 14:49 编辑

在网上查到一篇老外的 关于用 Arduino 如何制作 交互式菜单的文章,非常好奇,但是不会玩。


文章里提到 u8glib 的 菜单库   M2tklib ,和 示例  here  链接 无法打开,顺便把链接贴上去,

    菜单库   M2tklib:    https://code.google.com/p/m2tklib/

     versoin 1.03 版本的示例     http://code.google.com/p/u8glib/ ... duino/Menu/Menu.pde

能翻墙的朋友帮帮忙。  我的空间    老来疯


下面是用 必应 翻译的,自认为无大错,感兴趣的朋友可以研究一下。

U8g 交互式菜单

交互式菜单
如何用 U8glib绘制和处理一个交互式选择菜单?
交互式图形编程提示
注: U8glib还有完整的菜单库, U8glib: M2tklib.。使用 M2tklib 创建菜单和其他数据输入对话框屏幕要 简单得多。此示例的其余部分将构建一个简单的菜单,只能通过使用从 U8glib 的图形基元。

示例
作为一个例子,本教程将演示如何生成一个带有四个条目的选择菜单。菜单将有一个光标栏,允许选择四行之一。以下图片显示光标栏上的最后一个条目:

图片在最后,  不会把他贴在这!  见谅!有谁会教教我
                              

这个here.  versoin 1.03 版本的示例也是 Arduino 发行版的一部分。Arduino 的完整源代码这里是可用的。

原理;
所有的 交互 (可变) 图形,应分成两个不同的程序:
draw(): 是画这幅画的过程。通常这样一幅画面将取决于一些全局变量。例如选择菜单将取决于光标栏的位置。
update (): 是一个变量,影响图片的程序。在本例中我们需要一个过程,其中修改光标栏的位置。

下面两个函数必须放置在不同的位置:
Draw()   函数, 必须使用图片的内循环。
update () 函数, 必须在图片循环外使用 。

代码
绘制菜单

下面的代码示例使用"C"API。该代码绘制菜单包括光标栏。光标栏的位置存储在全局变量 menu_current 中。


  1. //*****************************************
  2. #define MENU_ITEMS 4char *menu_strings[MENU_ITEMS] = { "First Line", "Second Item", "3333333", "abcdefg" };

  3. void draw_menu(void) {  uint8_t i, h;
  4. u8g_uint_t w, d;  
  5. u8g_SetFont(&u8g, u8g_font_6x13);
  6. u8g_SetFontRefHeightText(&u8g);
  7. u8g_SetFontPosTop(&u8g);
  8. h = u8g_GetFontAscent(&u8g)-u8g_GetFontDescent(&u8g);

  9. w = u8g_GetWidth(&u8g);  for( i = 0; i < MENU_ITEMS; i++ ) {        // draw all menu items   
  10. d = (w-u8g_GetStrWidth(&u8g, menu_strings[i]))/2;   
  11. u8g_SetDefaultForegroundColor(&u8g);   

  12. if ( i == menu_current ) {                                                                // current selected menu item      
  13. u8g_DrawBox(&u8g, 0, i*h+1, w, h);                                               // draw cursor bar   
  14.   u8g_SetDefaultBackgroundColor(&u8g);   
  15. }   
  16. u8g_DrawStr(&u8g, d, i*h, menu_strings[i]);  
  17. }
  18. }

  19. //*********************************************************************

  20. 更新菜单
  21. 外部按钮,触摸屏或其他传感器可能修改光标栏位置:

  22. //********************************************
  23. void update_menu(void){ if ( up ) {     

  24. menu_current++;     
  25. if ( menu_current >= MENU_ITEMS )   
  26.    
  27. menu_current = 0; } else if ( down ) {     
  28. if ( menu_current == 0 )      
  29. menu_current = MENU_ITEMS;     
  30. menu_current--;
  31. }
  32. }

  33. //*****************************************

  34. 主程序

  35. //************************************************************
  36. draw_menu()&#160;and&#160;update_menu()&#160;are put together in the main procedure:

  37. ...   

  38. u8g_FirstPage(&u8g);   

  39. do {     
  40. draw_menu();                                     // inside picture loop   
  41. }

  42. while( u8g_NextPage(&u8g) );   
  43. update_menu();                               // outside picture loop

  44.     ...

  45. Code Optimization
  46. //**************************************************************

  47. 上面的示例中,可以使用菜单,不过,代码还有一个小问题: 他总是刷新菜单。这可能会导致一些闪烁现象。如果已更改光标栏:,它将更好的重绘菜单,

  48. 主要程序无法更改

  49. //**************************************************************:

  50. ...   

  51. if (  menu_redraw_required != 0 ) {     
  52. u8g_FirstPage(&u8g);   
  53.   
  54. do {        
  55. draw_menu();                              // inside picture loop      
  56. }
  57. while( u8g_NextPage(&u8g) );     

  58. menu_redraw_required = 0;      // menu updated, reset redraw flag   
  59. }   
  60. update_menu();                         // outside picture loop

  61.     ...

  62. //**************************************************************

  63. 当然,必须在 update_menu() 程序中设置 menu_redraw_required:

  64. //***************************************************************

  65. void update_menu(void){

  66. if ( up ) {      
  67. menu_current++;     
  68. if ( menu_current >= MENU_ITEMS )      
  69. menu_current = 0;      
  70. menu_redraw_required = 1;
  71. }
  72. else if ( down ) {     
  73. if ( menu_current == 0 )      
  74. menu_current = MENU_ITEMS;     
  75. menu_current--;      
  76. menu_redraw_required = 1;
  77. }
  78. }

  79. //*************************************************
复制代码

结论:
菜单和其他交互式图形应实行两个不同的程序:
绘制过程,取决于一些全局变量。
更新过程中,可以修改这些全局变量。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2015-11-13 07:22:36 | 显示全部楼层
不错先收藏再说
回复 支持 反对

使用道具 举报

发表于 2015-11-13 14:41:44 | 显示全部楼层
不错的东西,,,,谢谢楼主分享过来
回复 支持 反对

使用道具 举报

发表于 2015-11-17 12:02:54 | 显示全部楼层
收藏了,之前为这个弄得焦头烂额。。。已经曲线救国了,还是收藏,谢谢楼主
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-16 23:23 , Processed in 0.077652 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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