自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

大坡3D软件开发

自主操作系统和CPU--用软件和芯片来改变世界

  • 博客(2966)
  • 资源 (44)
  • 收藏
  • 关注

原创 C#里低版本使用元组(System.ValueTuple)

为了解决上述两种情况,在高版本的C#已经引入元组,ValueTuple是C# 7.0的新特性之一,.Net Framework 4.7以上版本可用。这里定义了两个元素的元组,第一个元素是double类型, 第二个元素是float类型,然后赋值给t1变量。还有另外一种情况,想把一组关联的数据写到一起,就需要声明一个类或结构,这样会导致编写比较多的代码。析构的过程恰恰与元组的声明和初始化相反,析构是将已存在的元组析构成多个单独的变量。在没有使用元组之前,要想在C#里返回多个值,是比较麻烦一些。

2022-10-27 18:30:00 1738

原创 C#语言里对TCP接收数据的分包处理

因此TCP接收数据就会有三种情况,一种是接收到数据,但是数据太少,达不到一个完整的数据包,这样就不能立即处理这个数据包,要等到下一次数据到来完整之后才能处理。第二种情况,可能由于交换机或电脑等原因,导致收到的数据包会是多个消息包一起,这时就需要拆分的功能,把数据包一个一个地拆开来解释,才能准确得到所有数据。有了合并的函数,就可以对数据包的三种情况进行处理,不过这里又涉及到消息包的长度,所以需要定义一个消息类。这个类用来描述消息的头结构,通过头结构来判断还需要多少数据接收等等。

2022-10-26 22:00:00 2656

原创 C#窗口的Form.AcceptButton 属性和Form.CancelButton 属性

Form.AcceptButton 属性主要作用就是用来指定用户按下Enter键时响应的按钮,因为一个窗口上有很多按钮,如果不指定的话,就不知道选择一个作为回车键响应的按钮。这两个属性的作用大多数都是不需要鼠标操作的时候使用,大家也许感觉到奇怪,为什么会不需要鼠标的呢,其实这个就是在特定的场合使用,比如鼠标突然坏了,又想把软件关闭,或者做一些简单的处理,就需要使用键盘操作。初入门时,看到这两个属性一般不太关注它,因为这两个属性在窗口设计上也不需要设置就可以工作,因为默认了按下回车键的动作。

2022-10-26 11:41:31 1269

原创 在C#里使用随机类Random

由于类Random是非线程安全的,如果需要在多个线程中运行,那就需要使用锁来进行同步线程的访问过程,否则读取到随机数可能会相同的,达不到随机的目的。随机数经常会使用到,因为很多种情况下,不知道客户喜欢什么样的颜色,就可以随机地生成一种颜色,让用户来使用。在这里也不用了解更多的功能,就是使用NextBytes函数即可,它的作用就是随机生成一个数组的元素,即是多个元素。大多数的情况下,我们只要简单地了解一下,就可以使用了,毕竟人的时间有限的。如果要详细地了解它的使用,可以参考官方的文档。

2022-10-25 22:00:00 1183

原创 在C#里传送事件的参数

传送参数可以使用三种情况,一种是直接使用EventHandler,内部定义事件类型,大多数情况下可以这样使用;最后一种是使用范型参数的方式。很多情况下,我们需要传送事件,并且顺带参数传送过去,在事件传送参数是比较常用的功能,现在就来熟悉这方面的内容。这两个类主要区别是第一个不是范型,第二个是范型,所以后面一个可以任何类型的数据。最后只需要定义事件对象和设置事件响应函数即可。把事件封装到一个类里,这样方便后面定义对象。这三种方式是实现事件传送参数的基本方式。//创建范型事件参数。

2022-10-25 13:54:43 1380

原创 C#里在子窗口与父窗口之间进行数据传送

在C#里经常需要在子窗口与父窗口之间进行数据传送,或者调用,虽然有很多方法可以实现,但是采用委托还是比较简单和直接的方式。这里首先判断sendLog变量是否有值,如果有值才会调用Invoke函数,这样就不用写if代码来判断了,可以节省代码编写。在这里添加窗口加载事件函数,然后创建子窗口,并设置子窗口的委托调用函数。.Invoke("向父窗口传送");在这里声明了委托,并且定义了委托变量,以便父窗口可能传送进来。通过上面的方式,就可以实现子窗口与父窗口进行相互传送数据。可以看到输出“向子窗口传送”字符串了。

