朕的 发表于 2026-2-3 15:38:11

ExDUI -SVG图片框代码

<火山程序 类型 = "通常" 版本 = 1 />

类 _组件_svg代码图片框 <公开 基础类 = 动态图片框 折叠
      @视窗.窗口组件 = "icon=\"@55\"\r\ndefault_size = \"120, 100\"\r\ncategory = \"DIY组件\"">
{
    变量 _SVG代码 <公开 类型 = 文本型 @属性变量 = 真>
    变量 _创建图片后销毁svg <公开 类型 = 逻辑型 @属性变量 = 真>
    变量 _svg句柄 <公开 类型 = 整数>
    变量 _pic句柄 <公开 类型 = 整数>
    变量 _SVG字节集 <公开 类型 = 字节集类 @属性变量 = 真>

    方法 类_清理
    {
      _销毁资源 ()
    }

    方法 _初始化svg <公开>
    {
      _pic句柄 = _SVG_代码转图片句柄 (_SVG代码, 本对象.宽度, 本对象.高度, _svg句柄, _创建图片后销毁svg)

      本对象.置图片 (_pic句柄)
      调试输出 (_pic句柄, "SVG句柄")

    }

    方法 _销毁资源 <公开 折叠>
    {
      _SVG字节集.清空字节集 ()
      SVG_销毁 (_svg句柄)
      图片_销毁 (_pic句柄)
      调试输出 (_pic句柄, "SVG销毁资源")
    }

    #

    方法 _组件_svg代码图片框_组件创建完毕 <接收事件 类型 = 整数 注释 = "当组件被创建完毕后发送此事件" 折叠>
    参数 来源对象 <类型 = _组件_svg代码图片框 注释 = "提供事件产生的具体来源对象">
    参数 标记值 <类型 = 整数 注释 = "用户调用\"挂接事件\"命令时所提供的\"标记值\"参数值,非此方式挂接事件则本参数值固定为0.">
    参数 父组件 <类型 = 窗口组件 注释 = "提供组件所处的父组件,必定有效且已经成功创建."
            注释 = "可以使用\"属于\"操作符判断具体的父组件数据类型,如: \"如果 (父组件 属于 窗口容器组件)\","
            注释 = "\"如果 (父组件 属于 图片框)\" 等. 判断清楚具体数据类型后,可以使用强制转换将其转换到具体的" 注释 = "窗口组件类对象,如: \"(窗口容器组件)父组件\"">
    参数 组件ID <类型 = 整数 注释 = "提供组件在所处父组件中的ID值">
    {

      _初始化svg ()
      返回 (0)
    }

    方法 销毁 <公开 注释 = "销毁本窗口组件,本方法调用后如欲继续使用本对象,必须再次创建." @虚拟方法 = 可覆盖>
    {
      _销毁资源 ()

      父对象.销毁 ()// 调用基础类中的被覆盖虚拟方法
    }
}


<火山程序 类型 = "通常" 版本 = 1 />

