WouoUIPagePC端实现

WouoUIPagePC端实现

WouoUIPage是一个与硬件平台无关,纯C语言的UI库(目前只能应用于128*64的单色OLED屏幕上,后期会改进,支持更多尺寸)。因此,我们可以在PC上实现它,本文就以在PC上使用 VScode+MinGW+EGE 的组合,来搭建PC上可以用于测试自己写UI代码的WouoUIPage环境

WouoUIPage的github链接:https://github.com/Sheep118/WouoUI-PageVersion

环境搭建流程

VScode+MinGW+EGE

需要准备的东西有VScode、EGE安装包、MinGW安装包,需要实现能够在PC上用C语言进行绘图,后期才能移植WouoUIPage。所以,搭建PC能用于C语言屏幕绘制的环境,可以参考下面这个博客。

VScode+MinGW+EasyGraphicEngine,ege图形库配置教程_安装的mingw怎么使用graphic图形库-CSDN博客

这里总结一下博客里提及的操作,以便检测EGE的环境是否安装成功。

  • 安装VScode+MinGW,这个按博客中提供的视频操作,问题不大,安装完MinGW后可以新建个C文件或者C++文件,使用gcc或者g++编译测试。
  • 在easy graphic engine官网上下载ege_19.01_all的zip包,我们需要获取里面的图形库添加到MinGW的路径中。
  • 复制两个东西:
    • ege_19.01_all压缩包下include文件夹下的ege文件夹、ege.hgraphics.h 两个文件,将这三个东西复制到MinGW安装路径中的include 文件夹下。
    • (我使用的是64位的版本)将ege_19.01_all压缩包下lib文件夹下mingw64下的libgraphics64.a 库文件复制到MinGW安装路径中的lib 文件夹下。(32位的安装环境则对应换成32位)。
  • 使用VScode任意打开一个空的文件夹,在文件夹下建立.vscode 文件夹(注意有个.前缀),将博客提供的c_cpp_properties.jsontasks.jsonlaunch.json 新建对应的文件,并复制进去即可(注意需要更换对应MinGW的路径)。
  • 之后在VScode里打开上面的文件夹,新建一个out的目录和main.cpp 文件,将博客中提及对应的测试代码粘贴进去,按Ctrl+Shift+B编译,按F5编译执行即可。

移植WouoUIPage

我将WouoUIPage的SDK,也就是移植完成的VScode文件夹上传到GitHub中了,可以直接将Github中ProjectExamples\PCSimulate 下的zip包下载,解压,将解压出来的文件中,.vscode\c_cpp_properties.json.vscode\tasks.json.vscode\launch.json 这三个json文件中MinGW的路径改为自己的安装路径即可。

需要注意一点:由于我没有讲编译的依赖关系写入.vscode\tasks.json 文件中,而是使用Makefile来组织依赖关系,因此,电脑中需要安装Make

这里讲一下zip提供的SDK(移植好的zip包)中各个文件夹的作用。

|--.vscode   #vscode的配置文件
    |--c_cpp_properties.json  #指定编译器
    |--tasks.json		#指定编译的任务命令
    |--launch.json    #指定运行时的shell命令
|--build  #编译中间的.o文件存放文件夹
|--out   #最终的可执行文件输出文件夹
|--WouoUIPage  #WouoUIPage的库文件夹
    |-- #注意,这里面的oled_port.c和oled_port.h改写过
|--UITest  #调用WouoUIPage编写的UI文件,编写自己UI测试时,主要修改这里面的文件
    |--TestUI.c
    |--TestUI.h
|--main.cpp  #调用EGE库的主函数
|--Makefile  #编译依赖关系的组织文件
|--simulate_conf.h  #PC端仿真的配置头文件

具体实现的方式解释

WouoUIPage的移植

主要更改了 oled_port.coled_port.h 这两个文件。

oled_port.c

#include "oled_port.h"

void OLED_SendBuff(uint8_t buff[8][128]) //将8*128字节的buff一次性全部发送的函数
{
for (int y = 0; y < 8; ++y) {
  for (int x = 0; x < 128; ++x) {
      for (int bit = 0; bit < 8; ++bit) {
          uint8_t value = (buff[y][x] >> bit) & 1; // 获取相应位的值
          drawBigPixel(x, y*8+bit, value);
      }
  }
}
}

使用了drawBigPixel 这个函数,实现把缓存的点全部绘制到屏幕上,这个函数的实现在main.cpp 中,如下,并在oled_port.h 中将其声明。

// 画大像素点的函数(一个大像素由PIXEL_SIZExPIXEL_SIZE的小像素组成)
void drawBigPixel(int x, int y, uint8_t value) {
COLORREF color = (value == 0 ? BACK_COLOR : FORE_COLOR); // 数组值为0,对应背景色;非0,对应前景色
setfillcolor(color);	//设置填充颜色
// 使用bar函数绘制一个大像素(PIXEL_SIZExPIXEL_SIZE块)
int x0 = x * PIXEL_SIZE;
int y0 = y * PIXEL_SIZE;
bar(x0, y0, x0 + PIXEL_SIZE, y0 + PIXEL_SIZE); // bar函数的坐标是按照左上角和右下角来绘制矩形的
}

