国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Linux基礎(chǔ)項目開發(fā)1:量產(chǎn)工具——UI系統(tǒng)(五)

這篇具有很好參考價值的文章主要介紹了Linux基礎(chǔ)項目開發(fā)1:量產(chǎn)工具——UI系統(tǒng)(五)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言:

前面我們已經(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 用戶點擊它之后,如何處理?

linux ui 開發(fā)工具,Linux項目開發(fā),ui,linux,命令模式,按鍵編程,button,linux項目開發(fā),linux應(yīng)用開發(fā)

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ù)使用按鈕

linux ui 開發(fā)工具,Linux項目開發(fā),ui,linux,命令模式,按鍵編程,button,linux項目開發(fā),linux應(yīng)用開發(fā)

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è)置字體顏色

linux ui 開發(fā)工具,Linux項目開發(fā),ui,linux,命令模式,按鍵編程,button,linux項目開發(fā),linux應(yīng)用開發(fā)

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)行效果:

每隔兩秒切換一下顏色

linux ui 開發(fā)工具,Linux項目開發(fā),ui,linux,命令模式,按鍵編程,button,linux項目開發(fā),linux應(yīng)用開發(fā)linux ui 開發(fā)工具,Linux項目開發(fā),ui,linux,命令模式,按鍵編程,button,linux項目開發(fā),linux應(yīng)用開發(fā)文章來源地址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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包