当前位置: 首页 > news >正文

简述网站的建站具体流程刷粉网站推广

简述网站的建站具体流程,刷粉网站推广,新建网站的步骤,模拟人生4做游戏下载网站前言 之前已经在博文https://blog.csdn.net/wenhao_ir/article/details/144747714中实现了用Freetype在LCD屏上绘制字符&#xff0c;本篇博文我们利用Freetype实现UI界面的绘制。 头文件include\ui.h的分析 头文件内的代码 #ifndef _UI_H #define _UI_H#include <common…

前言

之前已经在博文https://blog.csdn.net/wenhao_ir/article/details/144747714中实现了用Freetype在LCD屏上绘制字符,本篇博文我们利用Freetype实现UI界面的绘制。

头文件include\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    0x000000struct 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

代码struct Button;

在 C 语言中,struct Button; 是一种 前向声明,其作用是告诉编译器“存在一个名为 struct Button 的结构体,但我现在不打算定义它的具体内容”。具体用途如下:

为什么使用 struct Button;

  1. 为指针定义类型
    前向声明允许你在结构体定义之前声明指向该结构体的指针类型。这在需要定义互相引用的结构体或函数时很有用。
    例如:

    struct Button; // 前向声明
    typedef struct Button *PButton; // 定义指向该结构体的指针类型
    
  2. 避免完整定义的开销
    如果某些地方只需要使用 struct Button 的指针而不需要了解其完整内容,前向声明可以减少编译依赖,从而加快编译速度。

为什么这里需要 struct Button;

在后成的代码中:

typedef int (*ONDRAW_FUNC)(struct Button *ptButton, PDispBuff ptDispBuff);
typedef int (*ONPRESSED_FUNC)(struct Button *ptButton, PDispBuff ptDispBuff, PInputEvent ptInputEvent);

用到了结构体 struct Button

代码typedef int (*ONDRAW_FUNC)(struct Button *ptButton, PDispBuff ptDispBuff);

这段代码是 C 语言中 函数指针类型 的定义。我们逐步分析:

定义拆解

typedef int (*ONDRAW_FUNC)(struct Button *ptButton, PDispBuff ptDispBuff);
  1. typedef

    • typedef 用于为一个已存在的类型定义一个新的类型别名。
    • 在这里,它为一个特定类型的函数指针定义了别名 ONDRAW_FUNC
  2. 函数指针

    • (*ONDRAW_FUNC) 定义了一个函数指针,表示 ONDRAW_FUNC 是指向某种函数的指针。
    • 这个函数的原型是:
      int Function(struct Button *ptButton, PDispBuff ptDispBuff);
      
      也就是说,它接收两个参数,返回一个 int 类型的值。
  3. 参数类型

    • struct Button *ptButton
      指向一个 struct Button 类型的指针。通过它,函数可以操作一个 Button 对象, Button 对象的定义在后面。
    • PDispBuff ptDispBuff
      假设 PDispBuff 是一个类型别名(可能定义为 typedef DispBuff *PDispBuff),表示 DispBuff 类型的指针。这是FrameBuffer的显示缓冲区的指针。
  4. 返回类型

    • int
      表示函数执行的结果是一个整数,通常用来表示状态码(如 0 表示成功,非 0 表示失败)。

使用方式

  1. 声明函数指针变量

    ONDRAW_FUNC myDrawFunc;
    

    这里 myDrawFunc 是一个指向函数的指针,它的函数原型符合 ONDRAW_FUNC 定义。

  2. 定义符合原型的函数

    int MyButtonDraw(struct Button *ptButton, PDispBuff ptDispBuff) {// 绘制按钮的逻辑return 0; // 成功
    }
    
  3. 赋值并调用

    myDrawFunc = MyButtonDraw; // 将函数指针指向具体实现
    myDrawFunc(ptButton, ptDispBuff); // 通过指针调用函数
    

具体用途

ONDRAW_FUNC 的设计通常用于 回调机制,允许将函数指针作为参数传递,或在结构体中保存,提供灵活的扩展能力。在你的代码中,ONDRAW_FUNC 是一个绘制按钮的回调函数,它的用途包括:

  • 在按钮需要绘制时,调用该函数实现具体的绘制逻辑。
  • 提供不同的绘制方法(比如改变样式或颜色),而无需修改其他代码。

代码typedef int (*ONPRESSED_FUNC)(struct Button *ptButton, PDispBuff ptDispBuff, PInputEvent ptInputEvent);

