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

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/*.orm -f $(TARGET).PHONY: all clean

演示效果

20240506_142513 -big-original

相关文章:

WouoUIPagePC端实现

WouoUIPagePC端实现 WouoUIPage是一个与硬件平台无关&#xff0c;纯C语言的UI库&#xff08;目前只能应用于128*64的单色OLED屏幕上&#xff0c;后期会改进&#xff0c;支持更多尺寸&#xff09;。因此&#xff0c;我们可以在PC上实现它&#xff0c;本文就以在PC上使用 VScode…...

W801学习笔记十九:古诗学习应用——下

经过前两章的内容&#xff0c;背唐诗的功能基本可以使用了。然而&#xff0c;仅有一种模式未免显得过于单一。因此&#xff0c;在本章中对其进行扩展&#xff0c;增加几种不同的玩法&#xff0c;并且这几种玩法将采用完全不同的判断方式。 玩法一&#xff1a;三分钟限时挑战—…...

类加载器ClassLoad-jdk1.8

类加载器ClassLoad-jdk1.8 1. 类加载器的作用2. 类加载器的种类&#xff08;JDK8&#xff09;3. jvm内置类加载器如何搜索加载类--双亲委派模型4. 如何打破双亲委派模型--自定义类加载器5. 自定义一个类加载器5.1 为什么需要自定义类加载器5.2 自定义一个类加载器 6. java代码加…...

24年最新AI数字人简单混剪

24年最新AI数字人简单混剪 网盘自动获取 链接&#xff1a;https://pan.baidu.com/s/1lpzKPim76qettahxvxtjaQ?pwd0b8x 提取码&#xff1a;0b8x...

免备案香港主机会影响网站收录?

免备案香港主机会影响网站收录?前几天遇到一个做电子商务的朋友说到这个使用免备案香港主机的完整会不会影响网站的收录问题&#xff0c;这个问题也是站长关注较多的问题之一。小编查阅了百度官方规则说明&#xff0c;应该属于比较全面的。下面小编给大家介绍一下使用免备案香…...

低代码工业组态数字孪生平台

2024 两会热词「新质生产力」凭借其主要特征——高科技、高效能及高质量&#xff0c;引发各界关注。在探索构建新质生产力的重要议题中&#xff0c;数据要素被视为土地、劳动力、资本和技术之后的第五大生产要素。数据要素赋能新质生产力发展主要体现为&#xff1a;生产力由生产…...

代码随想录第三十八天(完全背包问题)|爬楼梯(第八期模拟笔试)|零钱兑换|完全平方数

爬楼梯&#xff08;第八期模拟笔试&#xff09; 该题也是昨天的完全背包排列问题&#xff0c;解法相同&#xff0c;将遍历顺序进行调换 import java.util.*; public class Main{public static void main (String[] args) {Scanner scnew Scanner(System.in);int nsc.nextInt(…...

idea常用知识点随记

idea常用知识点随记 1. 打开idea隐藏的commit窗口2. idea中拉取Git分支代码3. idea提示代码报错&#xff0c;项目编译没有报错4. idea中实体类自动生成序列号5. idea隐藏当前分支未commit代码6. idea拉取新建分支的方法 1. 打开idea隐藏的commit窗口 idea左上角File→Settings…...

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

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

力扣每日一题114:二叉树展开为链表

题目 中等 提示 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同…...

Linux系统下使用LVM扩展逻辑卷的步骤指南

Linux系统下使用LVM扩展逻辑卷的步骤指南 文章目录 Linux系统下使用LVM扩展逻辑卷的步骤指南前言一、逻辑卷管理&#xff08;LVM&#xff09;简介二、扩展逻辑卷步骤1. 检查当前的磁盘布局2. 创建新的分区3. 更新内核的分区表4. 初始化新的物理卷5. 将物理卷添加到卷组6. 调整逻…...

探索AI编程新纪元:从零开始的智能编程之旅

提示&#xff1a;Baidu Comate 智能编码助手是基于文心大模型&#xff0c;打造的新一代编码辅助工具 文章目录 前言AI编程概述&#xff1a;未来已来场景需求&#xff1a;从简单到复杂&#xff0c;无所不包体验步骤&#xff1a;我的AI编程初探试用感受&#xff1a;双刃剑下的深思…...

RustGUI学习(iced)之小部件(三):如何使用下拉列表pick_list?

前言 本专栏是学习Rust的GUI库iced的合集,将介绍iced涉及的各个小部件分别介绍,最后会汇总为一个总的程序。 iced是RustGUI中比较强大的一个,目前处于发展中(即版本可能会改变),本专栏基于版本0.12.1. 概述 这是本专栏的第三篇,主要讲述下拉列表pick_list部件的使用,会…...

【OceanBase诊断调优】—— Unit 迁移问题的排查方法

适用版本&#xff1a;V2.1.x、V2.2.x、V3.1.x、V3.2.x 本文主要介绍 OceanBase 数据集在副本迁移过程中遇到的问题的排查方法。 适用版本 V2.1.x、V2.2.x、V3.1.x、V3.2.x 手动调度迁移问题的排查 OceanBase 数据库的 RootService 模块负责 Unit 迁移的调度&#xff0c;如果…...

[极客大挑战 2019]PHP

1.通过目录扫描找到它的备份文件&#xff0c;这里的备份文件是它的源码。 2.源码当中涉及到的关键点就是魔术函数以及序列化与反序列化。 我们提交的select参数会被进行反序列化&#xff0c;我们要构造符合输出flag条件的序列化数据。 但是&#xff0c;这里要注意的就是我们提…...

数据结构之跳跃表

跳跃表 跳跃表&#xff08;skiplist&#xff09;是一种随机化的数据&#xff0c; 由 William Pugh 在论文《Skip lists: a probabilistic alternative to balanced trees》中提出&#xff0c; 跳跃表以有序的方式在层次化的链表中保存元素&#xff0c; 效率和平衡树媲美 —— …...

搜维尔科技:动作捕捉解决方案:销售、服务、培训和支持

动作捕捉解决方案&#xff1a;销售、服务、培训和支持 搜维尔科技&#xff1a;动作捕捉解决方案&#xff1a;销售、服务、培训和支持l...

数据库管理-第184期 23ai:干掉MongoDB的不一定是另一个JSON数据库(20240507)

数据库管理184期 2024-05-07 数据库管理-第184期 23ai:干掉MongoDB的不一定是另一个JSON数据库&#xff08;20240507&#xff09;1 JSON需求2 关系型表设计3 JSON关系型二元性视图3 查询视图总结 数据库管理-第184期 23ai:干掉MongoDB的不一定是另一个JSON数据库&#xff08;20…...

刷代码随想录有感(58):二叉树的最近公共祖先

题干&#xff1a; 代码&#xff1a; class Solution { public:TreeNode* traversal(TreeNode* root, TreeNode* p, TreeNode* q){if(root NULL)return NULL;if(root p || root q)return root;TreeNode* left traversal(root->left, p, q);TreeNode* right traversal(r…...

[开发|安卓] Android Studio 开发环境配置

Android Studio下载 Android Studio下载地址 下载SDK依赖 1.点击左上角菜单 2.选择工具 3.打开SDK管理中心 4.下载项目目标Android版本的SDK 配置安卓虚拟机 1.打开右上角的设备管理 2.选择合适的手机规格 3.下载并选择项目目标Android系统 4.点击完成配置 …...

Keil C编译器字符串常量合并机制与内存优化

1. Keil C编译器中的字符串常量合并机制解析在嵌入式开发中&#xff0c;内存优化是一个永恒的话题。Keil C编译器&#xff08;包括C51、C166和C251版本&#xff09;提供了一项智能特性——自动合并重复的字符串常量。这个功能看似简单&#xff0c;但对资源受限的嵌入式系统而言…...

别再只盯着AB相了!三引脚EC35编码器在智能面板上的应用与防误触设计

三引脚EC35编码器在智能面板设计中的创新应用与抗干扰实践 旋钮交互在智能家居和工业HMI领域从未失去它的魅力——当用户手指触碰到那个精致的金属环时&#xff0c;物理反馈带来的确定感是纯触控界面无法替代的。但传统AB相编码器的误触发问题长期困扰着产品设计师&#xff1a;…...

跨越物种与时空:TO-GCN方法在植物发育与光合作用调控网络解析中的创新实践

1. TO-GCN方法&#xff1a;突破传统共表达网络分析的时空局限 在植物生物学研究中&#xff0c;基因共表达网络分析一直是揭示复杂调控机制的重要工具。传统方法如WGCNA&#xff08;加权基因共表达网络分析&#xff09;虽然应用广泛&#xff0c;但在处理跨物种、跨条件或跨组织的…...

工业以太网IO模块级联技术:从Modbus TCP到MQTT的部署实践

1. 项目概述&#xff1a;为什么我们需要“可级联”的工业IO模块&#xff1f;在工业自动化现场摸爬滚打十几年&#xff0c;最头疼的事情之一就是布线。一个车间里&#xff0c;PLC、传感器、执行器、仪表星罗棋布&#xff0c;传统的IO模块要么通过现场总线&#xff08;如Profibus…...

为什么93%的AI法律助手查不准《数据安全法》实施细则?Perplexity这项冷启动参数设置决定成败

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Perplexity法规查询功能的底层架构原理 Perplexity法规查询功能并非基于传统关键词匹配的搜索引擎&#xff0c;而是构建在多层语义理解与结构化知识协同推理的基础之上。其核心由法规知识图谱、实时语义解析引…...

树莓派Web IDE:零配置云端编程环境与Python硬件模拟实践

1. 项目概述&#xff1a;一个“开箱即用”的编程环境革命最近&#xff0c;树莓派基金会悄无声息地扔下了一颗“重磅炸弹”——他们正式推出了一个网页端的代码编辑器。这个消息在创客圈和教育圈里&#xff0c;可能比发布一款新硬件还要让人兴奋。为什么&#xff1f;因为它直接戳…...

Hermes Agent框架对接Taotoken自定义供应商的配置指南

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Hermes Agent框架对接Taotoken自定义供应商的配置指南 对于使用Hermes Agent框架的开发者而言&#xff0c;能够灵活接入不同的模型…...

MySQL 8.3远程连接踩坑记:Navicat提示caching_sha2_password错误的完整修复流程

MySQL 8.3远程连接认证插件问题深度解析与实战修复指南 1. 问题现象与背景分析 那天下午&#xff0c;当我正尝试用Navicat Premium 16连接新部署的MySQL 8.3数据库时&#xff0c;屏幕上突然弹出的红色错误框让我的咖啡杯悬在了半空&#xff1a; Authentication plugin caching_…...

Cadence Allegro 16.6 环境设置保姆级教程:从绘图参数到自动保存,新手避坑指南

Cadence Allegro 16.6 环境设置实战指南&#xff1a;从零配置到高效设计 第一次打开Cadence Allegro 16.6时&#xff0c;满屏的菜单选项和参数设置可能会让新手感到无所适从。作为一款专业的PCB设计工具&#xff0c;Allegro提供了高度可定制的工作环境&#xff0c;但这也意味着…...

如何用Path of Building物品制作系统打造终极装备:5个简单步骤

如何用Path of Building物品制作系统打造终极装备&#xff1a;5个简单步骤 【免费下载链接】PathOfBuilding Offline build planner for Path of Exile. 项目地址: https://gitcode.com/gh_mirrors/pat/PathOfBuilding 你是否曾为《流放之路》中装备制作耗费大量通货却得…...