Makefile文件的依赖关系

makefile文件指定了文件的依赖关系,使用gcc编译.WouoUIPageUITest 这三个文件夹下所有的.c文件,并使用g++编译mian.cpp,最后链接成可执行放在out目录下。makefile文件的内容如下:

CC := gcc
CXX := g++
CFLAGS := -Wall
CXXFLAGS := -Wall
TARGET := ./out/main.exe

# 手动指定源文件
SRC_DIRS := . WouoUIPage UITest
C_SOURCES := $(foreach dir,$(SRC_DIRS),$(wildcard $(dir)/*.c)) #在给定源文件路径下搜索.c文件
CPP_SOURCES := $(wildcard *.cpp)   

C_OBJS := $(patsubst %.c,./build/%.o,$(notdir $(C_SOURCES)))
CPP_OBJS := $(patsubst %.cpp,./build/%.o,$(notdir $(CPP_SOURCES))) # 在build目录下生成不带子目录的.o文件
OBJS := $(C_OBJS) $(CPP_OBJS)

# 需要增加VPATH变量来定位源文件
VPATH := $(SRC_DIRS)

all: $(TARGET)

$(TARGET): $(OBJS)
	$(CXX) $^ -o $@ -lgraphics64 -luuid -lmsimg32 -lgdi32 -limm32 -lole32 -loleaut32

./build/%.o: %.c
	$(CC) $(CFLAGS) -c $< -o $@

./build/%.o: %.cpp
	$(CXX) $(CXXFLAGS) -c $< -o $@

clean:
	rm -rf ./build/*.o
	rm -f $(TARGET)

.PHONY: all clean

演示效果

20240506_142513 -big-original

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/598534.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络安全之动态路由RIP详解

RIP&#xff1a;路由信息协议 RIP分为三个版本&#xff1a;RIPV1,RIPV2&#xff08;在IPv4中使用&#xff09;,RIPNG&#xff08;在IPv6中使用&#xff09; RIPV1是一种有类别的距离矢量型路由协议&#xff08;不传递网络掩码&#xff09;。 RIPV2是一种无类别的距离矢量型路…

Java代码基础算法练习-删除有序数组中的重复项-2024.05.07

任务描述&#xff1a; 给一个有序数组&#xff08;共10个元素&#xff09;&#xff0c;请在不新建数组的情况下&#xff0c;删除重复出现的元素&#xff0c;使 每个元素只出现一次&#xff0c;最后请输出删除重复元素后数组的新长度和数组元素。 解决思路&#xff1a; 要删除…

javascript中的DOM和BOM

目录 JavaScript中的对象 简介&#xff1a; js对象的基本用法&#xff1a; 创建对象&#xff1a; 访问对象的属性&#xff1a; 设置修改对象的属性&#xff1a; 删除对象的属性&#xff1a; DOM&#xff08;文档对象模型&#xff09; 简介&#xff1a; DOM对象的属性…

【毕业设计】基于微信小程序的校园快递平台系统设计与实现

1.项目介绍 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统校园快递平台系统信息管理难度大&#xff0c;容错率…

性能测试常见风险以及消减措施

性能测试过程中会遇到各种各样的风险&#xff0c;常见风险以及消减措施有哪些&#xff1f; 一&#xff1a; 时间 一&#xff09;时间相关风险 时间相关风险不仅限于最终用户满意度,尽管这是大多数人首先想到的。时间也是某些与业务和数据相关的风险因素。性能测试可以解决的…

链表+环-链表是否有环的判断

链表是否有环的判断 在数据结构中&#xff0c;链表是一种常见的数据结构&#xff0c;它允许我们在不需要预先知道数据总量的情况下进行数据的动态存储。然而&#xff0c;由于链表的特性&#xff0c;有时我们可能会遇到链表中出现环的情况&#xff0c;即链表的某个节点指向了链…

NXP i.MX8系列平台开发讲解 - 1.1 导读前言

专栏文章目录传送门&#xff1a;返回专栏目录 文章目录 目录 1. 本专辑介绍 2. 学习本专辑作用 3.关于作者 1. 本专辑介绍 本专辑将会介绍Linux 驱动开发&#xff0c;Android BSP 驱动涉及HAL层调试&#xff0c;适用于嵌入式软件开发人员&#xff0c;和有兴趣向该方向发展…

怎么制作地图位置二维码?扫码获取地图信息的方法

随着互联网的不断发展&#xff0c;二维码在工作和生活中的应用不断的增多&#xff0c;可以针对不同的用途展示内容。比如现在很多的商家或者店铺会将定位定制生成二维码&#xff0c;印刷到传单或者宣传海报上&#xff0c;就可以让用户通过扫码获取位置&#xff0c;方便精准定位…

(论文阅读-分析引擎)Modin

一、简介 目标是在不改变的Dataframe语义的情况下支持可扩展的dataframe操作。 什么是机会主义评价&#xff1f;Opportunistic Evaluation&#xff1f; Exploratory data analysis&#xff08;EDA&#xff09;&#xff1a;总结、理解并从数据集中获取价值的过程。 MPI&#…

如何使用dockerfile文件将项目打包成镜像

要根据Dockerfile文件来打包一个Docker镜像&#xff0c;你需要遵循以下步骤。这里假设你已经安装了Docker环境。 1. 准备Dockerfile 确保你的Dockerfile文件已经准备就绪&#xff0c;并且位于你希望构建上下文的目录中。Dockerfile是一个文本文件&#xff0c;包含了用户可以调…

Omnity 进展月报 | 2024.4.1-4.30

Omnity 大事摘要 1、Octopus 官宣升级为 Omnity。 2、Omnity 4月28号正式上线&#xff0c;实现BTC 和 ICP 之间跨链转账 Runes 资产。 3、为庆祝上线&#xff0c;以符文 HOPE•YOU•GET•RICH 为资产&#xff0c;发红包快速触达大量用户&#xff0c;体验跨链服务。 4、Omni…

layui的treeTable组件,多层级上传按钮失效的问题解决

现象描述: layui的treeTable 的上传按钮在一层能用&#xff0c;展开后其他按钮正常点击&#xff0c;上传按钮无效。 具体原因没有深究&#xff0c;大概率是展开的子菜单没有被渲染treeTable的done管理到&#xff0c;导致没有重绘上传按钮。 解决方案: 不使用layu的上传组件方法…

深入解析:企业级OV SSL证书的技术价值与应用实践

JoySSL官网 注册码230918 在互联网安全日益受到重视的今天&#xff0c;SSL证书已成为保护网站数据传输安全的基石。其中&#xff0c;企业级OV&#xff08;Organization Validation&#xff09;SSL证书凭借其增强的安全特性和对企业身份的严格验证&#xff0c;在众多类型的SSL证…

Phi-3:手机上就能运行的强力语言模型

导语 phi-系列模型是微软研究团队推出的轻量级人工智能模型&#xff0c;旨在实现“小而精”的目标&#xff0c;能够实现在低功耗设备上例如智能手机和平板电脑上部署运行。截止目前&#xff0c;已经发布到了phi-3模型&#xff0c;本系列博客将沿着最初的phi-1到phi-1.5&#x…

HarmonyOS实战开发-如何通过Text实现部分文本高亮和超链接。

介绍 本示例通过自定义Span类型&#xff0c;在Text组件中使用ForEach遍历&#xff0c;根据不同的Span类型生成不同样式和功能的Span组件&#xff0c;实现部分文本高亮和超链接。 效果图预览 使用说明 点击超链接&#xff0c;根据链接类型出现相应提示弹窗。长按消息卡片出现…

不必追求深度,浅尝辄止为宜

近日笔者撰文称&#xff0c;有幸应《百度-百家号》相邀&#xff0c;在其发起的《征文任务》栏目中写作深度文章&#xff0c;便试着开头写了一篇《万科有“活下去”的可能性吗&#xff1f;》的时评文章&#xff0c;于5月3日发表&#xff0c;舆情反映不错&#xff0c;不到三天时间…

重生奇迹mu套装大全

1.战士 汉斯的皮套装&#xff1a;冰之指环,皮护腿,皮盔,皮护手,皮靴,皮铠,流星槌 汉斯的青铜套装&#xff1a;青铜护腿,青铜靴,青铜铠 汉斯的翡翠套装&#xff1a;雷之项链,翡翠护腿,翡翠盔,翡翠铠,远古之盾 汉斯的黄金套装&#xff1a;火之项链,黄金护腿,黄金护手,黄金靴,…

(双指针) 有效三角形的个数 和为s的两个数字 三数之和 四数之和

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 文章目录 前言 一、有效三角形的个数&#xff08;medium&#xff09; 1.1、题目 1.2、讲解算法原理 1.3、编写代码 二、和为s的两个数字 2.1、题目 2.2、讲解算…

动手开发基于Springboot的基础开发框架-01

本系列专题虽然是按教学的深度来定稿的&#xff0c;但在项目结构和代码组织方面是按生产系统的要求来书定的。在本章中主要介绍下基础开发框架的内容。后续所有章节的项目全是在本基础框架的基础上演进的。 工程结构介绍 SpringbootSeries&#xff1a;父工程&#xff0c;定义一…

【信息熵理论-01】最大熵的分布

文章目录 一、说明二、如何认识所谓的“熵”三、熵最大化问题3.1 设置最大化3.2 利用变分微积分 四、更广泛的影响和见解 一、说明 我觉得用最大熵来获取概率分布的方法很给力。您采用一些已知或约束&#xff0c;然后在这些条件下最大化信息熵&#xff0c;瞧&#xff01;你有一…