6 0 0

预测文本宽度【画布之测量文本】实际用法

2022-9-10 404

有时候在绘制一行文本前可能想事先知道它的宽度,为什么会有这种需求呢?

比如,我们想给文本绘制个背景或者边框,很简单的,就比如这样的:

我们要绘制一个自适应文本大小的背景,不就需要事先知道文本的长度么?

使用【画布_测量文本/Jo_cv_calctextsize】命令即可轻松实现对文本的长度测量。

易语言命令方法:

.版本 2

.子程序 画布_测量文本, 逻辑型, 公开
.参数 画布句柄, 整数型
.参数 文本, 字节集
.参数 字体, 整数型, 可空
.参数 文本风格, 整数型, 可空
.参数 布局宽度, 小数型, 可空, 当文本风格带有字符省略时有效
.参数 布局高度, 小数型, 可空, 同上
.参数 返回_宽度, 小数型, 参考 可空
.参数 返回_高度, 小数型, 参考 可空

 

通常画布类命令都用于扩展和绘制;在绘制的时候我们可以拿到画布句柄、字体、文本风格

【捡重点】

字体:需要测量的字体,如果有多个字体 只需要测量画文本的那个字体即可;否则指定默认画布字体。不能为null

文本风格:最好不要去手动去指定;除非测量的画出的文本用的是手动指定的;否则用默认画布文本风格

布局宽度:这非常重要,相当于指定一个范围进行测量;超过范围按指定的布局宽度返回。这能避免无限延伸导致测量不准确,如果不指定布局宽度 会测量实际长度返回。

布局高度:同上

返回的宽度:一定指定类型为小数型【float】,否则不会返回。

返回高度:同上

注意:测量的文本允许带有【文本_多行】风格 或换行字符;但这并不能以布局宽度或布局高度测量出多行尺寸;如想范围内测量要用单行内容

所有参数按部就班后就会返回实际尺寸:

 

【扩展资料】文本测量是如何工作的?

都是使用baseline作为一个基准线来确定距离。

可以看出来baseline的确认很重要,那么接下来看一下baseline怎么计算。

从图中可以看出来,baseline的大小y值等于fontMetrics.bottom + fontMetrics.top -fontMetrics.descent。这里fontMetrics为字体;已经被内部处理。

 

 

最新回复 (6)
  • 弃爱保歌 2022-9-10
    0 引用 2

    前半段看懂了,后面没看懂,我在测量字体之前,先对控件置字体:
    控件_置字体 (私_提示框.hObj (), “宋体”, 12, #字体风格_普通, )

    然后在绘制过程中给ps的hFont赋值:

    提示文本=“测试文本”
    控件_开始绘制 (私_提示框.hObj (), ps)
    ps.hFont = 控件_取字体 (私_提示框.hObj (), )
    画布_测量文本 (ps.hCanvas, A2W (提示文本), ps.hFont, , , , 局部_文本宽度, 局部_文本高度)
    调试输出 (局部_文本宽度, 局部_文本高度)
    控件_结束绘制 (私_提示框.hObj (), ps)

    输出结果是:12.000000 | 60.960938

    这个结果明显是不对的,不知道是哪里的问题。

     

  • admin 楼主 2022-9-11
    0 引用 3

    ps.hFont本来就是获取出来的字体句柄为啥还要赋值?多此一举啊 没有必要还要去用控件_取字体来赋值;这个接口是给外面不是绘制得不到ps的情况下用的。网盘已经更新了 试试新版

  • 弃爱保歌 2022-9-12
    0 引用 4

    还是测不准,你把你上面发图片那个测量例程发出来吧。

  • good 2022-9-12
    0 引用 5

    支持支持

  • sinewtec 2022-9-14
    0 引用 6

    支持

  • qingfeng12 1月前
    0 引用 7

    支持

请先登录后发表评论!

返回
请先登录后发表评论!