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

一、goocanvas安装

Linux mint 21.3 库中带有 libgoocanvas-2.0-dev,

用sudo apt install libgoocanvas-2.0-dev 安装,安装完成后,检查一个 /usr/lib/x86_64-linux-gnu 下是否有libgoocanvas.so的软件链接。如果没有,或是 .so.x 等类似后面还有数字的话,则需要创建一个 libgoocanvas.so 的软链接。

二、FreeBASIC安装

freebasic 是跨平台的,官方网址是 https://freebasic.net, Windows上用的话IDE比较多,但在linux上用比Windows上用要有趣得多,linux上用的话有很多外来库可以使用,但不一定能在windows平台上找到相应的库。

    Official site:      https://freebasic.net/
    Forum:              https://freebasic.net/forum/
    Online manual:      https://freebasic.net/wiki/DocToc
    fbc project page:   https://sourceforge.net/projects/fbc/
    GitHub mirror:      https://github.com/freebasic/fbc
    Discord:            https://discord.gg/286rSdK
    IRC channel:        ##freebasic at https://webchat.freenode.net
    Features:           https://freebasic.net/wiki/CompilerFeatures
    Requirements:       https://freebasic.net/wiki/CompilerRequirements

到官方网址去下载最新版本,解压到本地,查看readme.txt

下面是readme.txt中的说明,按说明先安装需要的运行库:

sudo apt install gcc libncurses5-dev libffi-dev libgl1-mesa-dev
          libx11-dev libxext-dev libxrender-dev libxrandr-dev libxpm-dev
          libtinfo5 libgpm-dev

      下载并解压最新FreeBASIC-x.xx.x-linux.tar.gz。打开一个
      terminal, 解压的 FreeBASIC-x.xx.x-linux 并进入目录,运行
      “sudo ./install.sh -i” 将 FB 设置复制到 /usr/local 中。
      要编译FB程序,请安装以下软件包(名称可以因您的Linux发行版而异)
        Debian/Ubuntu:
          gcc libncurses5-dev libffi-dev libgl1-mesa-dev
          libx11-dev libxext-dev libxrender-dev libxrandr-dev libxpm-dev
          libtinfo5 libgpm-dev
        Redhead Linux:
          gcc ncurses-devel ncurses-compat-libs libffi-devel mesa-libGL-devel
          libX11-devel libXext-devel libXrender-devel libXrandr-devel
          libXpm-devel
      如果您想在 32 位系统上使用 64 位版本的 FB,需要具有 GCC 32 位 Multilib 支持
      和 32 位版本已安装的库。

然后在解压的目录中执行 sudo ./install.sh -i

安装完成后,进入解压目录下的example子目录,fbc hello.bas ,编译后 ./hello 运行,能在终端上看到hello world表明安装运行正确。

三、freebasic IDE

fbc 是个编译器,支持它的ide很多,geany, vs code, atom 等都可用,目前我感觉用着比较舒服的是台湾同胞写的poseidonFB编辑器,它自智能提示,还可自己添加关键字。

下载主场:https://bitbucket.org/KuanHsu/poseidonfb/src/master/

运行界面

在sourceforge上还有一款比较陈年的IDE, 可下载源文件,编译没问题,但它用的是 iup 界面库,是巴西石油某个项目中的一个产物,项目完成后开源了,还一直在维护,但在某些系统上 menu和toolbar混在一起,不是ide问题,是iup问题。在atom和vs code上用也比较好,有代码美化插件可安装使用。

四、goocanvas画线

1. 黄色框、红色填充、圆解矩形,呈45度角显示Hello FB爱好者们。

'Draw a few simple items.
Sub DrawSimpleItems(x0 as integer, y0 as integer, w as integer, h as integer)
rect_item = goo_canvas_rect_new (root, x0, y0, w, h, _
                                     "line-width", 10.0, _
                                     "radius-x", 20.0, _
                                     "radius-y", 10.0, _
                                     "stroke-color", "yellow", _
                                     "fill-color", "red", _
                                     NULL)
