跳到主要内容位置

页面系统

1.数据结构抽象#

定义页面结构体,成员包括名字、运行函数:

#ifndef _PAGE_MANAGER_H
#define _PAGE_MANAGER_H
typedef struct PageAction
{
char *name;
void (*Run)(void *pParams);
struct PageAction *ptNext;
} PageAction, *PPageAction;
#endif

2.页面管理#

实现两个函数:基本逻辑是,上层代码调用PagesRegister注册所有页面,下层的页面就会调用RegisterPage把自己注册进链表;然后,上层再调用Page函数,传入名字获取页面结构体,就可以使用Page->Run()运行页面。

  • PagesRegister:把多个页面注册进链表

    void PagesRegister(void)
    {
    extern void MainPageRegister(void);
    MainPageRegister();
    }
    • mainpage.c

      void MainPageRegister(void)
      {
      RegisterPage(&g_tMainPage);
      }

      page_manager.c

      void RegisterPage(PPageAction ptPageAction)
      {
      g_ptPages = ptPageAction;
      ptPageAction->ptNext = g_ptPages;
      }
  • Page(name):取出某个页面

    PPageAction Page(char *name)
    {
    PPageAction ptTmp = g_ptPages;
    while (ptTmp)
    {
    if (strcmp(ptTmp->name, name) == 0)
    {
    return ptTmp;
    }
    ptTmp = ptTmp->ptNext;
    }
    return NULL;
    }

我们实现一个简单的主页面mainpage.c:构造一个PageAction结构体,提供一个注册函数给页面管理调用

#include <stdio.h>
#include "page_manager.h"
static void MainPageRun(void *pParams)
{
printf("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);
}
static PageAction g_tMainPage = {
.name = "main",
.Run = MainPageRun,
};
void MainPageRegister(void)
{
RegisterPage(&g_tMainPage);
}

3.测试#

APP:

#include <unistd.h>
#include <linux/fb.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include "page_manager.h"
int main(int argc, char **argv)
{
PPageAction ptPage;
PagesRegister();
ptPage = Page("main");
if (ptPage)
{
ptPage->Run(NULL);
}
return 0;
}

测试通过:


请点击左侧菜单(移动端为右下角)选择要查看的所有笔记吧。