前言:
前面我們已經(jīng)把顯示系統(tǒng)、輸入系統(tǒng)、文字系統(tǒng)搭建好了,現(xiàn)在我們就要給它實現(xiàn)按鈕操作了,也就是搭建UI系統(tǒng),下面讓我們一起實現(xiàn)UI系統(tǒng)的搭建吧
目錄
一、按鈕數(shù)據(jù)結(jié)構(gòu)抽象
ui.h
二、按鍵編程?
1.button.c
?2.disp_manager.c
3.?disp_manager.h
三、單元測試
1.ui_test.c
2.unittest下的Makefile
3.?ui下的Makefile
4.頂層目錄下的Makefile
四、上板測試
1.ubuntu上
2. 開發(fā)板上
3.運(yùn)行效果:
一、按鈕數(shù)據(jù)結(jié)構(gòu)抽象
1.所謂UI,就是User Interface(用戶界面),有圖像界面(GUI)等
2.我們的UI系統(tǒng),就是構(gòu)造各類GUI元素,比如按鈕(目前只實現(xiàn)按鈕)
3.怎么描述一個按鈕呢?
????????3.1 它的位置、大小怎么表示?
????????3.2 怎么繪制它?
????????3.3 用戶點擊它之后,如何處理?
ui.h
#ifndef _UI_H
#define _UI_H
#include <common.h>
#include <disp_manager.h>
#include <input_manager.h>
#define BUTTON_DEFAULT_COLOR 0xff0000
#define BUTTON_PRESSED_COLOR 0x00ff00
#define BUTTON_TEXT_COLOR 0x000000
struct Button;
typedef int (*ONDRAW_FUNC)(struct Button *ptButton, PDispBuff ptDispBuff);
typedef int (*ONPRESSED_FUNC)(struct Button *ptButton, PDispBuff ptDispBuff, PInputEvent ptInputEvent);
typedef struct Button {
char *name;
int status;
Region tRegion;
ONDRAW_FUNC OnDraw;
ONPRESSED_FUNC OnPressed;
}Button, *PButton;
void InitButton(PButton ptButton, char *name, PRegion ptRegion, ONDRAW_FUNC OnDraw, ONPRESSED_FUNC OnPressed);
#endif
第9~11行:定義紅綠黑三種顏色
第20行:描述結(jié)構(gòu)體的名字
第22行:描述按鈕區(qū)域的位置
第23行:OnDraw:提供一個繪制函數(shù)
第24行:OnPressed:點擊以后執(zhí)行某些函數(shù)
二、按鍵編程?
1.點擊按鈕后怎么處理,是業(yè)務(wù)系統(tǒng)的事情
2.所以應(yīng)該提供一個InitButton函數(shù),讓用戶可以提供OnPressed函數(shù)
3.上層代碼通過下面3個函數(shù)使用按鈕
1.button.c
#include <ui.h>
static int DefaultOnDraw(struct Button *ptButton, PDispBuff ptDispBuff)
{
/* 繪制底色 */
DrawRegion(&ptButton->tRegion, BUTTON_DEFAULT_COLOR);
/* 居中寫文字 */
DrawTextInRegionCentral(ptButton->name, &ptButton->tRegion, BUTTON_TEXT_COLOR);
/* flush to lcd/web */
FlushDisplayRegion(&ptButton->tRegion, ptDispBuff);
return 0;
}
static int DefaultOnPressed(struct Button *ptButton, PDispBuff ptDispBuff, PInputEvent ptInputEvent)
{
unsigned int dwColor = BUTTON_DEFAULT_COLOR;
ptButton->status = !ptButton->status;
if (ptButton->status)
dwColor = BUTTON_PRESSED_COLOR;
/* 繪制底色 */
DrawRegion(&ptButton->tRegion, dwColor);
/* 居中寫文字 */
DrawTextInRegionCentral(ptButton->name, &ptButton->tRegion, BUTTON_TEXT_COLOR);
/* flush to lcd/web */
FlushDisplayRegion(&ptButton->tRegion, ptDispBuff);
}
void InitButton(PButton ptButton, char *name, PRegion ptRegion, ONDRAW_FUNC OnDraw, ONPRESSED_FUNC OnPressed)
{
ptButton->status = 0;
ptButton->name = name;
ptButton->tRegion = *ptRegion;
ptButton->OnDraw = OnDraw ? OnDraw : DefaultOnDraw;
ptButton->OnPressed = OnPressed ? OnPressed : DefaultOnPressed;
}
static int DefaultOnDraw(struct Button *ptButton, PDispBuff ptDispBuff)
第6~16行:實現(xiàn)默認(rèn)的 DefaultOnDraw 函數(shù)
? ? ? ? 第8行:某一區(qū)域繪制底色
? ? ? ? 第12行:居中寫文字
????????第15行:刷新到LCD或者web上
static int DefaultOnPressed(struct Button *ptButton, PDispBuff ptDispBuff, PInputEvent ptInputEvent)
第20~37行:實現(xiàn)默認(rèn)的?DefaultOnPressed 函數(shù)
? ? ? ? 第22行:設(shè)置初始狀態(tài)顏色? ? ? ??
????????第24行:每次點擊初始狀態(tài)翻轉(zhuǎn)
? ? ? ? 第25行:如果初始狀態(tài)變?yōu)?,則顏色進(jìn)行翻轉(zhuǎn)
? ? ? ? 第28~35行:進(jìn)行顏色變化
void InitButton(PButton ptButton, char *name, PRegion ptRegion, ONDRAW_FUNC OnDraw, ONPRESSED_FUNC OnPressed)
第40~47行:初始化按鍵
? ? ? ? 第42行:記錄初始狀態(tài)
? ? ? ? 第43行:將按鈕名字傳入
? ? ? ? 第44行:將按鈕所在區(qū)域傳入
? ? ? ? 第45、46行:如果按下一個這個函數(shù)存在的話,那就執(zhí)行這個函數(shù),否則執(zhí)行默認(rèn)的函數(shù)
?2.disp_manager.c
將ptRegion這一部分區(qū)域繪制成dwColor的顏色
void DrawRegion(PRegion ptRegion, unsigned int dwColor)
{
int x = ptRegion->iLeftUpX;
int y = ptRegion->iLeftUpY;
int width = ptRegion->iWidth;
int heigh = ptRegion->iHeigh;
int i,j;
for (j = y; j < y + heigh; j++)
{
for (i = x; i < x + width; i++)
PutPixel(i, j, dwColor);
}
}
?在一個區(qū)域ptRegion中間將位置居中,并且設(shè)置字體顏色
void DrawTextInRegionCentral(char *name, PRegion ptRegion, unsigned int dwColor)
{
int n = strlen(name);
int iFontSize = ptRegion->iWidth / n / 2;
FontBitMap tFontBitMap;
int iOriginX, iOriginY;
int i = 0;
int error;
if (iFontSize > ptRegion->iHeigh)
iFontSize = ptRegion->iHeigh;
iOriginX = (ptRegion->iWidth - n * iFontSize)/2 + ptRegion->iLeftUpX;
iOriginY = (ptRegion->iHeigh - iFontSize)/2 + iFontSize + ptRegion->iLeftUpY;
SetFontSize(iFontSize);
while (name[i])
{
/* get bitmap */
tFontBitMap.iCurOriginX = iOriginX;
tFontBitMap.iCurOriginY = iOriginY;
error = GetFontBitMap(name[i], &tFontBitMap);
if (error)
{
printf("SelectAndInitFont err\n");
return;
}
/* draw on buffer */
DrawFontBitMap(&tFontBitMap, dwColor);
iOriginX = tFontBitMap.iNextOriginX;
iOriginY = tFontBitMap.iNextOriginY;
i++;
}
}
3.?disp_manager.h
#ifndef _DISP_MANAGER_H
#define _DISP_MANAGER_H
#include <common.h>
#include <font_manager.h>
typedef struct DispBuff {
int iXres;
int iYres;
int iBpp;
char *buff;
}DispBuff, *PDispBuff;
typedef struct DispOpr {
char *name;
int (*DeviceInit)(void);
int (*DeviceExit)(void);
int (*GetBuffer)(PDispBuff ptDispBuff);
int (*FlushRegion)(PRegion ptRegion, PDispBuff ptDispBuff);
struct DispOpr *ptNext;
}DispOpr, *PDispOpr;
void RegisterDisplay(PDispOpr ptDispOpr);
void DisplayInit(void);
int SelectDefaultDisplay(char *name);
int InitDefaultDisplay(void);
int PutPixel(int x, int y, unsigned int dwColor);
int FlushDisplayRegion(PRegion ptRegion, PDispBuff ptDispBuff);
PDispBuff GetDisplayBuffer(void);
void DrawFontBitMap(PFontBitMap ptFontBitMap, unsigned int dwColor);
void DrawRegion(PRegion ptRegion, unsigned int dwColor);
void DrawTextInRegionCentral(char *name, PRegion ptRegion, unsigned int dwColor);
#endif
三、單元測試
1.ui_test.c
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <linux/fb.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <disp_manager.h>
#include <font_manager.h>
#include <ui.h>
int main(int argc, char **argv)
{
PDispBuff ptBuffer;
int error;
Button tButton;
Region tRegion;
if (argc != 2)
{
printf("Usage: %s <font_size>\n", argv[0]);
return -1;
}
DisplayInit();
SelectDefaultDisplay("fb");
InitDefaultDisplay();
ptBuffer = GetDisplayBuffer();
FontsRegister();
error = SelectAndInitFont("freetype", argv[1]);
if (error)
{
printf("SelectAndInitFont err\n");
return -1;
}
tRegion.iLeftUpX = 200;
tRegion.iLeftUpY = 200;
tRegion.iWidth = 300;
tRegion.iHeigh = 100;
InitButton(&tButton, "test", &tRegion, NULL, NULL);
tButton.OnDraw(&tButton, ptBuffer);
while (1)
{
tButton.OnPressed(&tButton, ptBuffer, NULL);
sleep(2);
}
return 0;
}
第23~27行:打印用法
? ? ? ? <font_size>指定字庫文件
第29~35行:顯示系統(tǒng)初始化?
第37~39行:字體系統(tǒng)初始化
第46~57行:UI系統(tǒng)初始化
? ? ? ? 第46~49行:顯示區(qū)域位置
? ? ? ? 第51行:初始化按鈕??
? ? ? ? 第52行:將按鈕繪制顯示出來
? ? ? ? 第55行:模擬點擊
2.unittest下的Makefile
EXTRA_CFLAGS :=
CFLAGS_file.o :=
#obj-y += disp_test.o
#obj-y += input_test.o
#obj-y += font_test.o
obj-y += ui_test.o
3.?ui下的Makefile
EXTRA_CFLAGS :=
CFLAGS_file.o :=
obj-y += button.o
4.頂層目錄下的Makefile
CROSS_COMPILE ?=
AS = $(CROSS_COMPILE)as
LD = $(CROSS_COMPILE)ld
CC = $(CROSS_COMPILE)gcc
CPP = $(CC) -E
AR = $(CROSS_COMPILE)ar
NM = $(CROSS_COMPILE)nm
STRIP = $(CROSS_COMPILE)strip
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
export AS LD CC CPP AR NM
export STRIP OBJCOPY OBJDUMP
CFLAGS := -Wall -O2 -g
CFLAGS += -I $(shell pwd)/include
LDFLAGS := -lts -lpthread -lfreetype
export CFLAGS LDFLAGS
TOPDIR := $(shell pwd)
export TOPDIR
TARGET := test
obj-y += display/
obj-y += input/
obj-y += font/
obj-y += ui/
obj-y += unittest/
all : start_recursive_build $(TARGET)
@echo $(TARGET) has been built!
start_recursive_build:
make -C ./ -f $(TOPDIR)/Makefile.build
$(TARGET) : built-in.o
$(CC) -o $(TARGET) built-in.o $(LDFLAGS)
clean:
rm -f $(shell find -name "*.o")
rm -f $(TARGET)
distclean:
rm -f $(shell find -name "*.o")
rm -f $(shell find -name "*.d")
rm -f $(TARGET)
obj-y += display/
obj-y += input/
obj-y += font/
obj-y += ui/
obj-y += unittest/
四、上板測試
1.ubuntu上
book@100ask:~/source$ make
book@100ask:~/source$ cp -r 20_ui_unittest/ ~/nfs_rootfs/
2. 開發(fā)板上
[root@100ask:/]# mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt
[root@100ask:/mnt/20_ui_unittest]# ./test ./simsun.ttc
3.運(yùn)行效果:
每隔兩秒切換一下顏色文章來源:http://www.zghlxwxcb.cn/news/detail-827979.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-827979.html
到了這里,關(guān)于Linux基礎(chǔ)項目開發(fā)1:量產(chǎn)工具——UI系統(tǒng)(五)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!