aardio - 巧用字符分隔符\u0001

博主在使用简单画板绘制古诗词时遇到一个问题,即文本换行且行首为标点符号时,会导致上一行末尾空白。为保持美观,博主试图寻找设置选项强制标点符号居行首,但未果。于是,博主通过编程尝试用空格或特殊字符‘’来避免文字重叠。最终,‘’成功实现了所需效果,解决了文字叠加的问题。
摘要由CSDN通过智能技术生成

    在使用简单画板写古诗词效果过程中,遇到一个问题,就是文本换行时,如果行首为标点符号,会自动将上一行最后一个文字移到这行的标点符号前。这样,上一行末尾就有一个空缺了,不是很美观。当然,这符合语文写作规则 ^-^

    我在尝试,是不是有什么设置选项,可以强行将标点符号放到行首。

    经测试没找到办法,于是有了个设想:自己写几句代码,强行用空格,将文字或标点符号“顶”到其位置,空格和标点符号之间,空格应该不会被强行挪移到行首吧?

    于是有了以下想法:

var text = `庆历四年春,滕子京谪守巴陵郡。越明年,政通人和,百废具兴,乃重修岳阳楼,增其旧制,刻唐贤今人诗赋于其上,属予作文以记之。
予观夫巴陵胜状,在洞庭一湖。衔远山,吞长江,浩浩汤汤,横无际涯,朝晖夕阴,气象万千,此则岳阳楼之大观也,前人之述备矣。然则北通巫峡,南极潇湘,迁客骚人,多会于此,览物之情,得无异乎?
`
// 将整段文字打散
var ts = ..string.split(text);
winform.button.oncommand = function(id,event){
	for(i=1;#ts;1){
		var newstr="" // 每次循环写一个字,保留前面写的,本次只写一个字。
		//将打散后的文本重新组合,前面所有的文字用空格代替,只保留本次循环的那个字,以免以前的字重复绘制。
		for(n=1;i-1;1){
			if ts[n]='\n' newstr ++= '\n';  //保留换行
			else newstr ++= '  ';  // 换行以外的,都替换为空格
		}
		newstr ++= ts[i]; //最后加上本次的文本。
		// 最后再一次性写出:
		p.drawText(rectf,newstr,::LOGFONT(name="仿宋";point=16;color=0xFF000000),{3},true)
		..win.delay(100);
	}
}

运行结果如下:

   

    从结果可以看出,gdip在遇到空格换行时,从第二行开始,前面的空格都被忽略了,文本会从第二行行首开始,造成多次重叠。这显然不是我需要的效果。

    但是有例外,后面是标点符号和换行时,前面的空格换行是正常的。

    那么,有没有一个字符,既是空的,重复书写时不会影响已写过的内容,又能避免gdip处理空格换行时出现的第二行文本叠加问题呢?

    经过查找资料和测试,\u0001或\1,有人叫他“字符分隔符”或“诡异的空格”,不管叫啥吧,反正这个符号目前能实现这种效果。

// 将整段文字打散
var ts = ..string.split(text);
winform.button.oncommand = function(id,event){
	for(i=1;#ts;1){
		var newstr="" // 每次循环写一个字,保留前面写的,本次只写一个字。
		//将打散后的文本重新组合,前面所有的文字用空格代替,只保留本次循环的那个字,以免以前的字重复绘制。
		for(n=1;i-1;1){
			if ts[n]='\n' newstr ++= '\n';  //保留换行
			else newstr ++= '\u0001';  // 换行以外的,都替换为空格
		}
		newstr ++= ts[i]; //最后加上本次的文本。
		// 最后再一次性写出:
		p.drawText(rectf,newstr,::LOGFONT(name="仿宋";point=16;color=0xFF000000),{3},true)
		..win.delay(100);
	}
}

运行效果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卢光庆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值