看了“自己动手设计并实现一个linux嵌入式UI框架”显然没有尽兴,因为还没有看到庐山真面目,那我今天继续,先来说说,我用到了哪些知识背景。如:C语言基础知识,尤其是指针、函数指针、内存分布,linux 基础知识、如消息队列、framebuffer、多线程、多线程同步、等,数据结构、算法(如链表、队列等),window .netframework 框架设计思想,设计模式如 mvc、观察者、单例、工厂等。知识点有点多,每个知识点有机的组合在一起,形成了一个知识网,构成了一个系统。以上提到的知识点,如果不是很了解推荐看看。

一般来说UI框架需要包含哪些组件?我来整理下:

首先UI框架是要展现给用户看的,那么一个窗口肯定是要有的;

其次,是在该窗口应该还可以显示其他控件如按钮、文本框等;

然后是支持交互操作,那么它就支持事情处理,如触摸事件、按键事件等;

最后框架是给开发人员开发应用用的,那么要有友好的接口。

我设计的这个嵌入式UI框架以表达设计思想,逻辑处理为目的,内部设计与实现会简单明了,尽量减少复杂度。

“一年之计在于春,一天之计在于晨”,一个UI框架之计在与数据结构,都硕算法+数据结构就是程序的灵魂,我们就来个千里之行,始于数据结构。

我划分了几个部分,如上图所示,取最关键的成员(结构与方法),描述会比较啰嗦,我直接列出公共的数据结构:

typedef  void(*EventHandler)(void *object, void *msg);

typedef  int (*MatchHandler )(void *object1, void *object2);

 

typedef struct _Rectangle 

{

    int x;    

    int y;

    int width;

    int height;    

} Rectangle,*RectanglePtr;

 

//控件类型

typedef enum

{

    WIN_NULL=0,                // NUll

    WIN_WINDOW,                // window

    WIN_STATIC,                // static

    WIN_EDIT,                // edit

    WIN_BUTTON                // button

 

}ControlType;

 

typedef enum

{

    LEFT=0,  

    MIDDLE,

    RIGHT,   

    TOP,        

    BOTTOM  

}TextAlign;

 

typedef struct _WinBaseBufInfo

{

    //待绘内存起始地址

    unsigned char     *pdstbuf;

    unsigned int     dstpaddr;

    int             width;

    int             height;

    //一行的内存长度

      int             stride;

}WinBaseBufInfo,*WinBaseBufInfoPtr;

 

typedef struct _BaseControl

{

    Rectangle       rect;

    unsigned char   visible;

    unsigned char   enable;

    

    EventHandler       eventcallback;

    EventHandler       keyeventcallback;

    void* parent;

    void*  tag;

}BaseControl,*BaseControlPtr;

 

//链表节点

typedef struct  ControlsList

{

    ControlType contype;

    void *pcontrol;

    struct ControlsList *pnext;

    struct ControlsList *pprev;    

}ControlsList;

先介绍Utils的作用,DrawJpeg与DrawText的作用,直接望文生义,就是绘图、绘字,但里面会涉及libjpeg、点阵字库。细节先不细究。

Eventhandler的作用就是处理消息事件(触摸、按键)

Application就是程序信息

Window、Button、Edit是基础控件

为什么结构体要这么定义,在接下来具体实现中,与代码结合起来就明白了。

设计部分先到这里了,下一篇就是讲具体控件的实现。

