Mint_21.3 drawing-area和goocanvas的FB笔记(一)

一、关于freebasic和goocanvas

Linux下的FreeBasic是C的一种实现,有指针、类、线程,正则表达式,可内嵌asm和其它语言c等,c的h库几乎都能改写后使用(不能直接用,它的.bi可从h近乎自动转换),老的Quick Basic语句也能使用,屏幕方式增加了 screenmes x, y 按屏幕尺寸像素定义大小, 比如 screenmes 1920, 1080等, 其它语言写成的.so动态库可以类似.h一样写.bi, 然后即可调用,最后编译成本地二制执行文件,调用sqlite, mysql, postgreSQL也行。它free, 功能比较全,稳定性比较好。c能用的界面库它都能用,比较典型的是gtk库,基于cairo的goocanvas也比较有趣。下面的图一是freeBasic操作goocanvas实现的items分组、变换、和模拟运动。

(图一、goocanvas表格图)

下图的上部分是cairo渲染的png图,下部分是goocanvas画线、矩形和文字显示。

(图二、cairo png和goo canvas画图)

下图的上部分是cairo渲染的pixbuf像素数据,下部分是goocanvas画线、矩形和文字显示。

(图三、pixbuf作为cairo的surface渲染)

下图的上部分是cairo渲染的语句绘图,下部分是goocanvas画线、矩形和文字显示。

二、界面设计笔记

界面垂直分成四个部分,上部cairo绘图区、label显示区、goocanvas绘图区、操作区。设计时可用glade作界面设计, box1留一个空位并置入一个gtxbox, ID为canvasbox,在编程时将goocanvas作为一个gtkwidget放入其中,大小也是程序中直接写,glade只需留出带gtkbox的空位即可。设计好后存成文件 glade_newui.glade, 程序中gtk_builder会取出widget属性和信号,程序中也可改写。

将widget作为GObject,定义其指针; 建gtkbuilder; 将glade中的widget与定义的指针对应起来,然后定义一个goocanvas并将写放入到预留的canbox中,最后将界面最大化。

DIM AS STRING GUISTR
DIM SHARED AS GtkBuilder PTR XML
DIM SHARED AS GObject PTR window1
DIM SHARED AS GObject PTR box1
DIM SHARED AS GObject PTR canbox
DIM SHARED AS GObject PTR button1
DIM SHARED AS GObject PTR button2
DIM SHARED AS GObject PTR button3
DIM SHARED AS GObject PTR button4
DIM SHARED AS GObject PTR label1
DIM SHARED AS GObject PTR drawarea1
DIM SHARED AS Gerror PTR errptr
Dim shared as GtkWidget PTR canvas
Dim shared as GooCanvasItem PTR rootXML = gtk_builder_new()
GUISTR="glade_newui.glade"window1 = gtk_builder_get_object(XML, @"window")
box1 = gtk_builder_get_object(XML, @"box1")
canbox = gtk_builder_get_object(XML, @"canvasbox")
drawarea1 = gtk_builder_get_object(XML, @"drawarea1")
button1 = gtk_builder_get_object(XML, @"button1")
button2 = gtk_builder_get_object(XML, @"button2")
button3 = gtk_builder_get_object(XML, @"button3")
button4 = gtk_builder_get_object(XML, @"button4")
label1 = gtk_builder_get_object(XML, @"label1")canvas = goo_canvas_new ()
root = goo_canvas_get_root_item (GOO_CANVAS (canvas))gtk_widget_set_size_request (canvas, 600, 250)
gtk_widget_show (canvas)
gtk_container_add (GTK_CONTAINER (canbox), canvas)gtk_window_maximize(GTK_WINDOW(window1))

三、cairo绘图笔记

glade设计时上部分是 drawingarea1 ,它有个 draw 信号(gtk3),后面写个回调函数的名称。

下面是回调函数,draw信号带来widget指针,cairo-context, 和用户数据指针(如果在glade设计时指定的话),接下来是取得drawingarea1的宽和高(如果界面是sizeable可变的,需要在使用时先取尺寸),然后画个白色的矩形,接着是判断自定义DrawfunctionFlag值,并根据值调用相应的绘图function函数。

FUNCTION on_drawarea1_draw CDECL ALIAS "on_drawarea1_draw" ( _BYVAL widget AS GtkWidget PTR, _BYVAL cr AS cairo_t PTR, _BYVAL user_data AS gpointer) AS gboolean EXPORT'get drawingarea width and heightVAR w = gtk_widget_get_allocated_width(widget)VAR h = gtk_widget_get_allocated_height(widget)'clear drawingarea surfaceDIM AS GdkRGBA colcol.red = 1: col.green = 1: col.blue = 1: col.alpha = 1gdk_cairo_set_source_rgba(cr, @col)  cairo_rectangle(cr, 0, 0, w, h)cairo_fill(cr)cairo_stroke(cr)'do as per DrawfuctionFlag valueIf DrawfunctionFlag = 0 thenon_drawarea1_draw1(widget, cr, user_data)elseif DrawfunctionFlag = 1 thenon_drawarea1_draw2(widget, cr, user_data)elseif DrawfunctionFlag = 2 thenon_drawarea1_draw3(widget, cr, user_data)End if'return a value as per function definition requirement			RETURN DrawfunctionFlagEND FUNCTION

功能一:用语句直接画个大圆,stroke 到界面上去。

FUNCTION on_drawarea1_draw1 CDECL ALIAS "on_drawarea1_draw1" ( _BYVAL widget AS GtkWidget PTR, _BYVAL cr AS cairo_t PTR, _BYVAL user_data AS gpointer) AS gboolean EXPORTVAR w = gtk_widget_get_allocated_width(widget)VAR h = gtk_widget_get_allocated_height(widget)DIM AS GdkRGBA colcol.red = 1: col.green = 1: col.blue = 1: col.alpha = 1gdk_cairo_set_source_rgba(cr, @col)  cairo_rectangle(cr, 0, 0, w, h)cairo_fill(cr)col.red = 1: col.green = 0: col.blue = 0: col.alpha = 1gdk_cairo_set_source_rgba(cr, @col)  cairo_arc(cr, w/2, h/2, MIN(w/2, h/2), 0, 2 * G_PI)gdk_cairo_set_source_rgba(cr, @col)  		'Equal to ---> cairo_set_source_rgba (cr, 1 , 0 , 0 , 1)cairo_fill(cr)cairo_stroke(cr)RETURN FALSEEND FUNCTION

功能二:用pixbuf数据创建一个surface, 把创建的surface给 draw 信号的cr进行渲染,pixbuf 像素数据就用像素显示到界面上了。

Function on_drawarea1_draw2 cdecl( byval widget as GtkWidget ptr, _BYVAL cr AS cairo_t PTR, _byval userdata as gpointer) as gboolean Dim surf as cairo_surface_t PTRsurf = cairo_image_surface_create_for_data (@rgbbuf(0), CAIRO_FORMAT_ARGB32, IMAGE_WIDTH, IMAGE_HEIGHT, IMAGE_WIDTH*4)cairo_set_source_surface(cr, surf, 50, 100)cairo_paint (cr)cairo_surface_destroy(surf)return TRUE
End function

pixbuf像素数据是个byte数组,一个彩色的像素点如果用rgb表示的话,需要r、g、b三个数据,每个数据一个byte,即8bit,三个数据是24位。数据表示为 Dim shared rgbbuf(IMAGE_WIDTH * IMAGE_HEIGHT * 3) as byte,是全部像素的字节数。

rgb格式加上alpha是rgba格式,因为多了个alpha, 所以Dim shared rgbbuf(IMAGE_WIDTH * IMAGE_HEIGHT * 4) as byte, 为全部像素的字节数。

函数cairo_image_surface_create_for_data的最后一个参数是一行像素的字节数,这样它就知道了断行显示,否则数据连在一起就分不开了。程序定义的是个数组,然后循环赋值。

#define IMAGE_WIDTH  256 
#define IMAGE_HEIGHT 256 Dim shared rgbbuf(IMAGE_WIDTH * IMAGE_HEIGHT * 4) as byte''create a 32-bit RGB image by adding alphafor y = 0 to IMAGE_HEIGHT-1 for x = 0 to IMAGE_WIDTH-1 rgbbuf(i+0) = y - (y and 31)					'' Brgbbuf(i+1) = (x \ 32) * 4 + y - (y and 31) 	'' G				rgbbuf(i+2) = x - (x and 31)					'' Rrgbbuf(i+3) = &HFF								'' Ai += 4next next 	

上面的数据画出来的图是下面的格子图

功能三:调用png图片文件作为surface渲染

surf = cairo_image_surface_create_from_png("fblogo.png")

其它不用改动。

Function on_drawarea1_draw3 cdecl( byval widget as GtkWidget ptr, _BYVAL cr AS cairo_t PTR, _byval userdata as gpointer) as gboolean Dim surf as cairo_surface_t PTRsurf = cairo_image_surface_create_from_png("fblogo.png")cairo_set_source_surface(cr, surf, 200, 100)cairo_paint (cr)cairo_surface_destroy(surf)return TRUE
End function