text_item = goo_canvas_text_new (root, "Hello FB爱好者们!", x0+w/2, y0+h/2, -1, _
                                     GOO_CANVAS_ANCHOR_CENTER, _
                                     "font", "Sans 14", _
                                     NULL)
goo_canvas_item_rotate (text_item, -45, x0+w/2, y0+h/2)
End Sub

2. 画斜线:左上角到右下角、左下角到右上角,然后清除。画线是用polyline ,后面是可变座标点,从简单直线到各种形装的多点 item,  可给不同样子的item分组,进行组变换等。

'A function called by onButton1
Function GooCanDo(Byval ToH as integer) as gint
  VAR w = gtk_widget_get_allocated_width(GTK_WIDGET(canvas))
  VAR h = gtk_widget_get_allocated_height(GTK_WIDGET(canvas))
  
  PicItem = _
  goo_canvas_polyline_new_line (root, 0, 0, w, ToH*h/60, _
               "start-arrow", FALSE, _
               "end-arrow", FALSE, _
			   "stroke-color", "red", _
			   "line-width", 0.6, _
               NULL)

  PicItem = _
  goo_canvas_polyline_new_line (root, 0, h-ToH*h/60, w, 0, _
               "start-arrow", FALSE, _
               "end-arrow", FALSE, _
			   "stroke-color", "red", _
			   "line-width", 0.6, _
               NULL)
  DrawSimpleItems((w-200)/2, (h-200)/2, 200, 200)
  
  if ToH>=59 then
		ClearRootItems
		'Clear canvas surface
		goo_canvas_rect_new (root, 0, 0, SCREEN_W, SCREEN_H, _
				"fill_color", "white", _
				NULL)		
  end if
  Return 0
End function

3. 清除所有线条

goocanvas会记住所有的线条,它们同属于root item, 如果不清除的话就会越来越多,所以不用了就要清除它们。

'Clear children items in the Root of Canvans
Function ClearRootItems() as Integer
  		var goocanvasitem = goo_canvas_item_get_child(root, 1)
		
		'i was previous defined as integer, 
		'it is 32-bit or 64-bit signed, viary per target platform
		'integer type is the same size as SizeOf(Any Ptr)
		i = 1
		Do
			goocanvasitem = goo_canvas_item_get_child(root, i)
			If goocanvasitem <> NULL then
				goo_canvas_item_remove_child(root, i)
			Else
				Exit Do
			End if
			i += 1
		Loop
		
		print "Item no: ", i, @goocanvasitem
		Return 0
End function

4.定时画线

时间事件 alarm(2) 表示2秒后产生 SIGALRM 事件,执行的是 wait_alarm 过程,进入过程后设置 alarm(1) 重新计数(否则停止不再触发事件了),然后执行 timerevent 过程,timerevent 过程执行的是界面上的button1 钮的 click

signal事件是在c的signal.h中定义的,与它同定义的还有 raise 事件,它们的由来自 unix 就有,历史可谓优久。还有其它几个信号,还有SIGUSR1和SIGUSR2自定义事件。这些信号是系统级的,在另一个shell的程序中可获取它们,可以跨进程使用。

const SIGALRM=14

Declare Function Signal cdecl  alias "signal" (ByVal V_Signal As long, byval V_Function As Any Ptr) as Any Ptr
Declare function alarm cdecl alias "alarm" (byval __seconds as uinteger) as uinteger
......
......
......
......
......
......
Sub timerevent()
	on_button1_clicked(GTK_WIDGET(button1), GTK_WIDGET(drawarea1))
End Sub

sub wait_alarm(iSigno As Integer)
	'?"This is the scheduled event SIG = " & Str$(iSigno) & "--- @: " & Time$
	alarm(1)		'loads another alarm events: each alarm event is a single time event, so to repeat it it must be set again every time
	timerevent
end sub

signal(SIGALRM, @wait_alarm)		'when SIGALRM triggered, call subroutine wait_alarm
alarm(2)							'emitt SIGALRM signal after 2 seconds

画线图是下面的样子

