VisualFreeBasic第三方代码库_Cairo 矢量绘图库

2026-1-21 / 0 评论 / 81 阅读

简单介绍

cairo(http://cairographics.org),Linux的两大流行桌面环境KDE和Gnome,其对应的基础组件是QT和GTK+,相对于框架性质的QT,GTK+则依然保持着自由与开放的传统,从底层绘图到上层程序库都由其他开源库组成,cairo就是GTK+采用的底层图形库,负责构建图形界面。cairo是一款开源的2d矢量图形库,支持多种后端输出,用c语言编写而且模块化设计得很出色。

安装cairo库

查看:https://3ep4xmzg24.k.topthink.com/@visualfreebasic/daoruhedaochudaimaku.html

基本原理

cairo的绘图原理就是路径,先设置好路径,如:线、圆、框,以及更复杂的几何和曲线(文字也属于路径)。然后用 画线命令描绘路径,或者用填充命令,来填充路径。还有可以给路径贴图。
明白原理后,后面的使用方法和cairo函数的使用就很容易理解了。

准备工作

主动绘图模式

  • 绑定DC
   Dim DC As HDC   = GetDC(Picture1.hWnd)
   Dim ca As Cairo = DC 
   '画画开始-----------------------------
   Ca.ht清空画板(GetSysColor(COLOR_BTNFACE)) '用一个颜色清空画板
   ...........一系列画画
   '画画完成 -------------------------------
   Ca.xs显示画面'显示输出
   ReleaseDC Picture1.hWnd, DC '销毁DC
  • 绑定窗口句柄
   Dim ca As Cairo = Picture1.hWnd 
   '画画开始-----------------------------
   ca.ht清空画板(GetSysColor(COLOR_BTNFACE)) '用一个颜色清空画板
   ...........一系列画画
   '画画完成 -----------当函数结束, Ca 变量被回收前会自动执行 Ca.xs显示画面

被动绘图模式(刷新模式,必须在绘画事件里使用)

Function Form1_Picture1_WM_Paint(hWndForm As hWnd, hWndControl As hWnd) As LResult
   Dim ca As Cairo = cairo(hWndControl,1)
   '画画开始-----------------------------
   ca.ht清空画板(GetSysColor(COLOR_BTNFACE)) '用一个颜色清空画板
   '画个矩形框线
   ca.ht绘矩形(10, 10, 50, 50,0,&HFFFF0000 ,4)
   '画个矩形
   ca.ht绘矩形(70, 10, 50, 50,&HFF0000FF)
   ''画文字
   ca.zb旋转(10,100,30)
   ca.wz文字样式("黑体")
   ca.ht绘文字 10, 100, 22, "你好Cairo绘画", &HFFC7C53C
   Function = TRUE ' 告诉系统,我们自绘了,不需要系统绘画。
End Function

坐标系和坐标单位

坐标原点(0, 0)位于绘图表面(窗口或控件)的左上角。x 轴正方向是从左向右,y 轴正方向是从上向下。

坐标单位为,像素。支持系统的 DPI ,确保在用户在任何系统中,都显示同比例的大小。

假如,系统的DPI是 125%,你画的 正方形,设置参数为 100像素,那么真实显示的是 125像素,不同系统的DPI,会自动缩放,我们编写软件,就按照 100像素编写即可。

绘图过程1:必要功能

附加功能

   Function CairoHandle() As cairo_t Ptr '获取与WINDC绑定后的 Cairo 句柄 ,未绑定返回 0 ,关闭窗口后自动销毁。
   Function Version()     As String      '获取 Cairo 支持库 版本号
   Sub SavePNG(PngFileName As Wstring) '将当前的图像保存到 PNG文件
   Function LoadPNG(PngFileName As Wstring) As CairoImage ' 预先加载PNG图像文件,用于频繁使用的图像
   Declare Sub xs显示画面() '显示出图像,每次画画开始设置 WinDC() 最后显示输出 ,显示输出后,下次画必须再使用 WinDC()

坐标系,拼音zb带头

   Sub zb缩放(x As Single, y As Single) '缩放,每次缩放都是从初始大小开始进行缩放(初始大小已经响应系统DPI)
   Sub zb旋转(x As Single, y As Single, 角度 As Single) '旋转,从x,y 为中心 度(0--360)正数顺时针,负数逆时针旋转。每次都从初始角度0度开始。不是累计旋转。
   Sub zb平移(x As Single, y As Single) '平移坐标系,让后来的设置的坐标都按照此坐标偏移(每次偏移都从初始位置开始,不会累计偏移)
   Sub zb裁剪(bValue As BOOLEAN)        '裁剪,先定义一个路径才执行裁剪

绘图过程2:路径操作

用过 PS 的都明白“路径”是什么,路径是一种用于精确绘制形状的工具。它就像是用线条连接起来的一系列点。比方矩形、圆、曲线等。 用于后续的填充和描边绘画.
路径操作,路径,拼音lj带头

   Sub lj新的子路径() ' 开始一个新的子路径,与上一个路径隔离开来,不然路径会自动相连在一起。
   Sub lj封闭路径()   '封闭路径
   Sub lj返回当前坐标(ByRef x As Single, ByRef y As Single) '返回当前坐标
   Sub lj设置绝对坐标(x As Single, y As Single)   '设置路径的当前绝对坐标
    Sub lj设置相对坐标(x As Single, y As Single)   '设置路径的当前相对坐标
   Sub lj直线到绝对坐标(x As Single, y As Single) '路径的直线,从当前坐标画直线到目标坐标,并设置目标坐标为当前坐标
   Sub lj直线到相对坐标(x As Single, y As Single) '路径的直线,(目标坐标是相对与当前坐标) 从当前坐标画直线到目标坐标,并设置目标坐标为当前坐标
   Sub lj矩形(x As Single, y As Single, w As Single, h As Single) '路径的矩形,坐标是绝对坐标,单位是系统DPI100%的像素(会受到坐标系影响)
   Sub lj矩形圆角(x As Single, y As Single, w As Single, h As Single, r1 As Single, r2 As Single, r3 As Single, r4 As Single) '路径的圆角矩形,r1-4为圆角半径 左上角,左下角,右上角,右下角
   Sub lj弧线(圆心x As Single, 圆心y As Single, 半径X As Single, 半径Y As Single, 起始角度 As Single, 终止角度 As Single, 时针 As Long = 0) '路径的弧线/椭圆,参数:圆弧中心,半径,起始角度(0--360),终止角度(0--360),顺时针=0/逆时针<>0
   Sub lj三次贝塞尔曲线绝对坐标(x1 As Single, y1 As Single, x2 As Single, y2 As Single, x As Single, y As Single)       '路径的三次贝塞尔曲线(绝对坐标),参数:第1个控制点x1y1,第2个控制点x2y2,曲线末端xy
   Sub lj三次贝塞尔曲线相对坐标(dx1 As Single, dy1 As Single, dx2 As Single, dy2 As Single, dx As Single, dy As Single) '路径的三次贝塞尔曲线(相对坐标),参数:第1个控制点x1y1,第2个控制点x2y2,曲线末端xy
   Sub lj文字(x As Single, y As Single, Text As Wstring) '将文本的闭合路径添加到当前路径

绘图过程3:文字设置

文字也属于路径,为方便理解,独立归类。操作循序和路径同一个级别
文字,拼音wz带头

   Sub wz文字样式(Family As Wstring, 倾斜 As Long = CAIRO_FONT_SLANT_NORMAL, 加粗 As Long = CAIRO_FONT_WEIGHT_NORMAL) '文字样式,参数: 样式名(可以直接用字体名称),字体的倾斜,字体的粗细 
   Sub wz文字尺寸(SIZE As Single)  '文字尺寸,像素单位
   Sub wz文字路径(Text As Wstring) '将文本的闭合路径添加到当前路径,位置是当前坐标,当前坐标是文字的左上角

绘图过程4:色彩设置

色彩,拼音sc带头

   Sub sc单色RGB(GDI色 As Long)     '设置填充或框线颜色(GDI色) 用:BGR(r, g, b) :Cairo里称为:来源
   Sub sc单色RGBA(GDIpro色 As ARGB) '设置填充或框线颜色(GDI+)颜色,带透明度 A ,用:RGBA (r, g, b, a) :Cairo里称为:来源
   Sub sc线性渐变RGB(颜色1 As Long, x1 As Single, y1 As Single, 颜色2 As Long, x2 As Single, y2 As Single)  '设置线性渐变,参数为颜色1 到颜色2渐变(GDI色) 用:BGR(r, g, b)
   Sub sc线性渐变RGBA(颜色1 As ARGB, x1 As Single, y1 As Single, 颜色2 As ARGB, x2 As Single, y2 As Single) '设置线性渐变,参数为颜色1 到颜色2渐变(GDI+)颜色,带透明度 A ,用:RGBA (r, g, b, a)
   Sub sc辐射渐变RGB(颜色1 As Long, cx1 As Single, cy1 As Single, 半径1 As Single, 颜色2 As Long, cx2 As Single, cy2 As Single, 半径2 As Single)  '设置径向渐变,参数为颜色1 到颜色2渐变(GDI色) 用:BGR(r, g, b)  颜色,圆心xy,圆的半径,一般用法:2个圆心相同,第1个圆半径=0 第2个半径是填充的尺寸。
   Sub sc辐射渐变RGBA(颜色1 As ARGB, cx1 As Single, cy1 As Single, 半径1 As Single, 颜色2 As ARGB, cx2 As Single, cy2 As Single, 半径2 As Single) '设置径向渐变,参数为颜色1 到颜色2渐变(GDI+)颜色,带透明度 A ,用:RGBA (r, g, b, a)  颜色,圆心xy,圆的半径,一般用法:2个圆心相同,第1个圆半径=0 第2个半径是填充的尺寸。
   Sub sc贴图PNG(PngFileName As Wstring, x As Single, y As Single, extend As Long = CAIRO_EXTEND_NONE, w As Single = 0, h As Single = 0)          '设置用PNG图像文件来 填充或框线 ,xy是贴图开始位置 :Cairo里称为:来源
   Sub sc贴图(cIMG As CairoImage, x As Single, y As Single, extend As Long = CAIRO_EXTEND_NONE, w As Single = 0, h As Single = 0)                 '设置用图像 填充或框线 ,xy是贴图开始位置 :Cairo里称为:来源

绘图过程4:线框设置

线框,拼音xk带头

   Property xk线框粗细(nWidth As Single) '设置/获取 线条宽度,单位像素
   Property xk线框粗细() As Single
   Property xk线帽样式(线帽 As Long) '设置/获取 线帽
   Property xk线帽样式() As Long
   Property xk折线形状(角的形状 As Long) '设置/获取折线处形状(角的形状) 
   Property xk折线形状() As Long
   Sub xk虚线样式(起始偏移量 As Single, 实线1 As Single = 0, 虚线1 As Single = 0, 实线2 As Single = 0, 虚线2 As Single = 0, 实线3 As Single = 0, 虚线3 As Single = 0, 实线4 As Single = 0, 虚线4 As Single = 0) '设置线条的虚线模式,实线虚线,交替设置,形成点线。

绘图过程5:描绘显示

这是最后一步,把路径描绘出来。如此重复 1 到 5 的过程,绘画每一个单独的图像。
描绘,拼音mh带头

   Sub mh描线(销毁路径 As Long)           '描绘路径的线框
   Sub mh填充(销毁路径 As Long)           '填充路径,
   Property mh重叠模式(fill_rule As Long) '设置/获取 路径和路径发生重叠后,重叠部分的填充模式
   Property mh重叠模式() As Long

简化封装

以上一系列操作,组合成各种画法,更复杂和精准,有时候我们就简单的画点东西,就用到此封装。
绘图,拼音ht带头

  • '几何图形简化封装 --------------------
   Sub ht清空画板(GDI色 As Long = &HFFFFFF) '清空画板,颜色(GDI色) 用:BGR(r, g, b)
   Sub ht绘文字(x As Single, y As Single, Font_Size As Single, Text As Wstring, 填充色 As ARGB = GDIP_ARGB(255, 0, 0, 0), 线条色 As ARGB = 0, 线条粗细 As Single = 1) '直接描绘文字,用 wz文字样式 设置字体 ,颜色=0 表示不填充或不描边
   Sub ht绘矩形(x As Single, y As Single, w As Single, h As Single, 填充色 As ARGB = 0, 线条色 As ARGB = 0, 线条粗细 As Single = 1) '描绘矩形,颜色=0 表示不填充或不描边
   Sub ht绘椭圆(圆心x As Single, 圆心y As Single, 半径X As Single, 半径Y As Single, 填充色 As ARGB = 0, 线条色 As ARGB = 0, 线条粗细 As Single = 1) '描绘椭圆(圆心x, 圆心y,w半径,h半径),颜色=0 表示不填充或不描边
   Sub ht绘直线(X1 As Single, Y1 As Single, X2 As Single, Y2 As Single, Line_Width As Single = 1, 线条色 As ARGB = &HFF000000) ' 画线条,位置1到位置2
   Sub ht绘矩形圆角(x As Single, y As Single, w As Single, h As Single, r1 As Single, r2 As Single, r3 As Single, r4 As Single, 填充色 As ARGB = 0, 线条色 As ARGB = 0, 线条粗细 As Single = 1) '描绘一个圆角矩形,r1-4为圆角半径 左上角,左下角,右上角,右下角,颜色=0 表示不填充或不描边
  • '图像显示简化封装 ------------------
   Sub ht绘PNG图像(PngFileName As Wstring, x As Single, y As Single, w As Single = 0, h As Single = 0) '描绘PNG图像,WH =0 按默认大小画
   Sub ht绘图像(cIMG As CairoImage, x As Single, y As Single, w As Single = 0, h As Single = 0)        '描绘图像,WH =0 按默认大小画,频繁使用的图像,需要先加载再用本函数显示

图像文件预加载

假如一个图像频繁使用,就需要预先加载,让它能快速 使用

Function LoadPNG(PngFileName As Wstring)As CairoImage ' 预先加载PNG图像文件,用于频繁使用的图像
Sub sc贴图(cIMG As CairoImage,x As Single,y As Single,extend As Long ) '设置用图像 填充或框线
Sub ht绘图像(cIMG As CairoImage,x As Single,y As Single,w As Single=0, h As Single=0) '描绘图像,WH =0 按默认大小画,频繁使用的图像,需要先加载再用本函数显示

一些例题

  • 弧线
Function Form1_Picture1_WM_Paint(hWndForm As hWnd, hWndControl As hWnd) As LResult
   Dim ca As Cairo = cairo(hWndControl, 1)
   '画画开始-----------------------------
   ca.ht清空画板(&HCCFFFF) '用一个颜色清空画板
   '画一个弧线
   ca.lj弧线 128, 128, 100, 100, 50, 200
   ca.xk线框粗细 = 10
   ca.sc单色RGBA &HFF000000
   ca.mh描线(True) 
   '画直线
   ca.ht绘直线 128,128,34,93,5, &H85FF0000
   ca.ht绘直线 128,128,193,206,5, &H85FF0000
   '画圆心
   ca.ht绘椭圆(128,128,10,10,&H85FF0000) 
   Function = TRUE ' 告诉系统,我们自绘了(yGDI必须WM_PAINT初始化,若API必须用BeginPaint初始化),不需要系统绘画。
End Function
  • 反向弧线

Function Form1_Picture1_WM_Paint(hWndForm As hWnd, hWndControl As hWnd) As LResult
   Dim ca As Cairo = cairo(hWndControl, 1)
   '画画开始-----------------------------
   ca.ht清空画板(&HCCFFFF) '用一个颜色清空画板
   '画一个弧线
   ca.lj弧线 128, 128, 100, 100, 200, 50
   ca.xk线框粗细 = 10
   ca.sc单色RGBA &HFF000000
   ca.mh描线(True) 
   '画直线
   ca.ht绘直线 128,128,34,93,5, &H85FF0000
   ca.ht绘直线 128,128,193,206,5, &H85FF0000
   '画圆心
   ca.ht绘椭圆(128,128,10,10,&H85FF0000) 
   Function = TRUE ' 告诉系统,我们自绘了,不需要系统绘画。
End Function
  • 裁剪区域

Function Form1_Picture1_WM_Paint(hWndForm As hWnd, hWndControl As hWnd) As LResult
   Dim ca As Cairo = cairo(hWndControl, 1)
   '画画开始-----------------------------
   ca.ht清空画板(&HCCFFFF) '用一个颜色清空画板
   ca.lj弧线 128, 128, 78, 78, 0, 360  '定义裁剪区域的路径
   ca.zb裁剪 True  '进入裁剪模式
   ca.ht绘矩形 0, 0, 256, 256, &HFF000000
   ca.ht绘直线 0, 0, 256, 256, 10, &HFF00FF80
   ca.ht绘直线 256, 0, 0, 256, 10, &HFF00FF80
   ca.zb裁剪 False
   Function = TRUE ' 告诉系统,我们自绘了,不需要系统绘画。
End Function
  • 圆角矩形

Function Form1_Picture1_WM_Paint(hWndForm As hWnd, hWndControl As hWnd) As LResult
   Dim ca As Cairo = cairo(hWndControl, 1)
   '画画开始-----------------------------
   ca.ht清空画板(&HCCFFFF) '用一个颜色清空画板
   Dim i As Long, cc(2) As ARGB = {&HFFB77777, &HFF804D99, &HFF8080FF}
   For i = 0 To 2
      ca.ht绘矩形圆角 i * 5 + 25, i * 5 + 25, 200 - i * 10, 200 - i * 10, 50-i*3, 10-i*3, 30-i*3, 80-i*3, cc(i)
   Next
   Function = TRUE ' 告诉系统,我们自绘了,不需要系统绘画。
End Function
  • 三次贝塞尔曲线

Function Form1_Picture1_WM_Paint(hWndForm As hWnd, hWndControl As hWnd) As LResult
   Dim ca As Cairo = cairo(hWndControl, 1)
   ca.ht清空画板(&HCCFFFF) '用一个颜色清空画板
   Dim As Double x  = 25.6, y   = 128.0
   Dim As Double x1 = 102.4, y1 = 230.4, x2 = 153.6, y2 = 25.6, x3 = 230.4, y3 = 128.0

   ca.sc单色RGB 0   '设置颜色
   ca.xk线框粗细 = 10  '设置线条粗细
   ca.lj设置绝对坐标 x, y     '开始位置
   ca.lj三次贝塞尔曲线绝对坐标 x1, y1, x2, y2, x3, y3 '三次贝塞尔曲线 
  ca.mh描线(True) '描绘路径

   ca.ht绘直线 x, y, x1, y1, 6, &H95FF0000    '封装画线
   ca.ht绘直线 x2, y2, x3, y3, 6, &H95FF0000  '封装画线

   Function = TRUE ' 告诉系统,我们自绘了,不需要系统绘画。
End Function

虚线

Function Form1_Picture1_WM_Paint(hWndForm As hWnd, hWndControl As hWnd) As LResult
   Dim ca As Cairo = cairo(hWndControl, 1)
   ca.ht清空画板(&HCCFFFF) '用一个颜色清空画板

   ca.xk虚线样式(-50,50, 10, 10, 10) '设置虚线模式
   ca.sc单色RGB 0   '设置颜色
   ca.xk线框粗细 = 10  '设置线条粗细
   ca.lj设置绝对坐标 128, 25.6 '开始位置
   ca.lj直线到绝对坐标 230.4, 230.4
   ca.lj直线到相对坐标 -102.4, 0
   ca.lj三次贝塞尔曲线绝对坐标 51.2, 230.4, 51.2, 128.0, 128.0, 128.0   '三次贝塞尔曲线 
   ca.mh描线(True) '描绘路径

   Function = TRUE ' 告诉系统,我们自绘了,不需要系统绘画。
End Function
  • 填充和描边

Function Form1_Picture1_WM_Paint(hWndForm As hWnd, hWndControl As hWnd) As LResult
   Dim ca As Cairo = cairo(hWndControl, 1)
   ca.ht清空画板(&HCCFFFF) '用一个颜色清空画板

   ca.lj设置绝对坐标 128.0, 25.6  '开始位置(绝对坐标)
   ca.lj直线到绝对坐标 230.4, 230.4   '从当前坐标画直线到目标坐标(绝对坐标)
   ca.lj直线到相对坐标 -102.4, 0.0   '从当前坐标画直线到目标坐标(相对坐标)
   ca.lj三次贝塞尔曲线绝对坐标 51.2, 230.4, 51.2, 128.0, 128.0, 128.0 '三次贝塞尔曲线(绝对坐标)
   ca.lj封闭路径 '封闭路径

   ca.lj设置绝对坐标 64.0, 25.6    '开始位置(绝对坐标)
   ca.lj直线到相对坐标 51.2, 51.2    '从当前坐标画直线到目标坐标(相对坐标)
   ca.lj直线到相对坐标  -51.2, 51.2   '从当前坐标画直线到目标坐标(相对坐标)
   ca.lj直线到相对坐标  -51.2, -51.2  '从当前坐标画直线到目标坐标(相对坐标)
   ca.lj封闭路径 '封闭路径

   ca.sc单色RGB &HFF0000  '设置颜色 GDI色
   ca.mh填充(False)    '填充路径,保留路径,后面还要描绘

   ca.xk线框粗细 = 10  '设置线粗细
   ca.sc单色RGB 0     '设置颜色 GDI色
   ca.mh描线(True) '描绘路径并且销毁路径。

   Function = TRUE ' 告诉系统,我们自绘了,不需要系统绘画。
End Function
  • 填充样式

Function Form1_Picture1_WM_Paint(hWndForm As hWnd, hWndControl As hWnd) As LResult
   Dim ca As Cairo = cairo(hWndControl, 1)
   ca.ht清空画板(&HCCFFFF) '用一个颜色清空画板
   ca.xk线框粗细 = 6 '设置线粗细
   Dim i As Long
   For i = 0 To 1
      ca.lj矩形 12, 12, 232, 70 '添加矩形路径
      ca.lj新的子路径() '开始新路径
      ca.lj弧线 64, 64, 40, 40, 0, 360 '添加圆形路径,顺时针
      ca.lj新的子路径() '开始新路径
      ca.lj弧线 192, 64, 40, 40, 360, 0, 1 '添加圆形路径,逆时针
      ca.mh重叠模式 = IIf(i = 0, CAIRO_FILL_RULE_EVEN_ODD, CAIRO_FILL_RULE_WINDING) '填充模式,设置路径和路径的交叉地方是否要填充。
      ca.sc单色RGB &HB300 '设置填充颜色 GDI色
      ca.mh填充(False)
      ca.sc单色RGB 0 '设置线框颜色 GDI色
      ca.mh描线(True) '描绘路径并且销毁路径。

      ca.zb平移 0, 128 '平移坐标系
   Next

   Function = TRUE ' 告诉系统,我们自绘了,不需要系统绘画。
End Function
  • 渐变

Function Form1_Picture1_WM_Paint(hWndForm As hWnd, hWndControl As hWnd) As LResult
   Dim ca As Cairo = cairo(hWndControl, 1)
   ca.ht清空画板(&HCCFFFF) '用一个颜色清空画板

   ca.sc线性渐变RGBA(&HFFFFFFFF, 0, 0, &HFF000000, 0, 256) '创建线性渐变
   ca.lj矩形(0, 0, 256, 256) '新增矩形路径
   ca.mh填充(true) '填充路径

   ca.sc辐射渐变RGBA(&HFFFFFFFF, 115.2, 102.4, 25.6, &HFF000000, 102.4, 102.4, 128.0) '创建圆形渐变
   ca.lj弧线(128.0, 128.0, 76.8, 76.8, 0, 360) '新增 圆形路径
   ca.mh填充(true) '填充路径

   Function = TRUE ' 告诉系统,我们自绘了,不需要系统绘画。
End Function
  • 图像

Function Form1_Picture1_WM_Paint(hWndForm As hWnd, hWndControl As hWnd) As LResult
   Dim ca As Cairo = cairo(hWndControl, 1)
   ca.ht清空画板(&HCCFFFF) '用一个颜色清空画板

   ca.lj矩形 10, 10, 256, 256  ’矩形
   ca.zb裁剪 True   ‘裁剪
   ca.zb旋转(138,138,45)  '旋转
   ca.ht绘PNG图像(App.Path & "i-0056_57.png",10,10,256,256)  ’显示图像文件

   Function = TRUE ' 告诉系统,我们自绘了,不需要系统绘画。
End Function
  • 贴图

Function Form1_Picture1_WM_Paint(hWndForm As hWnd, hWndControl As hWnd) As LResult
   Dim ca As Cairo = cairo(hWndControl, 1)
   ca.ht清空画板(&HCCFFFF) '用一个颜色清空画板

   ca.zb旋转(138,138,45) '旋转45度
   ca.lj矩形 80, 20, 200, 200 '矩形
   ca.sc贴图PNG(App.Path & "i-0056_57.png",100,50,CAIRO_EXTEND_REPEAT,70,70)  ‘图像在矩形里贴图
   ca.mh填充(true)   '填充

   Function = TRUE ' 告诉系统,我们自绘了,不需要系统绘画。
End Function
  • 线帽

Function Form1_Picture1_WM_Paint(hWndForm As hWnd, hWndControl As hWnd) As LResult
   Dim ca As Cairo = cairo(hWndControl, 1)
   ca.ht清空画板(&HCCFFFF) '用一个颜色清空画板
   Dim i As Long

   For i = 0 To 2 '新增3个线条
      ca.lj设置绝对坐标 50.0, 75.0  + i * 50
      ca.lj直线到绝对坐标 200.0, 75.0 + i * 50
      ca.xk线帽样式      = i
      ca.xk线框粗细 = 30 '线粗
      ca.sc单色RGB 0 '颜色
      ca.mh描线(True) '描边

      ca.lj设置绝对坐标 50.0, 75.0  + i * 50
      ca.lj直线到绝对坐标 200.0, 75.0 + i * 50
      ca.xk线帽样式      = i
      ca.xk线框粗细 = 2 '线粗
      ca.sc单色RGB &H1A1AFF
      ca.mh描线(True) '描边      
   Next

   Function = TRUE ' 告诉系统,我们自绘了,不需要系统绘画。
End Function
  • 折线处形状(角的形状)

Function Form1_Picture1_WM_Paint(hWndForm As hWnd, hWndControl As hWnd) As LResult
   Dim ca As Cairo = cairo(hWndControl, 1)
   ca.ht清空画板(&HCCFFFF) '用一个颜色清空画板

   ca.xk线框粗细 = 40 '线粗
   ca.sc单色RGB 0 '颜色
   For i As Long = 0 To 2 '新增3个线条
      ca.lj设置绝对坐标 76.8, 84.48 + i * 80
      ca.lj直线到相对坐标 51.2, -51.2
      ca.lj直线到相对坐标 51.2, 51.2
      ca.xk折线形状 = i
      ca.mh描线(True) '描边
   Next

   Function = TRUE ' 告诉系统,我们自绘了,不需要系统绘画。
End Function

在WIN系统中,本质上是对GDI+的封装,绘画速度和GDI+相当。 好处是在非WIn系统中,也可以使用。

评论一下?

OωO
取消