在使用简单画板写古诗词效果过程中,遇到一个问题,就是文本换行时,如果行首为标点符号,会自动将上一行最后一个文字移到这行的标点符号前。这样,上一行末尾就有一个空缺了,不是很美观。当然,这符合语文写作规则 ^-^
我在尝试,是不是有什么设置选项,可以强行将标点符号放到行首。
经测试没找到办法,于是有了个设想:自己写几句代码,强行用空格,将文字或标点符号“顶”到其位置,空格和标点符号之间,空格应该不会被强行挪移到行首吧?
于是有了以下想法:
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);
}
}
运行效果如下: