【STM界面】简易轻型界面控制系统

 

基础逻辑由两个.C组成

gg_menu.c作为系统主控,用于连接各个界面,提供界面切换,对所有界面下发信号。

xxx.c 作为子界面,用于使用show,hide,close等基本功能,并且提供接口让用户添加界面。

不同与普通的界面方式:

如果屏幕有4个界面并由四个按键控制普通方法:获取按键值->判断当前界面->通过很长的switch case填写,

该框架会把每个显示界面和四个操作按键结合成一个整体当做一个完整的界面放在一个.c里,这样修改按键处理事件的时候可以快速的定位界面和对应按键处理函数。理论上说也用少量的空间换取了时间。

gg_menu.c部分框架  修改Map 里面对应的界面和处理函数

typedef struct
{
    uint8_t page;//界面
    void (*action)(void);//界面对应功能处理
    uint8_t worksta;//界面当前工作状态
    
} GG_MenuBobyHandle;//用于连接界面

static GG_MenuBobyHandle s_menuBobyHandleMap[] = 
{
    {Menu1,Menu1Action,CLOSE},//简单的创建三个界面自测
    {Menu2,Menu2Action,CLOSE},
    {Menu3,Menu3Action,CLOSE},

};

    MENUx->sendSign = GG_MENU_SendKeySign;  
    MENUx->lastSignWork = GG_MENU_LastSignWork; 
    MENUx->lastSign_ThreadWork = GG_MENU_BackThreadSignWork;   
    
}

static void Menu1Action(void)
{
    MENU1.keyupdate(&MENU1);//对应事件函数默认调用对应界面的keyupdate方法
    
}

static void Menu2Action(void)
{   
    MENU2.keyupdate(&MENU2); 
    
} 

static void Menu3Action(void)
{   
    MENU3.keyupdate(&MENU3); 
    
} 

.h修改 总界面数,目前时三个,和把名称放在MenuPageName


#define BACKSTAGE_THREAD         1   //如果没有界面在隐藏时有特殊处理可以关闭
#define MENU_SUMPAGE             3   //总界面数

typedef enum
{
  Menu1,
  Menu2,
  Menu3

} GG_MenuPageName;//界面名称对应每个界面的PAGE_ID

xx界面.c  需要修改对应的 id ,信号总和(按键数目),对应的按键操作和功能放在Map里,然后改写下面的对应action,还有init

#define PAGE_ID        Menu1//界面号和GG_MenuPageName对应
#define PAGE_SUMSIGN   4//总信号数,统计一下,怕溢出(包含第一个预留的NULL)

typedef enum
{
  KEY_DOWN = 1,
  KEY_UP,
  RUN_THREAD = 103//动画后台等效果+100后排序
} GG_KeySignSta;//当前界面总信号事件

typedef struct
{
    uint8_t sign;//信号
    void (*action)(void);//信号行为
    
} GG_MenuBobyHandle;

static const GG_MenuBobyHandle s_menuBobyHandleMap[] = 
{
    {NULL,NULL},
    {KEY_DOWN,Menu1Action},
    {KEY_UP,Menu2Action},
    {RUN_THREAD,Menu3Action},

};

static void GG_MenuDefShowCallback(void)//界面默认窗口
{

    
}

static void GG_MenuDefCloseCallback(void)//界面默认窗口
{

    
}

static void GG_MenuDefHideCallback(void)
{


}
static void Menu1Action(void)
{
    printf("1-111\r\n");
    MENU1.close(&MENU1);
    MENU2.show(&MENU2);
    
}

static void Menu2Action(void)
{
    printf("1-222\r\n");   
    MENU1.hide(&MENU1);
} 

static void Menu3Action(void)
{
    printf("1-333\r\n");   
    
} 

.h 修改一下init名称,这个内容不需要修改,单独开放修改是为了防止有极特殊界面

void GG_MENU1_Init(GG_MENUPAGE_TypeDef  *MENUx);

/*
*   作者: GG
*   邮箱: guotaoyuan1998@163.com
*   VX: qingya_1998
*   创建日期: 22/07/20
*   更新日期: 22/07/22
*   版本: V1.3
*           更新说明:
*           (BETA):新增了界面传递和信号传递防溢出的限制            
*           (BETA):修改了HIDE状态的处理方式   
*           (BETA):新增了界面传递和信号传递防溢出的限制 
*   ps: 计划下个版本内容:信号新增缓存区 GG_MenuBobyHandle类可以新添加一个当前界面状态值,或者光标选中值
*                         便于判断光标位置,更加快速实现下拉菜单等功能
*/

抛砖引玉吧,详细代码可以加v白嫖获取,也可以等下个版本发布在csdn资料下载区。界面代码终身免费维护并可以对新界面提供方案设计(尽力而为)。

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值