2022-10-24 17:34:07 2995

原创 使用C#实现欧姆龙PLC FINS协议读取

又由于对欧姆龙的PLC区域不是很了解,一直不了解读写位和读写字的区别,后来经过反复验证,才发现读写位与字的区别是在于区域码会不一样,也就是说,即使是同一个区,也是分为两个区码,比如W区,按位读写就是0x31, 按字读写就是0xB1,其它发送的字节是一样,仅这里的区别。之前也有同事写过这样的协议,但是使用起来不是很方便,因此重新写了一份FINS协议,在开发的过程中,也碰到一些问题,比如C#结构体对齐问题,导致发送数据不对,后来仔细检查才解决了这个问题。

2022-09-23 17:42:50 1666

原创 C#里最简单的异步连接客户端

一个用户定义的对象,其中包含接收操作的相关信息。在C#的界面开发里,经常会遇到异步网络连接,因为异步连接不会阻塞界面运行,同时又可以不使用线程的模型,这样比较适合界面的方式。并且这样使用网络连接又比较简单,可以与界面融合为一体,调用非常简单和直接。一个 AsyncCallback 委托,它引用操作完成时要调用的方法。一个 IAsyncResult 对象,它引用异步操作。Byte 类型的数组,它是存储接收到的数据的位置。引用异步连接的 IAsyncResult。Byte 类型的数组,它包含要发送的数据。

2022-09-22 09:22:02 1008

原创 (29)Blender源码分析之顶层菜单的system菜单分析

Clean Up Space-data菜单是调用SCREEN_OT_spacedata_cleanup操作,对应的函数是spacedata_cleanup_exec。Memory Statistics菜单就是调用WM_OT_memory_statistics操作,对应的函数是memory_statistics_exec。Redraw Timer菜单是调用WM_OT_redraw_timer操作,对应的函数是。菜单作用:重新加载脚本数据目录下所有的脚本;菜单作用:删除编辑器不可见的部分数据。

2022-09-14 08:45:40 617 1

原创 (28)Blender源码分析之顶层菜单的安装应用模板菜单

可见这里的text是定义菜单项上显示的内容。就是说当加载这个类PREFERENCES_OT_app_template_install时,就会生成操作项。同样的原理,从菜单字符串转换到类是程序内部来实现的。所以当用户点击上面的菜单,就会生成一个事件,而这个事件就去寻找对应的操作项。菜单,现在就来简单地分析一下这个菜单,以便我们对这个菜单的调用进行理解。它是在文件路径:blender\source\blender\windowmanager\intern。...

2022-08-10 22:36:26 679

原创 (27)Blender源码分析之顶层菜单的关于对话框

首先是找到图片的来源,它就是通过datatoc_blender_logo_png来找到显示的png图片数据,然后采用IMB_ibImageFromMemory函数来把png图片解压,生成内部的IMBUF数据,这样才能显示。接着通过函数UI_style_get_dpi()获取UI的类型,有了UI的类型,就可以得到界面布局的像素大小,再通过像素的大小来计算对话框的宽度。以后所有显示UI的代码大体相同的,这里有图片显示、有字符串显示,也有菜单显示,这些都是构造UI界面的基本单元。...

2022-08-03 21:46:34 692

原创 (26)Blender源码分析之顶层菜单的关于菜单

这行代码就是显示AboutBlender菜单项,同时也定义了响应这项菜单的操作,就是打开wm.splash_about项的菜单内容,而在前面分析可知,会把这项内容转换为WM_OT_splash_about,这样就可以在代码找到关联的菜单显示内容了。当用户选择上面的菜单时,就会找到当时根据WM_OT_splash_about创建的菜单项,然后根据菜单项找到对应的响应函数,接着就会调用wm_about_invoke函数,它是通过内部函数wm_operator_invoke来实现的。是这个菜单项显示的名称;...

2022-07-30 14:39:11 725

原创 (25)Blender源码分析之顶层菜单Blender菜单

