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

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

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

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

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

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

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

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

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

自己动手设计并实现一个linux嵌入式UI框架(设计)_第1张图片

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

 

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)