goocanvas2.0和goocanvas3.0源码是c写的,Backend是cairo和surface。如果不喜欢用它的画线函数,可以自己增加自己的函数,重新编译成 .so 后可实现自己的特殊功能。

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

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

相关文章

QT Widget: 自定义Widget组件及创建和使用动静态库

学习自定义Widget组件&#xff0c;书中的案例&#xff1a; // 自定义QmyBattery组件 // QmyBattery.c #include "qmybattery.h"QmyBattery::QmyBattery(QWidget *parent) : QWidget(parent) {}/** 1.QPainter的viewport()与window()分别代表着物理坐标与逻辑坐标区域…

类加载的基本流程

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;JavaEE &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 类加载 1. 加载2. 验证3. 准备4. 解析5. 初…

maven项目报错Cannot resolve plugin org.apache.maven.plugins:maven-war-plugin:2.2

如果IDEA整合maven没有问题&#xff0c;还是报这个错误&#xff0c;很大可能是由于在下载过程中存在网络问题&#xff0c;导致文件下载一半而停止&#xff0c;但是已经在仓库中存在这个文件夹&#xff0c;解决方法是删除文件夹重新下载即可。 删除本地仓库下的\org\apache\mav…

Gophish+EwoMail 自建钓鱼服务器

GophishEwoMail 自建钓鱼服务器 文章目录 GophishEwoMail 自建钓鱼服务器1.前提准备2.搭建EwoMail邮件服务器1&#xff09;Centos7 防火墙操作2&#xff09;设置主机名3&#xff09;host配置4&#xff09;安装EwoMail5&#xff09;获取DKIM6&#xff09;端口服务介绍7&#xff…

JAVA的学习日记

JAVA的学习日记&#xff08;2024.3.1&#xff09;&#xff08;b站韩顺平老师课程学习笔记版&#xff09; ps:捡起忘光光的Java语言 Sublime //1. public是公有&#xff0c;class是类 //2. public class Hello表示Hello是一个类&#xff0c;是一个public公有的类 //3. Hello{…

1.1 创建第一个vue项目

cmd命令窗口运行 vue init webpack hellovue 注意&#xff0c;hellovue是项目名称&#xff0c;项目名称不能保存大写字母否者会报错 Sorry, name can no longer contain capital letters. 运行设个命令的时候可能会报错&#xff0c;根据提示先运行 npm i -g vue/cli-init …

在独立Unity工程中集成Vortex Studio

本文首发于&#xff1a;Unity3D入门教程09.01&#xff1a;在独立Unity工程中集成Vortex Studio 目的 在Unity中使用Vortex Studio引擎模拟Unity场景中的任何资源。 工程 打开桌面Unity Hub快捷方式 点击Open选择需要打开的工程&#xff0c;这里选择官方提供的默认工程C:\CM…

永磁同步电机无感FOC(龙伯格观测器)算法技术总结-实战篇

文章目录 1、ST龙伯格算法分析&#xff08;定点数&#xff09;1.1 符号说明1.2 最大感应电动势计算1.3 系数计算1.4 龙伯格观测器计算1.5 锁相环计算1.6 观测器增益计算1.7 锁相环PI计算&#xff08;ST&#xff09;1.8 平均速度的用意 2、启动策略2.1 V/F压频比控制2.2 I/F压频…

msvcp140.dll安装教程_最新msvcp140.dll丢失的解决方法

msvcp140.dll 是一个动态链接库 (DLL) 文件&#xff0c;它是 Microsoft Visual C 运行时库的一部分&#xff0c;特别对应的是 Visual Studio 2015 版本编译的 C 应用程序所需的关键组件。DLL 文件的设计目的是为了实现代码和数据的共享&#xff0c;这样多个应用程序就可以在同一…

C# 解决uploadify插件上传时造成session丢失问题

出现的问题&#xff1a; 在应用uploadify插件实现上传图片时&#xff0c;报了HTTP Error&#xff0c;经过在Network查看上传方法报错码是302&#xff0c;那这里就可以知道问题是什么了&#xff0c;HTTP 302是请求被重定向&#xff0c;如果你的uploadify处理上传方法有session验…