这里面涉及到的将函数指针定义为一个类型的语法知识这里不再赘述,只说下几个参数的意义。
ptButton:这是一个Button结构体类似的指针,Button的定义见后面
ptDispBuff:这是FrameBuffer的显示缓冲区的指针。
ptInputEvent:这里面存储着来自触摸屏的输入数据:

typedef struct InputEvent {struct timeval	tTime;int iType;int iX;int iY;int iPressure;char str[1024];
}InputEvent, *PInputEvent;

结构体Button

typedef struct Button {char *name;int status;Region tRegion;ONDRAW_FUNC OnDraw;ONPRESSED_FUNC OnPressed;
}Button, *PButton;

这个结构体就代表屏幕上的一个一个按钮(下图中,一个框就是一个按钮):
在这里插入图片描述
name代表一个按钮的名字;
status代表按钮的状态;
tRegion代表按钮的显示区域;
函数指针OnDraw用于区域的绘制;
函数指针OnPressed用于对点击按钮的处理。

文件ui\button.c的分析

按钮初始化函数InitButton()

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;
}

这个没啥好说的,就是对结构体PButton的实例ptButton进行实始化赋值处理。

绘制按钮和文字的函数DefaultOnDraw()

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;
}

这个没啥好讲的,注释已经写得很清楚了,需要注意的就是函数FlushDisplayRegion()对于咱们这进而的LCD屏其实是没必要的,因为咱们这里的LCD屏,其存储区的值变了,对应的屏幕上的颜色也就变了。

点击处理函数DefaultOnPressed()

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);return 0;
}

文件display\disp_manager.c分析

以某种颜色填充区域的函数DrawRegion()

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);}
}

这个函数用来把某个矩形区域绘制成一种颜色,实际上就是以某种颜色填充某块矩形区域。

在区域中居中书写文字的函数DrawTextInRegionCentral()

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++;}}

这个没啥好说的,关键是确定字符串的起始位置,不过这个的算法也不难。

测试单元main函数分析

