这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » C语言编程技巧---菜单操作

共2条 1/1 1 跳转至

C语言编程技巧---菜单操作

专家
2011-01-28 09:38:31     打赏
给出这样的一个系统:

要求以键盘上的"← →"键切换菜单焦点,当用户在焦点处于某菜单时,若
敲击键盘上的OK、CANCEL键则调用该焦点菜单对应之处理函数。我曾经傻傻地
这样做着:
/* 按下OK键 */
void onOkKey()
{
/* 判断在什么焦点菜单上按下Ok键,调用相应处理函数 */
Switch(currentFocus)
{
case MENU1:
                       menu1OnOk();
                       break;
case MENU2:
                       menu2OnOk();
                       break;

}
}
/* 按下Cancel键 */
void onCancelKey()
{
/* 判断在什么焦点菜单上按下Cancel键,调用相应处理函数 */
Switch(currentFocus)
{
case MENU1:
                       menu1OnCancel();
                       break;
case MENU2:
                       menu2OnCancel();
                       break;
  …
}
}
终于有一天,我这样做了:
/* 将菜单的属性和操作"封装"在一起 */
typedef struct tagSysMenu
{
   char *text; /* 菜单的文本 */
   BYTE xPos; /* 菜单在LCD上的x坐标 */
   BYTE yPos; /* 菜单在LCD上的y坐标 */
   void (*onOkFun)(); /* 在该菜单上按下ok键的处理函数指针 */
   void (*onCancelFun)(); /* 在该菜单上按下cancel键的处理函数指针 */
}SysMenu, *LPSysMenu;
当我定义菜单时,只需要这样:
static SysMenu menu[MENU_NUM] =
{
   {
   "menu1", 0, 48, menu1OnOk, menu1OnCancel
   }
   ,
   {
   " menu2", 7, 48, menu2OnOk, menu2OnCancel
   }
   ,
   {
   " menu3", 7, 48, menu3OnOk, menu3OnCancel
   }
   ,
   {
   " menu4", 7, 48, menu4OnOk, menu4OnCancel
   }
    …
};
OK键和CANCEL键的处理变成:
/* 按下OK键 */
void onOkKey()
{
   menu[currentFocusMenu].onOkFun();
}
/* 按下Cancel键 */
void onCancelKey()
{
   menu[currentFocusMenu].onCancelFun();
}
程序被大大简化了,也开始具有很好的可扩展性!我们仅仅利用了面向对象
中的封装思想,就让程序结构清晰,其结果是几乎可以在无需修改程序的情况下
在系统中添加更多的菜单,而系统的按键处理函数保持不变。



关键词: 语言     编程技巧     菜单     操作    

菜鸟
2011-02-18 13:13:04     打赏
2楼
哥,你还没写完呢,人家上面有好写呢。不如把原文发下来啦

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]