- 所有页面均看作菜单
- 菜单变量定义如下:
//-菜单结构体(注意!这里的菜单含义比较广,标定零点页面也可能看作是菜单)- typedef struct MenuStructure { unsigned char ItemIndex; //-菜单项索引号- unsigned int ParentMenuID; //-父菜单的编号(编号请参照枚举定义PagesID)- unsigned int ChildMenuID; //-子菜单的编号- unsigned int MenuName[2][16]; //-菜单项的内容(GB2312编码)- void (*SpecialDeal)(const struct MenuStructure *pMenu, MenuPara *pMenuPara, int LineIndex); void (*SetKeyDeal) (const struct MenuStructure *pMenu, MenuPara *pMenuPara); void (*UpKeyDeal) (const struct MenuStructure *pMenu, MenuPara *pMenuPara); void (*DownKeyDeal) (const struct MenuStructure *pMenu, MenuPara *pMenuPara); void (*IncKeyDeal) (const struct MenuStructure *pMenu, MenuPara *pMenuPara); void (*DecKeyDeal) (const struct MenuStructure *pMenu, MenuPara *pMenuPara); }MenuStructure;
其中ItemIndex是菜单项的索引号,不一定跟RowIndex一致,可能存在同一行中有两个选择项的情况(或者是存在宏编译时,占位置,此时如果通过RowIndex来处理则代码不能通用);MenuName[2][16]是针对双语,且LCD宽为64个dot,8个字符;SpecialDeal是针对显示内容的特殊绘制,如果菜单显示的为固定内容,此项为空;xxxKeyDeal则为按键处理,最好物理按键对应,有多少个按键,定义多少个函数。
//-菜单参数(注意!必须和菜单结构体相匹配)- typedef struct MenuPara { signed char RowIndex; //-菜单行焦点索引号- signed char ColumnIndex; //-菜单列焦点索引号(以英文字符大小为单位)- unsigned char RowReverseSwitch; //-Enable/Disable- unsigned char ColumnReverseSwitch; //-Enable/Disable- unsigned char ColumnReverseUnit; //-列焦点的单位(以英文字符大小为单位)- const unsigned char NumOfRows; //-菜单项的行数- const unsigned char IsMultiplex; //-- void (*Reset)(struct MenuPara *pMenuPara); }MenuPara;
其中RowIndex表示当前光标(焦点)所在的行,下移或者上移后,RowIndex随之改变;
ColumnIndex是菜单列焦点起始索引号,有时只需要某一行的部分获取焦点;RowReverseSwitch、ColumnReverseSwitch和ColumnRerverseUnit是设置焦点时所用,跟ColumnIndex配合使用,如果需要一整行获得焦点,则RowReverseSwtich=Enable,ColumnIndex+ColumnReverSwitch+ColumnRerverseUnit无效;如果需要一行中的部分获得焦点,则RowReverseSwitch=Disable,ColumnReverseSwitch=Enable,然后以ColumnIndex为起始,ColumnReverseUnit为大小的列获得焦点。其中列焦点和列焦点单位均是以英文字符为单位。
NumOfRows是所有菜单项所占的行数,不是菜单项总数,存在两个菜单项占1行的情况
IsMultiplex是按键复用时用,例如加减键有时也作为上移下移键