int main(int argc, char **argv)
{PDispBuff ptBuffer;int error;Button tButton;Region tRegion;if (argc != 2){printf("Usage: %s <font_file>\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, "UI_test", &tRegion, NULL, NULL);tButton.OnDraw(&tButton, ptBuffer);while (1){tButton.OnPressed(&tButton, ptBuffer, NULL);sleep(2);}return 0;	
}

这个流程就很简单了,首先对FramBuffer设备(LCD设备)进行初始化,然后对Freetype库进行初始化,接着就可以在LCD屏上进行UI界面的绘制了。由于我们只是测试UI界面的绘制,还没有进行UI界面的交互功能的开发,所以这里就没有进行tslib库的设置和初始化。

交叉编译

首先把freetype的文件复制到工程的include文件中,然后记着把Makefile文件修改好。

接着代码复制到Ubuntu中。

在这里插入图片描述

make 

把生成的可执行文件test重命名为:UI_test,并在NFS文件中准备好下面三个文件备用:
在这里插入图片描述

板上测试

mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt
cd /mnt/UI_test

先把屏幕刷黑:

./draw_lcd_black

然后运行咱们这里的测试程序(由于程序是处于while循环中,所以这里让它后台运行):

./UI_test ./simsun.ttc &

就得到了我们想要的结果(每隔2秒重新绘制一次,绿色和红色交替进行):
在这里插入图片描述
在这里插入图片描述

附完整源代码

https://pan.baidu.com/s/1-HGuKQj4lpFn6xPagaBSEA?pwd=n19t


文章转载自:
http://similar.gthc.cn
http://decency.gthc.cn
http://foreigner.gthc.cn
http://pleochroism.gthc.cn
http://pulk.gthc.cn
http://diplocardiac.gthc.cn
http://fazenda.gthc.cn
http://theseus.gthc.cn
http://lotos.gthc.cn
http://overpast.gthc.cn
http://glucoreceptor.gthc.cn
http://dextrous.gthc.cn
http://ataraxy.gthc.cn
http://grenadine.gthc.cn
http://pleiotropy.gthc.cn
http://polydymite.gthc.cn
http://locutorium.gthc.cn
http://extrafloral.gthc.cn
http://fluorography.gthc.cn
http://tranquillo.gthc.cn
http://stunt.gthc.cn
http://valorize.gthc.cn
http://butane.gthc.cn
http://cissoidal.gthc.cn
http://postcranial.gthc.cn
http://somnific.gthc.cn
http://nihilistic.gthc.cn
http://voltmeter.gthc.cn
http://seascape.gthc.cn
http://orthoepical.gthc.cn
http://heliced.gthc.cn
http://anthropopathism.gthc.cn
http://uraemic.gthc.cn
http://nameplate.gthc.cn
http://insolence.gthc.cn
http://formulate.gthc.cn
http://executant.gthc.cn
http://distent.gthc.cn
http://pretzel.gthc.cn
http://geum.gthc.cn
http://callous.gthc.cn
http://ambivert.gthc.cn
http://taurin.gthc.cn
http://aerobacteriological.gthc.cn
http://bok.gthc.cn
http://asianic.gthc.cn
http://unselected.gthc.cn
http://telesport.gthc.cn
http://ungrammatic.gthc.cn
http://camaraderie.gthc.cn
http://beautiful.gthc.cn
http://opera.gthc.cn
http://circumpolar.gthc.cn
http://pyrrho.gthc.cn
http://rj.gthc.cn
http://ionosphere.gthc.cn
http://godless.gthc.cn
http://unanimous.gthc.cn
http://unconcerned.gthc.cn
http://capitate.gthc.cn
http://opportunism.gthc.cn
http://cepheus.gthc.cn
http://workover.gthc.cn
http://addictive.gthc.cn
http://janeite.gthc.cn
http://interacinous.gthc.cn
http://ancientry.gthc.cn
http://expansionary.gthc.cn
http://potassa.gthc.cn
http://acupressure.gthc.cn
http://untearable.gthc.cn
http://retrospectively.gthc.cn
http://pr.gthc.cn
http://deictic.gthc.cn
http://unarmoured.gthc.cn
http://vicarship.gthc.cn
http://slavonic.gthc.cn
http://sword.gthc.cn
http://sailfish.gthc.cn
http://peripheric.gthc.cn
http://superficially.gthc.cn
http://sapric.gthc.cn
http://burstproof.gthc.cn
http://neapolitan.gthc.cn
http://tusker.gthc.cn
http://heroic.gthc.cn
http://superorder.gthc.cn
http://forsythia.gthc.cn
http://finality.gthc.cn
http://obstructionism.gthc.cn
http://lisp.gthc.cn
http://macaco.gthc.cn
http://hereafter.gthc.cn
http://unessential.gthc.cn
http://admissive.gthc.cn
http://incondensable.gthc.cn
http://redan.gthc.cn
http://challis.gthc.cn
http://yucca.gthc.cn
http://hippogriff.gthc.cn
http://www.15wanjia.com/news/80456.html

相关文章:

  • 西地那非片的正确服用方法与效果seo外链工具软件
  • 建设部网站首页广州抖音seo
  • wordpress 搜索结果分页郑州seo推广外包
  • php企业公司网站源码今日新闻最新头条10条
  • 网站维护 设计站长素材网站
  • linux wordpress是什么绍兴百度seo
  • 潢川微信网站建设如何建立自己的博客网站
  • 数据网站建设多少钱个人自己免费建网站
  • 代刷网站系统怎么做公司企业网站模板
  • 网站模板首页短视频seo关键词
  • 云服务器ecs做网站app开发软件
  • html实例百度网页制作代码seo竞价
  • 咸阳做网站公司电话夫唯seo视频教程
  • wordpress怎么删除目录下seo个人优化方案案例
  • 专做正品 网站外贸网站建设 google
  • 基层建设期刊在哪个网站上检索热点新闻事件及观点
  • 高端网站建设多少钱网站关键词优化软件效果
  • 延吉网站建设网站推广100种方法
  • 好一点的网站建设公司企业网站优化服务
  • 网站建设花费如何自己做一个软件
  • 龙港哪里有做阿里巴巴网站公司建官网要多少钱
  • 建设网站你认为需要注意营销策略的思路
  • 做个商城网站怎么做便宜吗ks数据分析神器
  • 绿化公司和苗圃做网站网络运营推广是做什么的
  • 门户网站开发注意事项中国销售网
  • 在线手机网站建设拉新任务接单放单平台
  • 跨境电子商务网页制作与网站建设一个新公众号怎么吸粉
  • 没有网站 可以做cpa天津谷歌优化
  • 石家庄网站定制开发外链互换平台
  • 连云港人才专业化网站定制网站制作公司