自己动手设计并实现一个linux嵌入式UI框架(设计)的更多相关文章

  1. 自己动手设计并实现一个linux嵌入式UI框架

    一直以来都是使用现成的UI框架,如微软的window.QT等,因为它有各种控件(如button.window.edit等)都已经封装实现好了.我们只要拿来用就是了,也一直认为它很神圣,没有深入了解它背 ...

  2. 游戏UI框架设计(一) : 架构设计理论篇

    游戏UI框架设计(一) ---架构设计理论篇 前几天(2017年2月)看到一篇文章,国内王健林.马云等大咖们看好的未来十大最有"钱途"产业中,排名第一的就是"泛娱乐&qu ...

  3. 游戏UI框架设计(二) : 最简版本设计

    游戏UI框架设计(二) --最简版本设计 为降低难度决定先讲解一个最简版本,阐述UI框架的核心设计理念.这里先定义三个核心功能: 1:UI窗体的自动加载功能. 2:缓存UI窗体. 3:窗体生命周期(状 ...

  4. 游戏UI框架设计(三) : 窗体的层级管理

    游戏UI框架设计(三) ---窗体的层级管理 UI框架中UI窗体的"层级管理",最核心的问题是如何进行窗体的显示管理.窗体(预设)的显示我们前面定义了三种类型: 普通.隐藏其他.反 ...

  5. 游戏UI框架设计(四) : 模态窗体管理

    游戏UI框架设计(四) --模态窗体管理 我们在开发UI窗体时,对于"弹出窗体"往往因为需要玩家优先处理弹出小窗体,则要求玩家不能(无法)点击"父窗体",这种窗 ...

  6. 游戏UI框架设计(五): 配置管理与应用

    游戏UI框架设计(五) --配置管理与应用 在开发企业级游戏/VR/AR产品时候,我们总是希望可以总结出一些通用的技术体系,框架结构等,为简化我们的开发起到"四两拨千金"的作用.所 ...

  7. 游戏UI框架设计(7): 资源国际化技术

    游戏UI框架设计(7) --资源国际化技术 说起"资源国际化"技术,个人认为可以追述到微软Window2000 PC操作系统的发布,在这之前windows98操作系统的开发都是先由 ...

  8. 游戏UI框架设计(6): 消息传递中心

    游戏UI框架设计(6) --消息传递中心 最近一直忙于一个益智类游戏的研发工作,所以博客有段时间没有更新了.经过朋友的督促,决定这两天立刻完成最后的两篇博客讲解(UI框架).说起“消息传递中心”,或者 ...

  9. Linux设备驱动框架设计

    引子 Linux操作系统的一大优势就是支持数以万计的芯片设备,大大小小的芯片厂商工程师都在积极地向Linux kernel提交设备驱动代码.能让这个目标得以实现,这背后隐藏着一个看不见的技术优势:Li ...

随机推荐

  1. Asp.Net 自定义 httpmodel 中间件 管道

    https://msdn.microsoft.com/en-us/library/aa719858(v=vs.71).aspx http://www.cnblogs.com/jimmyzhang/ar ...

  2. Mysql EXPLAIN列的解释

    转自:http://blog.chinaunix.net/uid-540802-id-3419311.html explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择 ...

  3. if __name__ == '__main__'的作用和原理

    最简单的理解就是这样: __name__ 是当前模块名,当模块被直接运行时,模块名为 __main__. 所以 if __name__ == '__main__' 这句话的意思就是当前模块被直接运行时 ...

  4. 使用vue-cli创建一个vue项目

    安装vue-cli npm install -g @vue/cli 1, 使用vue创建一个项目 vue create luffy 2, 安装所需的插件 npm install vue-router ...

  5. 解剖Nginx·自动脚本篇(2)设置初始变量脚本 auto/init

    在configure中运行完auto/options脚本后,接着运行auto/init脚本,其中所做的工作如下. 1 Makefile文件名变量 默认情况下是: objs/Makefile 代码如下: ...

  6. Cocoapods 版本升级

    和往常一样使用 Cocoapods ,执行命令: $ pod install #输出信息 /System/Library/Frameworks/Ruby.framework/Versions/2.0/ ...

  7. 如何在MyEclipse中使用Maven

    https://jingyan.baidu.com/article/fd8044facb9bc85031137a91.html?qq-pf-to=pcqq.group Maven不仅是一个构建工具,还 ...

  8. 关于HDFS默认block块大小

    这是有疑惑的一个问题,因为在董西成的<Hadoop技术内幕--深入解析MapReduce架构设计与实现原理>中提到这个值是64M,而<Hadoop权威指南>中却说是128M,到 ...

  9. 架构之路:nginx与IIS服务器搭建集群实现负载均衡

    http://blog.csdn.net/zhanghan18333611647/article/details/50811980

  10. code1154 能量项链

    d[l][i]表示:从第i个珠子开始,连续l个珠子合并后释放的最大能量 状态转移方程d[l][i] = d[j][i] + d[l-j][i+j] + w[i]*w[i+j]*w[i+l],j从1到l ...