这三个功能通过DrawFunctionFlag的值来选择,公共变量DrawFunctionFlag的值是由操作区的button press动作赋值的。代码写在了函数里,先是改变它的值,然后取得button click信号带过来的user_data这个widget的尺寸,在glade设计时带过来的drawingarea1,所以这里的user_data就是drawingarea1, 下面的一句是驱动drawingarea的draw信号动作的关键一句:

gtk_widget_queue_draw_area (GTK_WIDGET(user_data), 0, 0, w, h)

它是个需要重绘的矩形区,这里是全部区域,也可以是部分需要更新的区域,比如画实时曲线时的很小一部分变化,不过图小的时候全绘也不会有速度问题的。全绘的话,也可以去掉后面的_area,就直接是全绘了,后面的参数也省了。

Function setDrawfunctionFlag CDECL ALIAS "setDrawfunctionFlag" ( _BYVAL widget AS GtkWidget PTR, _BYVAL user_data AS gpointer) AS gboolean EXPORTif DrawfunctionFlag + 1 >2 thenDrawfunctionFlag = 0elseDrawfunctionFlag += 1end ifVAR w = gtk_widget_get_allocated_width(GTK_WIDGET(user_data))VAR h = gtk_widget_get_allocated_height(GTK_WIDGET(user_data))gtk_widget_queue_draw_area (GTK_WIDGET(user_data), 0, 0, w, h)		Return TRUE
End Function

surface可以通过pixbuf产生,cairo-context可以由surface产生,可以操作cr在surface上绘图。如果释放掉surface产生的cr, 将surface作为界面送来cr的源surface,数据的图就渲染到界面上去了,类似内存考贝后叠加成新图片。goocanvas是基于cairo的,但用它绘图方式上有些不同,需要另外的方法处理。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

搭建服务器及跨域处理

使用内置的模块搭建服务器 自己电脑: 域名:localhost ip:127.0.0.1 http模块搭建服务器 const http = require(http)// 创建一个http对应的服务器,每次改完服务器的代码后都需要重新启动下服务器 /*方式一: const server = http.createServer((request,response)=>{…

第三章-Mybatis源码解析-以xml方式走流程-mapper解析(四)