显示是符合上面的函数调用规范,因此必然进入上面的函数,但是我们会感觉得比较奇怪的是函数的参数wm.splash_about,如果你直接拿这个参数去代码里查找,是找不到这个关联的菜单对象。当运行python代码时,通过layout对象查找operator函数,就会遍历上面的RNA对象,然后就会调用UILayout_operator_call函数,这样就可以找到操作对象内容。前面分析顶层BAR菜单的显示,已经它是由TOPBAR_HT_upper_bar类来构造出来的,接着它会由一些项来构成子菜单。...

2022-07-25 22:46:29 964

原创 (24)Blender源码分析之顶层菜单显示代码分析

在draw_left(self,context)函数里,先要获取当前布局对象layout、当前窗口对象window、当前的屏幕对象screen,然后就调用类TOPBAR_MT_editor_menus来显示编辑菜单,然后增加一个分隔条,最后才判断是否全屏显示,如果全屏显示就会多一个返回菜单,否则就显示工作区菜单。当在python代码里定义为TOPBAR时,在运行python代码那时,就会通过上面的数组找到对应的类型,这样就转换为内部类型的识别了,就可以区分这个类到底是顶层菜单条,还是状态条等等。...

2022-07-24 21:32:18 973

原创 (23)Blender源码分析之python里的基类Header分析

不过要理解菜单的显示,就需要理解python里的基类Header,因为其它菜单都是继承这个基类,这样就可以使用这个基类的属性。所以在python里顶部的BAR、菜单、面板都是采用这种方法来派生出来,然后分析类的基类时,就可以找到对应的结构,再通过结构里的指定的函数进行对应的操作。通过TOPBAR_HT_upper_bar类来定义顶部的菜单条,但是它是继承基类Header,而这个基类Header又是什么呢,为什么需要继承它?那么这个菜单的代码又是在哪里定义的呢?...

2022-07-22 18:45:00 593

原创 (22)Blender源码分析之鼠标按下消息到窗口调用过程

通过上面的分析,我们明白了在UI创建时先要关联消息处理的函数,当用户按下鼠标按键,就会触发一个消息到系统里,接着系统就会发送给Windows窗口,blender从Windows窗口再拿到消息,然后再次转发送到自己的界面窗口,最后通过遍历自己的窗口消息队列实现消息处理。这时调用函数ghost_event_proc来处理,它会找到这个事件的窗口,然后再把这个消息添加到窗口消息队列,等待后面再进行处理。这个函数wm_block_close就会比较熟悉了,它是闪屏里设置当点击窗口的图片时调用的函数。...

2022-07-17 23:12:49 613 2

原创 (21)Blender源码分析之鼠标按下消息添加到队列的过程

前面分析闪屏窗口显示,从图片的加载到菜单的布局显示,从C代码到python代码的相互调用,再到整个闪屏的UI布局显示。接着下来我们来分析一下鼠标按下的事件处理流程,这样才能明白blender处理Windows消息的过程,才可以明白它的事件处理过程,才可以进一步地添加事件处理。如果熟悉Windows编程,就会对整个事件处理比较熟悉,如下图所示:这个过程已经十几年都没有变化过,这是Windows的消息机制,因此blender在Windows下运行,也省不了这个处理流程。这个过程在前面的文章也有简单地介绍过,在这

2022-07-14 00:30:14 536

原创 (20)Blender源码分析之闪屏窗口的菜单python代码draw的属性和函数对应

在前面我们可以看到闪屏的图片,现在来分析一下图片中菜单的python代码属性、函数与C代码的结构、函数的对应关系,通过这个关系,我们就可以理解python修改的内容,也就是相当于修改C代码里的内容,这样才能明白python和C代码相互合作完成同一件事情,另外通过一层关系,也可以快速地定位代码的功能,可以为增加功能、修改BUG提供一个坚实的基础。layout.operator_context C代码里对应位置代码:文件是rna_ui_gen.c,结构定义是rna_UILayout_operator_con

2022-07-08 19:15:00 422

原创 (19)Blender源码分析之闪屏窗口的菜单python代码draw函数运行过程

在前面我们可以看到闪屏的图片, 很明显看到菜单分成两列布局,如下图所示:在这里我们需要搞懂blender是怎么样能够把菜单控制两列分布,又是通过什么样的方式来与C代码进行沟通的。我们来查看WM_MT_splash类的python代码,会发draw函数的第一行代码是这样:layout = self.layout主要获取布局对象layout,那么这个布局对象又是从什么方来,会让python代码使用的呢?一般情况有两种来源,一种是python代码里定义的,另外一种是在C的python API里定义的。在这里访问的