Vue3_2024_1天【Vue3创建和响应式,对比Vue2】

前言&#xff1a; Vue3对比Vue2版本&#xff0c;它在性能、功能、易用性和可维护性方面都有显著的提升和改进。 性能优化&#xff1a;模板编译器的优化、对Proxy的支持以及使用了更加高效的Virtual DOM算法等。这使得Vue3的打包大小减少了41%&#xff0c;初次渲染提速55%&#…

【K8S类型系统】一文梳理 K8S 各类型概念之间的关系(GVK/GVR/Object/Schema/RestMapper)

参考 k8s 官方文档 https://kubernetes.io/zh-cn/docs/reference/https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.29/ 重点 Kubernetes源码学习-kubernetes基础数据结构 - 知乎 重点 Kubernetes类型系统 | 李乾坤的博客 重点 k8s源码学习-三大核心数…

Harbor 的安装及使用

Harbor 安装官网手册&#xff1a; https://goharbor.io/docs/2.10.0/install-config/download-installer/ Harbor 发布包地址&#xff1a; https://github.com/goharbor/harbor/releases Harbor 的架构查看&#xff1a; https://github.com/goharbor/harbor/wiki/Architectur…

​MPV,汽车产品里一个特殊品类的进化过程

「汽车」可能是整个工业革命以来&#xff0c;所诞生出的最有趣的工业产品。 它不仅能产生工业的机械美&#xff0c;还诞生了一个独立的文化体系&#xff0c;在汽车的发展过程中&#xff0c;我们也能看到一些本来应功能而诞生的产品&#xff0c;最终走向了千家万户。 MPV 就是…

如何设置从小程序跳转到其它小程序

​有的商家有多个小程序&#xff0c;希望能够通过一个小程序链接到所有其它小程序&#xff0c;用户可以通过点击跳转链接实现从一个小程序跳转到另一个小程序。要怎么才能实现这样的跳转呢。下面具体介绍。 1. 设置跳转。在小程序管理员后台->分类管理&#xff0c;添加一个…

js截取图片地址后面的参数和在路径中截取文件名或后缀名

文章目录 前言截取地址 &#xff1f;后面的参数在路径中截取文件名或后缀名总结 前言 在处理网页上的图片资源或者其他类型的文件资源时&#xff0c;你可能会遇到需要使用这些技巧的情况。以下是一些具体的使用场景&#xff1a; 动态修改图片参数&#xff1a;如果你有一个图片U…

社交APP开发能给用户带来什么

现在的社交软件也非常的多&#xff0c;每款社交软件都有自己的特色&#xff0c;社交软件是日常中必备的软件&#xff0c;不管是生活交流还是感情工作交流都是比较方便的&#xff0c;因为社交软件满足了日常的远程交流问题&#xff0c;所以开发社交软件也会逐渐的流行起来的。 …

LeetCode240题:搜索二维矩阵II(python3)

代码思路&#xff1a; “根节点” 对应的是矩阵的 “左下角” 和 “右上角” 元素&#xff0c;以 matrix 中的左下角元素为标志数 flag &#xff0c;则有: 若 flag > target &#xff0c;则 target 一定在 flag 所在行的上方 &#xff0c;即 flag 所在行可被消去&#xff0c…

NLP - 神经网络与反向传播

使用神经网络进行命名实体识别&#xff08;二值词窗分类&#xff09; 根据上下文窗口 建立词向量 通过一个神经网络层&#xff0c;通过一个逻辑分类器&#xff0c;得到这个概率是属于特定实体词的预测概率。 另一个分类器来比较说明 这个词是哪个实体类型&#xff08;比较概率…

基于Python3的数据结构与算法 - 07 归并排序

一、归并 引入 假设现在的列表分两段有序&#xff0c;如何将其合并成为一个有序列表。 这种操作成为一次归并。 归并的思路 分别对两个列表进行遍历&#xff0c;比较两个列表中的最小值&#xff0c;将更小的取出来。取出后一次进行上操作&#xff0c;直到其中一个列表中的元…
最新文章