3.2.2.7 selectKey解析 回到 XMLStatementBuilder.processSelectKeyNodes 的方法 private void processSelectKeyNodes(String id, Class<?> parameterTypeClass, LanguageDriver langDriver) {// 拿到所有 selectKey 节点List<XNode> selectKeyNodes context.…

jmeter 压测数据库

当前版本&#xff1a; jmeter 5.6.3mysql 5.7.39 简介 JMeter 是一个开源的 Java 应用程序&#xff0c;主要用于进行性能测试和负载测试。它支持多种协议&#xff0c;包括但不限于 HTTP、HTTPS、FTP、JDBC 以及各种 Web Services。对于数据库的压力测试可以使用 JDBC 协议与数…

【Docker】狂神说

图片后补 官网&#xff1a; https://www.docker.com/ Docker概述 Docker为什么出现 原因&#xff1a;环境配置不能跨平台 方案 传统方式&#xff1a;jar&#xff08;开发人员&#xff09; 部署&#xff08;运维人员&#xff09; 解决方式&#xff1a;开发打包上线一套流程 …

spring boot学习第十三篇:使用spring security控制权限

该文章同时也讲到了如何使用swagger。 1、pom.xml文件内容如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instanc…

LeetCode238题:除自身以外数组的乘积(python3)

代码思路&#xff1a; 当前位置的结果就是它左部分的乘积再乘以它右部分的乘积&#xff0c;因此需要进行两次遍历&#xff0c;第一次遍历求左部分乘积&#xff0c;第二次遍历求右部分的乘积&#xff0c;再将最后的计算结果一起求出来。 class Solution:def productExceptSelf(…

redis中的分布式锁(setIfAbsent)(expire)

目录 应用场景 代码实例1&#xff1a; 代码实例2&#xff1a; setIfAbsent&#xff1a; expire&#xff1a; 举例说明&#xff1a; 代码实例3&#xff1a; 代码实例4&#xff1a; 还是一个同事问的一个问题&#xff0c;然后闲着没事就记录下来了。多人操作同一个保单&a…

K8S存储卷与PV,PVC

一、前言 Kubernetes&#xff08;K8s&#xff09;中的存储卷是用于在容器之间共享数据的一种机制。存储卷可以在多个Pod之间共享数据&#xff0c;并且可以保持数据的持久性&#xff0c;即使Pod被重新调度或者删除&#xff0c;数据也不会丢失。 Kubernetes支持多种类型的存储卷…

【大数据架构(2)】kappa架构介绍

文章目录 一. Kappa架构1. Speed Layer (Stream Layer) - The Foundation of Kappa Architecture2. Stream Processing: The Heart of Kappa Architecture 二. Benefits of Kappa and Streaming Architecture1. Simplicity and Streamlined Pipeline2. High-Throughput Process…

数据服务安全的重要性

数据服务安全在当今信息化社会显得尤为重要。随着大数据、云计算、人工智能等技术的飞速发展&#xff0c;数据已经成为企业和组织的核心资产&#xff0c;数据服务安全也面临着前所未有的挑战。本文将从数据服务安全的重要性、常见威胁、防护策略以及未来发展趋势等方面进行探讨…

ROS 2基础概念#1:计算图(Compute Graph)| ROS 2学习笔记

在ROS中&#xff0c;计算图&#xff08;ROS Compute Graph&#xff09;是一个核心概念&#xff0c;它描述了ROS节点之间的数据流动和通信方式。它不仅仅是一个通信网络&#xff0c;它也反映了ROS设计哲学的核心——灵活性、模块化和可重用性。通过细致探讨计算图的高级特性和实…

2024年小程序云开发CMS内容管理无法使用,无法同步内容模型到云开发数据库的解决方案,回退老版本CMS内容管理的最新方法

一&#xff0c;问题描述 最近越来越多的同学找石头哥&#xff0c;说cms用不了&#xff0c;其实是小程序官方最近又搞大动作了&#xff0c;偷偷的升级的云开发cms&#xff08;内容管理&#xff09;以下都称cms&#xff0c;不升级不要紧&#xff0c;这一升级&#xff0c;就导致我…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之FlowItem容器组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之FlowItem容器组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、FlowItem组件 子组件 可以包含子组件。 接口 FlowItem() 使用该接口来…

Android14之解决编译报错:bazel: no such file or directory(一百八十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Stable Diffusion WebUI 图库浏览器插件:浏览器以前生成的图片

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 大家好&#xff0c;我是水滴~~ 本文介绍的插件叫图库浏览器&#xff0c;是一个用于浏览器以前生成的图片信息的插件。本文将介绍该插件的安装和使用&#xff0c;希望能够对你有所帮助。 文章…

GitHub宣布GitHub Copilot Enterprise的全面发布;使用Python与Gemma和MongoDB构建RAG系统的全过程

&#x1f989; AI新闻 &#x1f680; GitHub宣布GitHub Copilot Enterprise的全面发布 摘要&#xff1a;GitHub Copilot Enterprise是一款基于OpenAI的GPT-4模型的代码助手&#xff0c;它结合了十多年的真实、安全可靠的代码数据进行开发。该工具可以通过文本提示来获取、审核…

JavaEE进阶(7)Spring Boot 日志(概述、用途、使用:打印日志,框架介绍,SLF4J 框架介绍、更简单的日志输出)

接上次博客&#xff1a;JavaEE进阶&#xff08;6&#xff09;SpringBoot 配置文件&#xff08;作用、格式、properties配置文件说明、yml配置文件说明、验证码案例&#xff09;-CSDN博客 目录 日志概述 日志的用途 日志使用 打印日志 在程序中获取日志对象 使用日志对象…

练习 3 Web [ACTF2020 新生赛]Upload

[ACTF2020 新生赛]Upload1 中间有上传文件的地方&#xff0c;试一下一句话木马 txt 不让传txt 另存为tlyjpg&#xff0c;木马文件上传成功 给出了存放目录&#xff1a; Upload Success! Look here~ ./uplo4d/06a9d80f64fded1e542a95e6d530c70a.jpg 下一步尝试改木马文件后缀…

Python的自然语言处理库NLTK介绍

NLTK&#xff08;Natural Language Toolkit&#xff09;简介 NLTK是Python中一个领先的自然语言处理&#xff08;NLP&#xff09;库&#xff0c;它提供了文本处理的基础设施&#xff0c;包括分词&#xff08;tokenization&#xff09;、词性标注&#xff08;part-of-speech tag…

云计算与边缘计算:有何不同?

公共云计算平台可以帮助企业充分利用全球服务器来增强其私有数据中心。这使得基础设施能够扩展到任何位置&#xff0c;并有助于计算资源的灵活扩展。混合公共-私有云为企业计算应用程序提供了强大的灵活性、价值和安全性。 然而&#xff0c;随着分布在全球各地的实时人工智能应…