2022-07-07 20:30:00 678

原创 (18)Blender源码分析之闪屏窗口的菜单python代码属性识别

在前面我们可以看到闪屏的图片,在后面是显示了菜单,因此分析了菜单注册、菜单显示过程,在最后也提到怎么样运行python的代码,但是没有详细地分析菜单的python代码运行过程,在本文里就来解决这个问题,主要就是理解python定义菜单的代码是怎么样运行的,它的类属性又是怎么样获取到,以及它的draw函数调用的对象又是从哪里过来的呢。这一系列的问题解决,才能搞明白python定义菜单的代码,才可以修改这些python代码,从而可以修改blender的菜单内容显示和操作。第一步,我们看到python定义闪屏的代

2022-07-06 18:30:00 544 1

原创 (17)Blender源码分析之闪屏窗口的菜单显示过程

在前面我们可以看到闪屏的图片,也分析了闪屏里显示的菜单来源,但是还没有把整个菜单显示的过程搞清楚。比如说在blender里是怎么调用python的类代码运行呢?在这里闪屏菜单的python的类代码如下:那么你会问这些代码是怎么样运行,又是怎么改变菜单项的布局,又是怎么样区分不同地方显示?在前面也已经分析过,通过import时候会注册python类到一个全局的HASH表,当显示菜单时再从这个HASH表里找出来。注册时候只是把python类代码进行收集和编译,并不会真正地执行,只有当调用python类里的函数运

2022-07-05 18:15:00 540

原创 (16)Blender源码分析之闪屏窗口的菜单从python加载过程

在前面我们可以看到闪屏的图片,已经分析了闪屏下半部的菜单显示,它显示的菜单资源是来自python代码,采用这种方式来实现,就可以不修改C代码,就可以修改菜单的组成。要实现这样的功能,是一个复杂的过程,如果你想把这个功能集成到你的软件里,就需要看看本文,可以参考blender是怎么样实现的。当然,本文只是一个引子,介绍了大体的研究方向,如需要深入地研究,还得自己去研究blender的源码,才能偷一些blender代码到自己的工程里,这样的开发方式肯定快不少,至少比自己没有方向地研究要快上一大捷,毕竟开源这位“

2022-06-28 20:00:00 684 1

原创 (15)Blender源码分析之闪屏窗口显示菜单功能

在前面我们可以看到闪屏的图片,可以看到有下面的菜单在图片后面,如下图:后面这些菜单又是怎么样显示出来的呢,本文就来探索这个方面的问题,由于blender是一套复杂灵活的软件,所以它的菜单系统也是比较复杂的。要想显示一个菜单,需要理解C的代码,也需要理解python的代码,需要两方面的代码相互配合才能显示正确的菜单。如果一开始对这套代码不太熟悉,就会比较麻烦了,很多功能无从谈起。因此,现在就来分析红色框里的菜单,看看这些菜单又是怎么一个过程来显示出来的,当你理解这个过程之后,才可以修改这些菜单的功能,才能定制

2022-06-25 09:02:09 574 1

原创 (14)Blender源码分析之闪屏窗口显示软件版本号

在前面我们可以看到闪屏的图片, 如果你仔细地查看,就会发现右上角上显示有一个版本字符串,如下图所示:很多软件都会有这个版本号,因为一个软件是不断地更新,不断地升级,不断地迭代的过程,所以需要一个特别的标记来查看这个软件的基本功能,是否已经解决了BUG。版本号就是一个很好的方式,到目前为止,还没有别的方法比它更靠谱,因为它是不断地自动递增,并且很好地表示软件发布的顺序,同时也表示了软件是否还在测试过程中。这样就让使用软件的用户来根据自己的实际需求来使用不同的版本,比如有一些想使用新功能的用户,就可能下载最新的

2022-06-09 13:30:00 530

原创 (13)Blender源码分析之闪屏窗口关闭的事件响应