类 _图片画布_操作类 <公开 @全局类 = 真>
{
    方法 _SVG_创建 <公开 静态 类型 = 整数 折叠>
    参数 SVG代码 <类型 = 文本型>
    {
      变量 svg句柄 <类型 = 整数>
      变量 SVG字节集 <类型 = 字节集类>
      SVG字节集 = 文本到多字节 (SVG代码, )
      SVG_创建 (SVG字节集.取字节集指针 (), svg句柄)
      返回 (svg句柄)

    }

    方法 _SVG_代码转图片句柄 <公开 静态 类型 = 整数 折叠>
    参数 SVG代码 <类型 = 文本型>
    参数 图片宽度 <类型 = 整数 @默认值 = 64>
    参数 图片高度 <类型 = 整数 @默认值 = 64>
    参数 svg句柄接收变量 <类型 = 整数 @需求类型 = 可写入变量>
    参数 销毁svg句柄 <类型 = 逻辑型 @默认值 = 真>
    {
      变量 svg句柄 <类型 = 整数>
      变量 pic句柄 <类型 = 整数>
      svg句柄 = _SVG_创建 (SVG代码)

      svg句柄接收变量 = svg句柄
      图片_创建自SVG句柄 (svg句柄, 图片宽度, 图片高度, pic句柄)
      如果真 (销毁svg句柄)
      {
            SVG_销毁 (svg句柄)
      }

      返回 (pic句柄)

    }

    方法 _画布_保存图片 <公开 静态 类型 = 逻辑型 折叠>
    参数 画布句柄 <类型 = 整数>
    参数 保存路径 <类型 = 文本型>
    {
      变量 pic <类型 = 整数>
      变量 结果 <类型 = 逻辑型>
      图片_创建自画布句柄 (画布句柄, pic)
      结果 = 图片_保存到文件 (pic, 保存路径)
      图片_销毁 (pic)
      返回 (结果)
    }

    方法 _画布_置底色 <公开 静态 类型 = 逻辑型 注释 = "请自行开始/结束 绘制" 折叠>
    参数 画布句柄 <类型 = 整数>
    参数 底色 <类型 = 整数 注释 = "argb">
    参数 左边起点 <类型 = 整数 @默认值 = 0>
    参数 顶边起点 <类型 = 整数 @默认值 = 0>
    参数 限制宽度 <类型 = 整数 @默认值 = 0>
    参数 限制高度 <类型 = 整数 @默认值 = 0>
    {
      变量 画刷 <类型 = 变整数>
      变量 宽 <类型 = 整数>
      变量 高 <类型 = 整数>
      变量 结果 <类型 = 逻辑型>
      画布_取尺寸 (画布句柄, 宽, 高)
      如果真 (宽 == 0 || 高 == 0)
      {
            调试输出 ("_画布_置底色:画布尺寸无效!")
            返回 (假)
      }

      画刷 = 画刷_创建 (底色)
      如果真 (画刷 == 0)
      {
            调试输出 ("_画布_置底色:创建画刷失败!")
            返回 (假)
      }

      如果真 (限制宽度 > 0)
      {
            宽 = 限制宽度
      }

      如果真 (限制高度 > 0)
      {
            高 = 限制高度
      }

      结果 = 画布_填充矩形 (画布句柄, 画刷, 左边起点, 顶边起点, 宽 + 左边起点, 高 + 顶边起点)
      画刷_销毁 (画刷)
      返回 (结果)
    }

    方法 _画布_创建带底色 <公开 静态 类型 = 整数 折叠>
    参数 组件句柄 <类型 = 整数>
    参数 底色 <类型 = 整数 注释 = "argb" "">
    参数 图片宽度 <类型 = 整数 注释 = "<1为取组件尺寸" @默认值 = -1>
    参数 图片高度 <类型 = 整数 注释 = "<1为取组件尺寸" @默认值 = -1>
    参数 结束绘制 <类型 = 逻辑型 @默认值 = 真>
    {
      如果真 (图片宽度 < 1 || 图片高度 < 1)
      {
            变量 矩形 <类型 = RECT>
            组件取矩形 (组件句柄, 矩形)
            如果真 (图片宽度 < 1)
            {
                图片宽度 = 矩形.right - 矩形.left

            }
            如果真 (图片高度 < 1)
            {
                图片高度 = 矩形.bottom - 矩形.top
            }

      }

      变量 底色画布 <类型 = 整数>

      底色画布 = 画布_创建自组件句柄 (组件句柄, 图片宽度, 图片高度, 画布标识.画布抗锯齿)

      如果真 (底色 != 数值范围.最小整数值)
      {
            变量 底色画刷 <类型 = 变整数>
            画布_开始绘制 (底色画布)
            底色画刷 = 画刷_创建 (底色)
            画布_填充矩形 (底色画布, 底色画刷, 0, 0, 图片宽度, 图片高度)
            如果真 (结束绘制)
            {
                画布_结束绘制 (底色画布)
            }

            画刷_销毁 (底色画刷)

      }

      返回 (底色画布)


    }

    方法 _画布_取容器子组件合并画布 <公开 静态 类型 = 整数 折叠>
    参数 容器组件句柄 <类型 = 整数>
    参数 左边距 <类型 = 整数 @默认值 = 0>
    参数 右边距 <类型 = 整数 @默认值 = 0>
    参数 上边距 <类型 = 整数 @默认值 = 0>
    参数 下边距 <类型 = 整数 @默认值 = 0>
    参数 底色 <类型 = 整数 @默认值 = 0>
    参数 底色圆角 <类型 = 整数 @默认值 = 0>
    参数 绘制混合模式 <类型 = 混合模式 注释 = "拷贝会清除矩形范围内的原本内容" @默认值 = 混合模式.覆盖>
    参数 "//是否进行粘贴优化" <类型 = 逻辑型>
    {
      变量 容器矩形 <类型 = RECT>
      变量 子组件数组 <类型 = 整数数组类>
      变量 画布 <类型 = 整数>
      组件取矩形 (容器组件句柄, 容器矩形)
      画布 = 画布_创建自组件句柄 (容器组件句柄, 容器矩形.right - 容器矩形.left + 左边距 + 右边距, 容器矩形.bottom - 容器矩形.top + 上边距 + 下边距, 画布标识.文本抗锯齿)

      画布_开始绘制 (画布)
      如果真 (底色 != 0)
      {
            变量 画刷 <类型 = 变整数>
            画刷 = 画刷_创建 (底色)
            画布_填充圆角矩形 (画布, 画刷, 0, 0, 容器矩形.right - 容器矩形.left + 左边距 + 右边距, 容器矩形.bottom - 容器矩形.top + 上边距 + 下边距, 底色圆角, 底色圆角)
            画刷_销毁 (画刷)

      }

      // 如果真 (左边距 != 0 || 右边距 != 0 || 上边距 != 0 || 下边距 != 0)
      {
            // 画布_置剪辑区 (画布, 左边距, 上边距, 左边距 + 容器矩形.right - 容器矩形.left, 上边距 + 容器矩形.bottom - 容器矩形.top)
      }


      // 图片_创建 (容器矩形.right - 容器矩形.left + 左右边距, 容器矩形.bottom - 容器矩形.top + 上下边距, pic)
      // 图片_粘贴 (pic, (整数)组件取数值 (容器组件句柄, EOL_HCANVAS), 左右边距, 上下边距, pic)
      // 图片_创建自画布句柄 ((整数)组件取数值 (容器组件句柄, EOL_HCANVAS), pic)

      子组件数组 = _组件_枚举子组件 (容器组件句柄, , )

      子组件数组.枚举循环 ()
      {
            变量 子组件句柄 <类型 = 整数>
            变量 子组件矩形 <类型 = RECT>
            变量 子组件画布 <类型 = 整数>
            子组件句柄 = 子组件数组.取枚举值 ()
            如果真 (组件是否可视 (子组件句柄))
            {
                组件取矩形 (子组件句柄, 子组件矩形)
                子组件画布 = _画布_组件取画布句柄 (子组件句柄)
                // 画布_画画布 (画布, 子组件画布, 左边距 + 子组件矩形.left, 上边距 + 子组件矩形.top, 左边距 + 子组件矩形.right, 上边距 + 子组件矩形.bottom, 0, 0, 255, 绘制混合模式)
                _画布_画画布 (画布, 子组件画布, 左边距 + 子组件矩形.left, 上边距 + 子组件矩形.top, 绘制混合模式)

                // 图片_销毁 (子组件pic)
                // 图片_保存到文件 (子组件pic, "d:\\测试\\" + 到文本 (子组件数组.取枚举索引 ()) + ".png")

            }

      }


      // 如果真 (左边距 != 0 || 右边距 != 0 || 上边距 != 0 || 下边距 != 0)
      {
            // 画布_重置剪辑区 (画布)
      }

      画布_结束绘制 (画布)

      返回 (画布)

    }

    方法 _画布_画画布 <公开 静态 类型 = 逻辑型 折叠>
    参数 结果画布 <类型 = 整数>
    参数 来源画布 <类型 = 整数>
    参数 左边起点 <类型 = 整数 @默认值 = 0>
    参数 顶边起点 <类型 = 整数 @默认值 = 0>
    参数 绘制混合模式 <类型 = 混合模式 注释 = "拷贝会清除矩形范围内的原本内容" @默认值 = 混合模式.覆盖>
    {
      变量 来源宽度 <类型 = 整数>
      变量 来源高度 <类型 = 整数>
      画布_取尺寸 (来源画布, 来源宽度, 来源高度)
      返回 (画布_画画布 (结果画布, 来源画布, 左边起点, 顶边起点, 左边起点 + 来源宽度, 顶边起点 + 来源高度, 0, 0, 255, 绘制混合模式))
    }

    方法 _画布_组件取画布句柄 <公开 静态 类型 = 整数 折叠>
    参数 组件句柄 <类型 = 整数>
    {
      返回 ((整数)组件取数值 (组件句柄, 窗口组件.EOL_HCANVAS))

    }

    方法 "//_图片_取子组件图片" <公开 类型 = 整数 折叠>
    参数 容器组件句柄 <类型 = 整数>
    参数 是否进行粘贴优化 <类型 = 逻辑型>
    {
      变量 pic <类型 = 整数>
      变量 容器矩形 <类型 = RECT>
      变量 左右边距 <类型 = 整数 值 = 0>
      变量 上下边距 <类型 = 整数 值 = 0>
      变量 子组件数组 <类型 = 整数数组类>
      组件取矩形 (容器组件句柄, 容器矩形)

      图片_创建 (容器矩形.right - 容器矩形.left + 左右边距, 容器矩形.bottom - 容器矩形.top + 上下边距, pic)
      // 图片_粘贴 (pic, (整数)组件取数值 (容器组件句柄, EOL_HCANVAS), 左右边距, 上下边距, pic)
      // 图片_创建自画布句柄 ((整数)组件取数值 (容器组件句柄, EOL_HCANVAS), pic)

      子组件数组 = _组件_枚举子组件 (容器组件句柄, , )
      子组件数组.枚举循环 ()
      {
            变量 子组件句柄 <类型 = 整数>
            变量 子组件pic <类型 = 整数>
            变量 矩形 <类型 = RECT>
            子组件句柄 = 子组件数组.取枚举值 ()
            组件取矩形 (子组件句柄, 矩形)
            子组件pic = 0
            图片_创建自画布句柄 ((整数)组件取数值 (子组件句柄, EOL_HCANVAS), 子组件pic)

            // 调试输出 (子组件数组.取枚举索引 (), 组件取文本2 (子组件句柄), )

            如果 (是否进行粘贴优化)
            {
                pic = _图片_粘贴2 (pic, 子组件pic, 矩形.left, 矩形.top)
            }
            否则
            {
                图片_粘贴 (pic, 子组件pic, 矩形.left, 矩形.top, pic)
            }

            // 图片_保存到文件 (子组件pic, "d:\\测试\\" + 到文本 (子组件数组.取枚举索引 ()) + ".png")
            // 图片_销毁 (子组件pic)




      }

      返回 (pic)





    }

    方法 _图片_创建带底色 <公开 静态 类型 = 整数 折叠>
    参数 宽度 <类型 = 整数>
    参数 高度 <类型 = 整数>
    参数 rgba底色 <类型 = 整数>
    {
      变量 pic <类型 = 整数>
      图片_创建 (宽度, 高度, pic)

      计次循环 (宽度)
      {
            变量 左 <类型 = 整数>
            左 = 取循环索引 ()
            计次循环 (高度)
            {
                图片_置点像素 (pic, 左, 取循环索引 (), rgba底色)
                调试输出 (取循环索引 (), 左)


            }

      }

      返回 (pic)


    }

    方法 _图片_置保存字节集预分配尺寸 <公开 静态 注释 = "图片_取宽度(图片句柄)*图片_取高度(图片句柄)*4" 折叠>
    参数 图片句柄 <类型 = 整数>
    参数 字节集 <类型 = 字节集类 @需求类型 = 可写入变量>
    {
      字节集.重分配字节集 (图片_取宽度 (图片句柄) * 图片_取高度 (图片句柄) * 4)

    }

    方法 _图片_粘贴2 <公开 静态 类型 = 整数 注释 = "比原版多了 大小判断及进行裁剪" 折叠>
    参数 目标图片句柄 <类型 = 整数 注释 = "大图">
    参数 源图句柄 <类型 = 整数 注释 = "小图">
    参数 粘贴到大图横坐标 <类型 = 整数>
    参数 粘贴到大图纵坐标 <类型 = 整数>
    {
      变量 大图宽度 <类型 = 整数>
      变量 大图高度 <类型 = 整数>
      变量 小图宽度 <类型 = 整数>
      变量 小图高度 <类型 = 整数>
      变量 超出宽度 <类型 = 整数>
      变量 超出高度 <类型 = 整数>
      变量 被粘贴图片句柄 <类型 = 整数>
      变量 结果图片句柄 <类型 = 整数>
      变量 "//结果" <类型 = 逻辑型>
      图片_取尺寸 (目标图片句柄, 大图宽度, 大图高度)
      图片_取尺寸 (源图句柄, 小图宽度, 小图高度)
      超出宽度 = 粘贴到大图横坐标 + 小图宽度 - 大图宽度
      超出高度 = 粘贴到大图纵坐标 + 小图高度 - 大图高度
      // 调试输出 (超出宽度, 超出高度)

      如果 (超出宽度 > 0 || 超出高度 > 0)
      {
            变量 保留宽度 <类型 = 整数>
            变量 保留高度 <类型 = 整数>
            保留宽度 = 大图宽度 - 粘贴到大图横坐标
            保留高度 = 大图高度 - 粘贴到大图纵坐标
            如果真 (保留宽度 > 小图宽度)
            {
                保留宽度 = 小图宽度
            }
            如果真 (保留高度 > 小图高度)
            {
                保留高度 = 小图高度
            }


            如果 (图片_裁剪 (源图句柄, 0, 0, 保留宽度, 保留高度, 被粘贴图片句柄))
            {
                // 调试输出 ("AAA", 大图宽度, 大图高度, 小图宽度, 小图高度, 保留宽度, 保留高度)
            }
            否则
            {
                // 调试输出 ("BBB", 大图宽度, 大图高度, 小图宽度, 小图高度, 保留宽度, 保留高度)

            }


      }
      否则
      {
            被粘贴图片句柄 = 源图句柄
      }

      图片_粘贴 (目标图片句柄, 被粘贴图片句柄, 粘贴到大图横坐标, 粘贴到大图纵坐标, 结果图片句柄)
      如果真 (被粘贴图片句柄 != 源图句柄)
      {
            图片_销毁 (被粘贴图片句柄)
      }

      返回 (结果图片句柄)
    }

    方法 _画布_填充圆角矩形_自RECT矩形 <公开 静态 类型 = 逻辑型 折叠>
    参数 画布句柄 <类型 = 整数>
    参数 画刷句柄 <类型 = 变整数>
    参数 RECT矩形 <类型 = RECT "">
    参数 圆角radiusX <类型 = 单精度小数 注释 = "实际需求: 单精度小数" "">
    参数 圆角radiusY <类型 = 单精度小数 注释 = "实际需求: 单精度小数" "">
    {
      返回 (画布_填充圆角矩形 (画布句柄, 画刷句柄, RECT矩形.left, RECT矩形.top, RECT矩形.right, RECT矩形.bottom, 圆角radiusX, 圆角radiusY))
    }
}

朕的 发表于 2026-2-3 15:45:32



直接在www.iconfon**找到喜欢的图标,赋值SVG,在IDE里输入SVG代码就行了


页: [1]
查看完整版本: ExDUI -SVG图片框代码