菜单的属性与封装


/* 将菜单的属性和操作"封装"在一起 */ 


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(); 

}



typedef void (*lpFunction) ( ); /* 定义一个无参数、无返回类型的 */ /* 函数指针类型 */


 lpFunction lpReset = (lpFunction)0xF000FFF0; /* 定义一个函数指针,指向*/ /* CPU启动后所执行第一条指令的位置 */


 lpReset(); /* 调用函数 */


在以上的程序中,我们根本没有看到任何一个函数实体,但是我们却执行了这样的函数调用:lpReset(),它实际上起到了"软重启"的作用,跳转到CPU启动后第一条要执行的指令的位置。

记住:函数无它,唯指令集合耳;你可以调用一个没有函数体的函数,本质上只是换一个地址开始执行指令!


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值