在前面我们可以看到闪屏的图片, 这个图片的创建过程已经分析过,也明白它是怎么得到的,但是我们还需要知道这个闪屏窗口怎么样来关闭的,因为需要释放一些资源,也需要提供一个退出窗口的方式。在本文里,就来关注一下它是怎么来设置一个窗口关闭处理的。可以这个函数wm_block_create_splash里,看到下面这行代码:UI_but_func_set(but, wm_block_close, block, NULL);当我们点击闪屏窗口的空白地方,就会触发这个窗口事件,从而对整个闪屏窗口进行关闭的动作。因此,先来

2022-06-02 19:30:00 525

原创 使用C++库boost的log功能时 error LNK2019: 无法解析的外部符号 “public: static void __cdecl boost::log::v2s_mt_nt6出错

当你使用高版本C++库boost来编译时,如果使用log功能,可能会出现这样的问题,如下图:这时候提示为:error LNK2019: 无法解析的外部符号 "public: static void __cdecl boost::log::v2s_mt_nt6::record_view::public_data::destroy一开始我遇到这个问题,也是百思不得其解,又是度娘,又是科学上网找东西,但是还没有解决。后来深入地看了boost log的介绍,下面的网站:Chapter1...

2022-05-10 13:15:00 1706

原创 C++17开始取消std::codecvt_utf8支持

