- 博客(2961)
- 资源 (44)
- 收藏
- 关注
原创 鸿蒙OS应用开发的开发环境
当你想投入到这个生态系统里的时候,首先是使用它,这是最方便的方法,比如买一台带有鸿蒙系统的手机,并且不断地使用它,提出你自己的建议,让它进行完善和改进。在这里主要开始学习开发鸿蒙系统的应用,由于鸿蒙系统发布的时间不是很久,当然是相对安卓和IOS来说,因此它是一个全新的系统,并且致力于创建一种更方便的软件方式,它引入不同于以往的软件开发语言,以及不同的界面接口。这时候,就可以看到应用的名称,包的名称,保存的位置,编译的SDK版本,运行模式,是否可视化编辑,语言,兼容性API,设备类型。
2023-12-07 12:31:53 621
原创 使用VS2022编译树莓派的远程工程时出错boost::log::v2_mt_posix::attribute_name::get_id_from_string(char const*)
最后才发现一个问题,在linux命令行里编译时,可以把多个参数一起写入去,它们会分配到不同阶段使用,但是 VS2022就不行了了。因为C++的应用使用 boost库,这时候创建简单的工程都可以编译,但是到log这个库,就怎么搞都不成功了。libboost_log.a,所以要注意这个变换规则,首先要把lib去掉,再要把.a去掉。这样是可以编译通过的,那么说明就是VS2022的配置问题了。仔细地查看了整个程序的配置参数,都没有发现什么问题。这样添加之后,还是编译不会通过,还会提示出错。
2024-10-03 22:06:45 471
原创 树莓派5里使用protobuf
可以看到我这里的系统带的是3.21.12的版本,对于我来说,这样是满足了需求了。不去折腾最新的版本。比如最新的V28版本,就会要求使用cmake或者bazel来编译了。由于现在protobuf越来越复杂了,自己去编译,还是比较麻烦。这样就安装成功所有开发相关的库文件了,这里主要是针对C++的。如果不要求使用最新的版本,直接使用系统里带的版本也是可以的。然后就可以在树莓派里使用它来编译了。
2024-10-03 11:18:42 325
原创 C#里使用protobuf的简单的例子
由于这里是采用Win11,所以下载这个文件:protoc-28.2-win64.zip。可以从这里下载到相关的源码,然后再下载它的协议编译器protoc.exe文件,在这里直接使用protobuf的项目源码的方式:Google.Protobuf。有了这个文件,就可以添加到项目里,不过项目里要添加protobuf引用。通过上面的学习,就基本上可以进入protobuf的门路了。在这里打包,就会生成一个out_bin.dat的文件。其它更加复杂,高级的功能就要自己去领会了。再添加它的签名键:keys。
2024-10-02 20:15:56 738
原创 VS2022跨平台开发树莓派5的应用程序
这样操作系统就会比较稳定,再加它支持PCIE的硬盘,那么数据保存和加载就已经很快了。在这里添加树莓派的IP地址,以及帐号和密码,当然要先在树莓派里打开远程SSH功能。对于那些不想在Linux下进行开发的人来说,采用Windows也是可以的。在这里就可以写代码,并且进行调试输出了。跟调试本机的代码差不多。并且不是太贵,还容易扩展硬盘,还销售了比较多,超过1亿台。这样基于树莓派的开发,就变得比较重要了。这样就可以创建基于树莓派的应用程序了。由于树莓派5比较适合硬件相关的项目,所以应用的场合就会越来越多。
2024-10-02 12:34:48 237
原创 C#里BinarySearch函数的二分法必须学会使用
使用由 Array 的每个元素和指定对象实现的 IComparable 泛型接口,搜索整个一维排序数组中的特定元素。使用指定的比较器在已排序 List 的某个元素范围中搜索元素,并返回该元素从零开始的索引。如果未找到该元素,则该方法返回一个负数,该负数是下一个大于指定元素的元素的索引的按位补码。使用默认的比较器在整个已排序的 List 中搜索元素,并返回该元素从零开始的索引。使用指定的比较器在整个已排序的 List 中搜索元素,并返回该元素从零开始的索引。
2024-09-29 17:54:51 128
原创 C#源码安装ZedGraph组件,并且立即演示使用
这样就可以把代码全部下载下来,不过它是支持.net 3.5的版本,现在已经不再使用,编译器里也没有带有这个SDK,需要把它删除掉,这里的ZedGraph.dll是公共文件,ZedGraph.WinForms.dll是导入到WinForm应用程序的文件。当然这个程序没有干什么事情,下一次再来一个复杂一点的程序。在工具箱里添加动态连接库,就可以出现这个组件。这里添加了.net 4.8的支持。这样就可以运行程序了,
2024-09-28 16:54:31 324
原创 在windows上编译micropython工程出错
所以会在目录\micropython\ports\windows里找到工程文件micropython.vcxproj。然后就可以在Windows目录下面找到对应的编译文件,这里主要是Windows上对代码进行研究学习使用。反正我也是没有找到这个原因,后来只能把它的一个用不到的模块给拿掉,就可以编译成功了。这时候去进行编译,就会发现需要安装python 3的版本。在工程文件里,把红色这个模块删除,就可以编译成功了。
2024-09-27 19:37:17 94
原创 C#里使用最简单的线程调用界面更新的方法
这是 lambda 表达式不支持的匿名方法的唯一功能。但是线程与界面线程一般不是同一个线程,不能直接调用更新,需要采用委托的方式来更新。为实现向后兼容性,如果只有一个参数名为 _,则将 _ 视为匿名方法中该参数的名称。从 C# 11 开始,编译器可以缓存从方法组转换创建的委托对象。要实现这样的功能有很多种写法,但是最简单的写法就是采用委托delegate。意思就是说,要线程把数据定义更新的方法之后,把指针发送给界面线程来执行。在C#的界面应用里,经常会遇到线程里计算得到的数据,要更新到界面上。
2024-09-24 08:57:53 513
原创 C#往压缩包Zip文件的文件追加数据
接着就可以使用ZipArchive.GetEntry(String) 方法获取这个索引项,最后就可以打开此文件进行读写的操作了。release是文件在压缩包里的目录名称,ExistingFile.txt是在这个目录下面的文件名称。往一个已经压缩好的压缩包里追加数据,一般就有两种方式,一种是前面已经学习过的,就是追加一个新的文件,在压缩包里声明的名称,与外面的文件路径又一点差别的,它是采用/来分隔目录与文件的层次关系。往已经存在的文件追加数据,需要先找到文件索引。C#往压缩包Zip文件的文件追加数据。
2024-09-19 10:29:47 416
原创 C#往压缩包Zip文件里创建一个新的文件
返回的对象readmeEntry是类ZipArchiveEntry的对象,它是用来操作压缩里的一个文件,比如这个文件删除、打开等属性。有时候拿到一个压缩包Zip文件,又不想使用程序把它解压出来,再添加一个文件进去,再进行压缩打包。比如一个游戏软件压缩包,可能比较大,如果解压再添加,就会速度比较慢,使用这种方法就可以直接添加。这里使用StreamWriter打开压缩包中的一个文件,然后就可以往这个文件里写入数据,并进行压缩的操作。创建在 zip 存档中有指定路径和项名的空项。
2024-09-17 22:11:35 534
原创 C#解压Zip文件到指定目录
/压缩文件文件路径。前面学习了怎么样把目录压缩到一个Zip文件,现在来学习怎么样把压缩文件解压到目录,这是学习解压缩文件的一个必须的操作。最后一个参数就是文件名称使用不同编码时需要使用的参数,如果是不同国家的操作系统就需要适应了。将指定 zip 存档中的所有文件解压缩到文件系统的一目录下,并使用项名称的指定字符编码。主要有两个参数,第一个参数是要解压缩的文件名称,第二个参数是解压缩到所在的目录。将指定 zip 存档中的所有文件都解压缩到文件系统的一个目录下。
2024-09-17 20:33:11 501
原创 C#使用ZipFile的方法CreateFromDirectory
因为数据是一种思想的表现,特别是ChatGPT的AI出现,导致很多数据无限地使用机器化地产生,所以数据压缩还是很常有的事情,毕竟压缩之后可以减少磁盘空间的占用。在C#里有一个专门处理磁盘压缩功能,它就是System.IO.Compression 命名空间,包含为流提供基本压缩和解压缩服务的类。第四个参数是表示是否包含目录的名称,如果设置为true表示包含目录名称,如果设置为false不包含目录名称。由于现在数据越来越大,虽然磁盘的大小也在增加,但是数据增加的速度是远超过磁盘的增加速度。该文件不应执行压缩。
2024-09-14 16:14:48 320
原创 C#操作Windows时间同步
有时候需要手动地同步系统的时间,这时就是从网络上进行同步时间。如果采用手动的方式,往往需要点击时间,并找到选项来进行。如果采用程序的方式,就可以定时进行同步,又可以手动地进行同步时间。
2024-09-12 13:20:09 339
原创 C#读取应用配置的简单类
WindowsFormsApp3.exe”(CLR v4.0.30319: WindowsFormsApp3.exe): 已加载“C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Xml\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.dll”。因为工业应用的软件,往往是多变的,特别是同一个工厂就有不同的参数,这样参数管理配置,就成为工厂软件开发的必选项,并且要非常方便地操作,快速地使用。后期可以随着运行应用之后修改。
2024-09-12 09:34:58 352
原创 C#里使用位图容器BitArray
比如从网络协议里传送过来的字节流,就可以直接写入到里面,就可以直接获取对应的位图操作了。在C#里就是使用BitArray来管理位图数据结构,这样就比较方便处理。由于经常需要操作一些位表示的数据结构,那么就需要采用位图的管理方式。由于这个位图比较简单,只要搞懂下面的例子,就可以入门了。这个类可以有多种构造函数,可以满足绝大部分的要求。
2024-09-10 19:48:58 607
原创 Application.OpenForms[“Form2“]找不到窗口的问题
在WinForm开发里,很多人想判断窗口是否已经打开,所以使用窗口属性OpenForms来解决这个问题,但是它是有一个先决条件,就是在初始化函数InitializeComponent()里声明窗口的名称,不能只是在属性里默认创建的名称。这里采用遍历窗口列表,并使用is判断窗口类型方式,这样就不会出现上面的问题。否则这行代码永远返回空的。
2024-09-09 11:25:38 156
原创 鸿蒙应用开发之List容器
前面学习了表格类似的布局容器,在这里也有列表形式的容器,比如List容器。特别适合图片进行浏览显示,这样用户可以不断地滚动查看图片,差不多是无限查看的可能。.divider({ strokeWidth: 2, color: 0xFFFFFF, startMargin: 20, endMargin: 20 }) // 每行之间的分界线。.edgeEffect(EdgeEffect.Spring) // 滑动到边缘无效果。采用列面,本身就可以滚动,所以可以上下查看内容。这里设置的排列方向为竖直的排列方向。
2024-08-22 20:36:08 109
原创 鸿蒙应用开发之GridItem容器
.rowStart(1).rowEnd(2).columnStart(1).columnEnd(2) // 同时设置合理的行列号。}.columnStart(1).columnEnd(4) // 只设置列号,不会从第1列开始布局。从上图看到4字这项占用的空间比较大,其它的是一样的,这样的布局又是如何实现的呢?这时候就需要使用到GridItem容器。就是上面显示最后那列内容为5的表格。这样设置就会显示为4的单元格大小。
2024-08-16 11:24:54 95
原创 鸿蒙应用开发之Grid容器
而这个行列布局完全靠两个字符串来决定,因此,灵活性上来说,它没有GridRow容器灵活,但是它简单一些,对于大量元素显示的布局就比较合适,比如图片浏览显示等等。主要的属性就两个,第一个属性是columnsTemplate,它是设置每行多少列显示的。例如, '1fr 1fr 2fr' 是将父组件分3列,将父组件允许的宽分为4等份,第一列占1份,第二列占1份,第三列占2份。设置为'0fr'时,该列的列宽为0,不显示GridItem。如果这两个属性都设置,那么只按照这个设置进行显示,多余不会显示。
2024-08-08 10:00:03 116
原创 鸿蒙应用开发之GridRow和GridCol容器
在不同屏幕上布局是一个比较困难的问题,因为屏幕大小不一样,导致内容布局会比较混乱。所以提出一种网络的方式来布局,即使屏幕大小改变了,但是布局行列数不变,那么内容就不会混乱。这个参数是用来设置判断不同屏幕大小时,进行切换的判断标准。当屏幕大小为xs时,空间占用两格,当屏幕为sm时,占用3格,当为md时,占用4格。这个参数是用来表示每格之间的间距,x是表示横向方向,y是表示竖向方式。要想把这种布局搞好,还是需要不断试验和修改才能调整适合不同设备的界面。所以可以根据这个情况来设置界面的布局。主要有上面这些标志。
2024-08-06 12:01:58 118
原创 鸿蒙应用开发之Flex容器
前面学习了Column等容器,现在学习一个灵活弹性的容器,它就是Flex容器。它可以让容器里面的组件按不同的方式来排序前后,而不需要调整界面显示的代码。在这里可以看到组件显示的方向不一样,前面一行是从左到右进行布局,而后面一行是从右到左布局。针对这种需求,只能使用Flex容器才能方便实现。标准Flex布局容器。这是方向参数的区别。
2024-07-13 12:11:09 730 1
原创 鸿蒙应用开发之Counter容器
要在文本组件里显示出来,需要定义一个数字变量,然后在上面两个事件里对这个变量进行计数,点击减少就对变量进行减少,点击增加就对变量进行增加,然后就可以在文本组件里显示出变量的值变化。这段就是事件响应代码,如果变量值不是按1变化,可以按10变化地修改。上面组件中间显示5的组件是一个文本组件,边上提供了增减的按钮。
2024-07-11 11:40:31 753
原创 鸿蒙应用开发之Column容器
这个Column容器设置显示为上一个容器的90%宽度,所以在手机两边就留有空间。其中看到每个边框有实线的也是一个Column容器,这里只不过把它的边框显示出来,最外面这个Column没有把边框线显示出来。先在最外面建立一个Column容器,space和方框显示等显示内容都是作为一行进行排列。如果一行里子容器不填满宽度,那么就需要进行排列,默认是中间排列,也可以设置为从左向右,或者从右向左都可行。这个容器已经使用了很多次,但是还是需要来简单地学习一下,它的主要作用是沿垂直方向布局的容器。
2024-07-05 10:26:19 142
原创 鸿蒙应用开发之Badge容器
在开发应用的时候,经常需要一些提示,特别当用户打开应用时,有一些事情需要提醒一下用户,但是不能自动打开这个窗口提示,这样会让用户比较烦。方法1: Badge(value: {count: number, position?在这里显示红点的地方,就是目前介绍的容器Badge实现的功能。从上面来看,有三种不同的形式,一种是在图标上显示一个红点,一种是图标后面显示红色文字,最后一种是显示一个数量。方法2: Badge(value: {value: string, position?根据字符串创建标记组件。
2024-07-04 10:28:55 125
原创 鸿蒙应用开发之OpenGL的EGL
EGL 是渲染 API(如 OpenGL ES)和原生窗口系统之间的接口,通常来说,OpenGL 是一个操作 GPU 的 API,它通过驱动向 GPU 发送相关指令,控制图形渲染管线状态机的运行状态,但是当涉及到与本地窗口系统进行交互时,就需要这么一个中间层,且它最好是与平台无关的,因此 EGL 被设计出来,作为 OpenGL 和原生窗口系统之间的桥梁。这也许就是EGL的功劳吧,简单地说EGL就是Opengl和平台各平台之间的一个适配器,是一系列的接口,具体实现是由具体的设备厂商实现的。
2024-06-29 12:23:31 181
原创 鸿蒙应用开发之OpenGL绘画三角形
并且使用GL_FLOAT类型,由于坐标值已经归一化,也就是在-1到1之间,所以设置为GL_FALSE,无须归一化处理。可用的符号常量有GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT,GL_UNSIGNED_SHORT, GL_FIXED, 和 GL_FLOAT,初始值为GL_FLOAT。这个数组定义了三角形的三个坐标,第一个顶点是(0.0f, 0.5f, 0.0f),第二个顶点是(-0.5f, -0.5f, 0.0f),第三个顶点是(0.5f, -0.5f, 0.0f)。
2024-06-04 11:25:06 247
原创 鸿蒙应用开发之OpenGL应用和X组件12
如果成功,就会返回非0值,这时候就可以返回整个编译后的着色器对象shader,否则后面就去查找编译出错的原因。这段代码把上面的x组件的ID转换为string串对象,然后调用函数 PluginRender::GetInstance获取渲染对象render ,最后调用渲染对象的函数render->m_eglCore->ChangeColor。这个函数主要传入两个参数,第一个参数type是加载着色器的类型,在这里主要有两种,一种是GL_VERTEX_SHADER,另外一种是GL_FRAGMENT_SHADER;
2024-06-03 10:05:07 261
原创 鸿蒙应用开发之OpenGL应用和X组件11
在这个函数,先设置m_flag标志,这个标志是用来表示是否画四边形,如果为false表示还没有画四边形,这时候点击界面就不会改变颜色。这段代码就可以通过X组件的指针来获取X组件的ID字符串,把它保存在变量idStr,这样后面就可以通过ID串来找到对应的渲染对象。这段代码从环境变量里获取X组件的指针,保存在exportInstance里,后面会通过X组件指针来操作X组件。要显示四边形,先要构造一个四边形的顶点数组。在上面这段代码里,先进行日志输出,然后进行参数判断,如果参数不正确就返回出错。
2024-05-31 09:04:03 793 1
原创 鸿蒙应用开发之OpenGL应用和X组件10
ExecuteDraw的作用是设置要显示图形的顶点坐标,以及显示的颜色,并进行绘制。这个函数输入几个参数,第一个参数position是用来表明是哪一个索引输入位置,是从函数glGetAttribLocation(m_program, POSITION_NAME)里获取的返回值,其实就是"a_position"的位置,也就是顶点坐标的输入索引;在这里使用这行代码glVertexAttrib4fv(1, color)来设置所有顶点的颜色值,这里指定的索引号为1,也就是GLSL程序里的位置1的颜色索引。
2024-05-30 09:57:24 144
原创 鸿蒙应用开发之OpenGL应用和X组件9
着色器程序对象相当于着色器对象的容器,和任何OpenGL管理的对象一样,在使用着色器程序对象之前,需要通过glCreateProgram接口来创建出一个着色器程序对象。这段代码就是对前面进行链接的程序进行判断是否出错,如果连接成功就可以返回当前的程序进行使用,当前程序是保存在变量program里。这段代码调用glAttachShader进行关联到着色器管理对象,这样顶点着色器和片段着色器就放到管理对象里面,最后调用glLinkProgram来进行连接,才能生成GPU执行的二进制程序。
2024-05-29 09:53:17 184
原创 鸿蒙应用开发之OpenGL应用和X组件8
layout(location = 0),叫做布局限定符,目的是为了方便给变量提供数据,layout()的还有其他的选项,在这里location相当于设定了变量在着色器程序中的访问位置。还需要注意的是,变量名不能以 gl_ 作为前缀,这个是 GLSL 保留的前缀,用于 GLSL 的内部变量。gl_Position vec4 输出属性,变换后的顶点位置,用于后面的裁剪等操作,所有的顶点着色器都必须写这个值。gl_MultiTexColor vec4 输入属性,表示的是顶点的第n个纹理的坐标。
2024-05-28 10:11:25 191
原创 鸿蒙应用开发之OpenGL应用和X组件7
在前面介绍了X组件调用函数来初始化,初始化之后,就需要调用EGL函数来初始化OpenGL的环境,才能使用OpenGL函数来绘制图形。调用 EGLboolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor),该函数会进行一些内部初始化工作,并传回EGL版本号(major.minor)。保存窗口的宽度和高度,以便后面使用。这段代码开始进行初始化EGL,主要是调用eglInitialize函数,然后获取OpenGL的版本号。
2024-05-27 12:12:03 178
原创 鸿蒙应用开发之OpenGL应用和X组件6
接着重要的功能,就是设置X组件回调函数对象m_callback,它的4个调函数指针,都设置好之后,就可以给X组件进行处理了。前面已经分析怎么样注册X组件的回调函数,然后这些回调函数就可以在X组件合适的时机进行回调,就可以让C++的代码在合适的时间做合适的事情。在这段代码,先从容器里查找是否在存在这个ID的X组件插件,如果没有就会创建一个PluginRender对象,这个对象负责注册回调对象维护,并且管理显示图像的对象。在这个回调函数里,传入两个参数,第一个参数component是一个X组件的指针;
2024-05-24 12:24:12 385
原创 鸿蒙应用开发之OpenGL应用和X组件5
这段代码就通过NAPI的函数napi_get_named_property获取X组件的通用指针,它定义名称为OH_NATIVE_XCOMPONENT_OBJ,这是X组件在C++端的名称。这段代码就是使用获得的X组件的指针,然后通过函数OH_NativeXComponent_GetXComponentId来获取X组件的ID,这个ID保存在idStr数组里,给后面使用。因此,我们需要注册C++层的回调函数OnSurfaceCreated,这样当X组件创建成功之后调用我们在C++里的代码。
2024-05-22 11:59:36 182
原创 鸿蒙应用开发之OpenGL应用和X组件4
接着就是做主要的事情,映射库的导出方法getContext,这是在ArkTS里看到的方法,在C++里实际上是函数PluginManager::GetContext,这个函数也是一个静态的全局函数,可以任何地方调用,并且这个函数里的访问变量也是全局的。这行代码干的活比较多,首先要拿到X组件在C++里的指针,然后绑定这个X组件和ID关系,并且注册X组件的回调函数,这样才能根据X组件的生命周期来处理界面,最后还需要导出X组件交互函数,以便用户在X组件点击时触发C++层的代码运行。接着查找GLES库。
2024-05-21 10:39:18 162
原创 鸿蒙应用开发之OpenGL应用和X组件3
这些函数都是根据APP生命周期来调用库里的函数,这样库里的函数就可以根据这些函数来安排不同的代码执行了,在这个例子里基本上就是打印一个日志输出,没有什么实质内容。前面已经分析应用生命周期和页面生命周期,所以我们需要在OpenGL开发的库里区分这两个状态,以便在不同的状态下导出不同的函数给TS侧使用。然后返回一个任何类型的对象。上面页面的生命周期的调用顺序流程图,根据流程图,就可以在将要显示的函数加载资源文件,以便在显示出来时就能画到界面上。这样在C++开发的代码库里,就可以根据这些函数来执行需要的代码。
2024-05-20 11:49:01 176
原创 鸿蒙应用开发之OpenGL应用和X组件2
紧跟着下来onLoad方法设置加载XComponent组件成功之后获取这个组件对应的对象,保存在变量this.xComponentContext,这样后面就可以调用它为更新X组件绘制的内容,达到交互的目的。在这里要注意的是显示文本串是从资源里加载,并且资源里有中英资源,可以根据系统的语言来自动切换不同的语言显示的。在X组件里又设置了这个库的名称,那么在加载X组件时,就会自动要求系统加载这个库,当这个库加载完成之后,就会调用。从上面可知,应用生命周期是大于页面生命周期的,所以需要区分所处状态。
2024-05-20 10:15:43 227
原创 鸿蒙应用开发之OpenGL应用和X组件1
前面学习调用C++开发的代码库,这样可以加入C++语言来开发鸿蒙应用,加快对一些要求运算速度比较高的场合,也提高对旧的项目移植性。前面的C++语言开发的应用,只是简单的调用功能计算,并没有C++代码来操作界面的要求,并且没有使用复杂的C++的功能,这里不仅要在C++里输出图形到界面,并且还是采用OpenGL来开发,OpenGL就是一个非常复杂的库,以及不同的编程习惯。从上图我们就可以看到整个软件的基本组成,与前面学习的C++开发代码库是一样的,只是不同的文件,以及增加X组件的应用。
2024-05-17 12:12:46 820 1
python抓取天气并分析 实例源码
2017-08-28
书《深度学习》
2017-03-13
国产8051模拟器
2016-09-10
tinyxml2配套源码
2016-06-27
selenium的浏览器驱动
2016-06-14
开源鸿蒙4.0不能进入桌面的补丁
2024-03-17
开源鸿蒙 4.0 RK3566开发板配置
2024-03-17
svm_hog_data.rar
2020-03-02
实现numpy的C++库扩展
2019-11-24
python web py入门配套源代码
2018-02-23
webpy演示例子1
2018-02-21
胶囊模型的代码
2018-02-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人