菜单范式

  • 所有页面均看作菜单
  • 菜单变量定义如下:
//-菜单结构体(注意!这里的菜单含义比较广,标定零点页面也可能看作是菜单)-
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是按键复用时用,例如加减键有时也作为上移下移键

原文地址:https://www.cnblogs.com/smileintheday/p/6425363.html