由于C++17之后取消std::codecvt_utf8的支持,所以UTF8与UNICODE之间进行转换,就需要使用别的方法了。否则代码是编译不过,这时又需要回到WINDOWS底层的API来调用转换了。需要使用MultiByteToWideChar函数来实现,下面就是实现UTF8到UNICODE之间转换:const std::wstring CCaiStep::Utf8ToWString(const std::string utf8){ //std::wstring_convert<std:

2022-05-10 13:00:00 3406 1

原创 (12)Blender源码分析之加载图片的uiDefButImage过程

在前面我们可以看到闪屏的图片,这个图片是通过函数wm_block_splash_image来加载进来的,然后图片就在数据结构ImBuf,这个数据结构保存了图像相关的属性和显示的内容。刚刚有这个图片的数据,还不能在界面上显示出来,因为图片在界面上没有办法进行布局,如果是多张图片,就会重叠在一起,所以需要把图片放入按钮的数据结构里面,这样提供了布局的功能。下面这行代码,就是解决图片放入到按钮的过程,最后得到uiBut对象, uiBut *but = uiDefButImage( bloc...

2022-05-05 18:30:00 528 1

原创 在树莓派里使用C++库boost

由于C++的高性能,在嵌入式或者树莓派这样的系统,采用这样的语言是非常合适的,这样可以在CPU性能不太高的场合,写出处理大量数据和功能的软件,并且运行速度飞快,这样既节省产品成本,又为社会节能作出贡献,因为可以大量节省CPU运算,就可以省电,就可以少浪费化石能源。而对于linux这样的系统,采用boost库就更加方便了,因为很多功能已经进行封装,使用起来更加方便,不容易出错。那么本文,就来介绍一下怎么样简单地使用boost。先要安装boost,可以采用源码安装,也可以使用编译库的方式来安装。采用源码

2022-04-25 09:23:34 1218 2

原创 让树莓派支持C++17开发

时间不断地流逝,到目前已经是2022年了,离2017年已经过去5年了。因此开发语言也与时俱进,慢慢转换到C++17的版本上来了。要想在树莓派里使用更高的版本,需要安装g++10.1版本。GCC支持C++版本如下:下面就来进行这个过程:更新最新的系统$ sudo apt update && sudo apt upgrade -y从库里下载二进制版本$ git clone https://bitbucket.org/sol_prog/raspberry-pi-gcc-.

2022-04-24 12:02:51 1395 1

原创 树莓派上安装protobuf 3.18.2版本

树莓派上安装protobuf 3.18.2版本从网站上下载源码:https://github.com/protocolbuffers/protobuf/archive/refs/tags/v3.18.2.tar.gz解压到目录:protobuf-3.18.2然后更新软件:sudo apt-get install autoconf automakers lib tool curl make g++ unzipcd protobuf-3.18.2/sudo ./autogen.s.

2022-04-22 19:15:00 1049 1

原创 (11)Blender源码分析之加载图片的imb_loadpng过程

在前面我们可以看到闪屏的图片,但是还有一个大疑问在这里面,那么就是怎么样把文件图片里的格式数据变换成程序可以显示的内存数据,并且保存在数据结构ImBuf什么位置,以便后面读取显示代码时,知道显示的数据来源。简单地说,要实现界面显示,就是把图片当作背景显示,然后在图片之上再添加文本显示,即可以完成。在分析过程之前,我们先把保存图片数据结构看一下,了解数据加载解压之后保存的位置,这样就更加清晰这个过程了。加载解压之后的数据保存在下面的成员: /* pixels */ /** Image pixe..

2022-04-08 18:30:00 622

原创 (10)Blender源码分析之加载图片的IMB_ibImageFromMemory过程

在前面我们可以看到闪屏的图片,在那里也看到了怎么样加载闪屏图片和显示的过程,但是没有分析从内存里的图片数据怎么样转换为将要使用显示的数据,也就是说仅仅把文件的数据读取到内存,还是不能放到显示内存进行显示的,还需要对文件的类型进行解码,然后才能重构图片的位图出来,才可以把它显示出来。在本文里就来分析这部分的代码,由于闪屏的图片类型是PNG类型,在这里就以这个为例子进行分析。ImBuf *IMB_ibImageFromMemory(const unsigned char *mem,...

2022-03-24 22:00:00 1400 1

原创 (9)Blender源码分析之加载闪屏图片的wm_block_splash_image过程

在前面我们可以看到闪屏的图片,如下图所示:这一个png的图片,blender会从内存里加载这个图片,因为blender在编译时,已经把这个图片生成数据文件,变成一个C语言的数组,然后就编译到EXE文件里面,所以读取图片时,只需要从内存数组读取即可。图片文件名称叫做:splash.png,它在目录:blender\release\datafiles通过配置程序的编译工具,就可以生成下面的文件:splash.png.c这个文件在目录:build_windows_Full_x64_vc16

2022-03-10 18:30:00 509 1

原创 (8)Blender源码分析之创建区域对象UI_block_begin函数

(8)Blender源码分析之创建区域对象UI_block_begin函数在Blender的闪屏里,前面初步分析了uiBlock数据结构,但是还有很多成员并没有说明,因此需要继续对这个结构的成员进行介绍。接着下来通过UI_block_begin函数的分析来了解块区域的创建,才能明白一个弹出式的子窗口是怎么样构造,怎么样实现显示出来的,同时也明白一个OpenGL的UI是需要什么样的基本内容。uiBlock *UI_block_begin(const bContext *C, ARegion *

2022-02-25 18:30:00 742

原创 (7)Blender源码分析之创建区域对象

在Blender的闪屏里,为了弹出一个子窗口,需要调用下面的函数来创建一个子窗口的区域:uiPopupBlockHandle *ui_popup_block_create(bContext *C, ARegion *butregion, uiBut *but,...

2022-02-24 13:15:00 746 1

原创 (6)Blender源码分析之屏幕和区域对象结构

在Blender的设计里,UI是采用单一系统窗口的设计,比如在Windows系统里,只需要创建一个窗口,然后所有的绘制和子窗口都是自己在这个窗口里实现,并且不再使用系统的UI功能,全部是自己通过OpenGL实现。所以在Blender每一个系统窗口采用一个屏幕对象结构--bScreen数据结构来描述,然后在屏幕里再分割子窗口--screen area。因此我们先要来学习bScreen数据结构,才能明白UI是怎么样实现屏幕级别的层次。typedef struct bScreen { ID id;.

2022-02-22 11:13:41 1578

原创 (5)Blender源码分析之上下文的索引结构

(5)Blender源码分析之上下文的索引结构在前面闪屏的显示里,可以看到一个界面的基本组成,包含字体、图片、文本和菜单等等。由于所有屏幕显示的内容都是通过OpenGL来实现,意味着没有现成的GUI系统可以使用了,像大家常用的Windows的GUI是没办法使用的,因为它只使用这个窗口来绑定OpenGL的窗口,所有文本的显示都需要自己从字体里抽取出矢量图片,然后再把每一个字符的图片进行排版显示,所以整个GUI系统是比较复杂的,也会有比较多的细节内容。这里相当于自己实现了一套GUI显示系统,为什么要这样

2022-02-18 20:45:00 1074

原创 (4)Blender源码分析之闪屏窗口显示流程

(4)Blender源码分析之闪屏窗口显示流程Blender的UI系统是一个很复杂的系统,要一下子了解整个系统是不可能的,必须一步一步地解决理解整个系统,为了简单,先从Blender显示的闪屏界面开始,这样就可以把可视化的界面进行了解,快速地理解blender是怎么样去设计一个弹出式窗口,怎么运行一个弹出式的窗口。本文要分析的闪屏界面窗口如下:虽然是一个简单的界面,在这里包含了图片显示,文本标签显示,窗口菜单显示等等内容。一、Blender GUI主要有下面几部分组成:1)GHO

2022-02-15 18:15:00 1364

原创 歌曲从DTS转换为MP3的方法

歌曲从DTS转换为MP3的方法在这里主要使用以下软件:foobar2000_v1.6.10.exe 这个可以从下面网站下载:foobar2000: Downloadinglame4.0: lame4.0a14.ziphttps://newsoftdown01.rbread05.cn/down/2021down/12/20/lame4.0a14.zip?timestamp=620b4d73&auth_key=0bf7dbbf67a93690389289229240204e.

2022-02-15 17:58:20 3075

C++读写json文件

https://github.com/nlohmann/json 最好用的C++读写json库

2017-12-09

python抓取天气并分析 实例源码

Python代码抓取获取天气预报信息源码讲解。这是一个用Python编写抓取天气预报的代码示例,用python写天气查询软件程序很简单。这段代码可以获取当地的天气和、任意城市的天气预报,原理是根据url找到网站截取相应的数据展现。 python抓取广州天气并分析 实例源码

2017-08-28

wix3.11版本安装工具

wix3.11版本安装工具

2017-06-19

WiX3.10版本安装工具

WiX3.10版本安装工具

2017-06-19

GOOGLE的TPU论文

GOOGLE公开TPU的论文

2017-04-06

深度强化学习论文

DQN的论文

2017-03-17

书《深度学习》

2015年,深度学习三大牛Yann LeCun、Yoshua Bengio和Geoffrey Hinton在最新的《Nature》杂志首次合作的发表综述文章《Deep Learning》。本文为该综述文章的中文译文,深入浅出地介绍了深度学习的基本原理,核心优势和未来展望。

2017-03-13

手写识别的训练数据

MNIST训练数据

2017-03-10

俄罗斯方块游戏开发

俄罗斯方块游戏开发培训里的可执行文件,让大家可以查看相关的结果。以便是否参加培训。

2016-11-30

duilib界面库20161116

更新为VC2015编译的duilib,持续重构代码,使用最新的C++14的语法。

2016-11-16

duilib界面库20161017

duilib 界面库

2016-10-17

duilib界面库

duilib界面库,长期维护的界面库,在WIN10和VS2012上编译和开发、测试通过。

2016-10-10

国产8051模拟器

一款国产的8051模拟器(全部源代码) 本软件是一款8051模拟器,他的特点是可以模拟多处理器平台,在简单的多工作区间的界面上可以很方便的模拟8051处理器, 最重要的是这个单片机系统可以完全由你自己订制,你甚至可以随意创建自己的多单片机系统,什么SMP 基于串行总线的分布式系统,集群式系统,只要你能想到的,都可以办到,充分发挥你的想象力。现在1.0版本已经基本体现出了这种思想,在以后的版本中将使这一特性变的 更加强大!

2016-09-10

mysql开发管理工具

mysql数据库的开发管理工具。

2016-07-12

mysql-5.5.50-64

windows下的64位MYSQL的版本。

2016-07-10

python-3.4.4

python 3.4的32位的windows版本

2016-07-01

tinyxml2配套源码

在软件开发过程中,为了使软件有灵活的配置,特别像界面这样的配置,同时为了减轻重复开发的任务,需要把客户的个性化需求可以通过配置文件来修改,比如像界面的颜色配置,就可通过配置文件来修改,这时就可以采用XML文件来保存和修改这些参数配置。在不同软件之间进行通讯时,也可以采用XML协议来进行数据交换,特别像WEB服务的调用时,采用传送XML格式是基本的数据交换方式。基于这些任务的需求,需要软件开发人员会在C++里使用xml格式。

2016-06-27

protoc2.5执行文件

protoc执行文件

2016-06-24

protobuf 2.5

protobuf 2.5库代码和工具

2016-06-24

selenium的浏览器驱动

目前有很多的银行网站,还是以IE为标准的浏览器,因此这里主要采用IE为测试的例子,在这里可以下载不同版本的浏览器驱动,可以是32位的,也可以是64位的,根据自己的需要下载不同的版本。在本文章里,下载的是2.35.3版本:IEDriverServer.exe,把它放在目录f:\temp\里面。

2016-06-14

C#实现简单protobuf学习的例子

C#实现简单protobuf学习的例子, 可以快速地开发protobuf的功能,这样快速地从一个例子来学习。

2024-10-02

开源鸿蒙4.0不能进入桌面的补丁

系统启动后进入不到桌面 当前系统有 bug,当出现此种问题时,需要执行 killall com.ohos.launcher。 里面的hap文件替换applications\standard\hap\下的同名文件。 目录 oh/applications/standard/hap

2024-03-17

开源鸿蒙 4.0 RK3566开发板配置

开源鸿蒙 4.0 RK3566开发板配置 https://mysoft.blog.csdn.net/article/details/136779805

2024-03-17

使用WeifenLuo.WinFormsUI.Docking的简单例子

使用WeifenLuo.WinFormsUI.Docking的简单例子,演示了简单地使用这个窗口布局库。

2021-12-10

hui_test_form.rar

H-ui.admin_v3.1.3.1的学习和测试例子,前端代码的经典。

2021-08-17

python_example.rar

pybind11的安装和编译的例子,可以快速地生成安装包。

2021-06-24

Mysql_20210615_1.rar

演示访问Mysql库的C++类库QTL

2021-06-15

TestSel1.rar

爬虫日记(28):scrapy使用中间件调用浏览器 相关代码

2021-03-29

ItemDemo_ua.rar

爬虫日记(25):Scrapy 中设置随机 User-Agent 二 的配套代码

2021-03-26

爬虫日记 Imgfn1.rar

爬虫日记(23):用scrapy快速地爬取蜂鸟网图片 相关的项目代码

2021-03-24

ImgDemo1.rar

爬虫日记(22):最简单地抓取图片,仅5行代码 相关配套代码。

2021-03-23

ItemDemo3.rar

爬虫日记(21):使用Pipeline模块写入文件二 的配套代码。

2021-03-23

ItemDemo2.rar

爬虫日记(20):使用Pipeline模块写入文件 的例子

2021-03-22

ItemDemo.rar

实例使用Item对象,适用初学者,《爬虫日记》配套源码。

2021-03-21

svm_hog_data.rar

使用到LineSVC里进行机器学习的训练数据,用来训练手写识别。 配套专栏文章使用,https://blog.csdn.net/caimouse/article/details/104599920。

2020-03-02

实现numpy的C++库扩展

使用C++来扩展numpy里的数据计算,这时就需要使用numpy的扩展库功能了,下面就来提供一个使用C++编写numpy扩展库的模板,这样大家就要减少很多弯路,减少跌入坑里的成本。这个扩展库的模板是从mahotas库里抽取出来的,经过最大化的简化,这样更加容易理解,更方便学习。

2019-11-24

STM32F407VET6工程模板

玩转STM32里文章配置的代码,这里学习的第一个工程代码,可以作为后继开发的模板工程。

2019-03-14

python web py入门配套源代码

python web py入门- 实现论坛,开发技术:后端采用Python+web.py+MySQL,前端采用HTML+CSS+JavaScript+jQuery+RequireJS。

2018-02-23

webpy演示例子1

webpy演示例子1, 用于配套文章相关资源。python web py入门(9)- 论坛首页的模板中模板 前面已经提到一个模板中可以套用另外一个模板,现在就来看看这个论坛基本布局模板是怎么样的?

2018-02-21

胶囊模型的代码

胶囊模型的代码在以下论文中使用: “Dynamic Routing between Capsules” by Sara Sabour, Nickolas Frosst, Geoffrey E. Hinton. 要求 TensorFlow ( 访问 http://www.tensorflow.org 了解如何安装和升级) NumPy (详见http://www.numpy.org/) GPU

2018-02-02

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除