嵌入式C语言之屏幕操作之菜单篇

在c语言中使用面向对象的思想 ,软件结构会有何等改观呢?

菜单一   菜单二   菜单三   菜单四  菜单..

要求以键盘上的左右箭头键切换菜单焦点,当用户在焦点处于某菜单时,若敲击键盘上的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",14,48,menu2OnOk,menu2OnCancel 
       }
 
       ,
       ...
}
;

Ok键和Cancel键的处理变成:

 

/**/ /*按下OK键*/
void  onOkKey()
{
     menu[currentFocusMenu].onOkFun();
}

/*按下Cancel键*/
void  onCancelKey()
{
      menu[currentFoucusMenu].onCancelFunI();
}

 

程序别大大的花间了,也看是具有很好的可扩展性!我们仅仅用了面向对象中的封装思想,就让程序结构清晰,其结果是几乎可以在无需修改程序的情况下在系统中添加更多的菜单,而系统的按键处理函数保持不变。

 

你可能感兴趣的:(嵌入式C语言之屏幕操作之菜单篇)