看了“自己動手設計並實現一個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是基礎控制元件
為什麼結構體要這麼定義,在接下來具體實現中,與程式碼結合起來就明白了。
設計部分先到這裡了,下一篇就是講具體控制元件的實現。