rtf格式 C#设置字间距 CharacterSpacing
richtextbox控件中操作行间距段间距都可以用发送消息解决,但是字间距却鲜有人关注,无法通过PARAFORMAT2消息解决,只能直接操作rtf格式
字间距主要就是要控制 expand expandtw 这些rtf属性
下面给出一个插入代码,只能对简单点的rtf进行操作,word保存出来的rtf不一定可以
操作rtf格式的类库使用RtfTree
public void SetCharacterSpacing(int spacing)
{
spacing--;
if (spacing < 0)
{
return;
} RtfTree doc = new RtfTree();
doc.LoadRtfText(this.Rtf);
RtfNodeCollection fileds = doc.MainGroup.ChildNodes;
bool hasltrch = false;
bool hasrtlch = false;
bool hasText = !string.IsNullOrEmpty(this.Text);
foreach (RtfTreeNode f in fileds)
{
if (f.NodeType == RtfNodeType.Keyword)
{
if (f.NodeKey == "expnd")
{
f.Parameter = spacing;
}
if (f.NodeKey == "expndtw")
{
f.Parameter = spacing * 5;
}
if (f.NodeKey == "ltrch")
{
hasltrch = true;
}
if (f.NodeKey == "rtlch")
{
hasrtlch = true;
}
} } if (spacing > 0)
{
if (hasText)
{
bool ispar = false; for (int i = fileds.Count - 1; i >= 0; i--)
{
var f = fileds[i];
if (f.NodeKey == "par")
{
ispar = true; }
if (f.NodeKey == "u" || f.NodeKey == "'" || f.NodeType == RtfNodeType.Text)
{
continue;
}
else
{
if (ispar)
{
if (fileds[i - 1].NodeKey.Contains("expnd"))
{
continue;
}
InsertLetterExpand(spacing, doc, f.Index);
ispar = false;
}
}
if (f.NodeType == RtfNodeType.Group)
{
if (f.ChildNodes[0].NodeKey == "colortbl" || f.ChildNodes[0].NodeKey == "fonttbl")
{
if (!doc.MainGroup[f.Index + 1].NodeKey.Contains("expnd"))
{
InsertLetterExpand(spacing, doc, f.Index + 1);
i -= 2;
}
else
{
continue;
} }
}
if (f.NodeKey == "viewkind")
{
if (!doc.MainGroup[f.Index - 1].NodeKey.Contains("expnd"))
{
InsertLetterExpand(spacing, doc, f.Index);
i--;
}
continue;
}
}
}
else
{
for (int i = fileds.Count - 1; i >= 0; i--)
{
var f = fileds[i];
if (f.NodeKey == "par")
{
InsertLetterExpand(spacing, doc, f.Index - 1);
break;
}
}
}
} if (!hasltrch)
{
doc.MainGroup.InsertChild(1, new RtfTreeNode(RtfNodeType.Keyword, "ltrch", false, 0));
}
if (!hasrtlch)
{
doc.MainGroup.InsertChild(1, new RtfTreeNode(RtfNodeType.Keyword, "rtlch", false, 0));
} this.Rtf = doc.Rtf;
} private void InsertLetterExpand(int spacing, RtfTree doc, int index)
{
doc.MainGroup.InsertChild(index, new RtfTreeNode(RtfNodeType.Keyword, "expnd", true, spacing));
doc.MainGroup.InsertChild(index, new RtfTreeNode(RtfNodeType.Keyword, "expndtw", true, spacing * 5));
}
rtf格式 C#设置字间距 CharacterSpacing的更多相关文章
- NSAttributedString之设置字间距与行间距
// 调整行间距 NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithSt ...
- UILabel设置行间距和字间距并计算高度-b
#define UILABEL_LINE_SPACE 6 #define HEIGHT [ [ UIScreen mainScreen ] bounds ].size.height //给UILabe ...
- Lodop设置文本项行间距、字间距
LODOP给文本项ADD_PRINT_TEXT设置字间距.行间距,可以在打印设计页面,右键属性里设置,然后在打印设计生成代码,也可以直接写代码.LineSpacing行间距.LetterSpacing ...
- iOS UILabel设置行间距和字间距
实现UILabel的文字,设置行间距和字间距. 效果图: 代码: let lblTitle = UILabel(frame: CGRect(x: , y: , width: KScreenWidth- ...
- [图片问答]LODOP打印的行间距字间距
LODOP可以打印纯文本,也可以是超文本,关于哪些打印项是纯文本,哪些打印项是超文本,之前有博文相关介绍:LODOP中的纯文本和超文本打印项. 之前的关于纯文本的行间距字间距介绍:Lodop设置文本项 ...
- 使用CSS设置行间距,字间距.
字间距1.text-indent设置抬头距离css缩进即对,对应div设置css样式text-indent : 20px; 缩进了20px 2.letter-spacing来设置字与字间距_字符间距离 ...
- css 字间距、CSS字体间距、css 字符间距设置
1.text-indent设置抬头距离css缩进 2.letter-spacing来设置字与字间距_字符间距离,字体间距css样式
- textview设置字体的行距和字间距
字间距 textView有一个属性android:textScaleX是调节字间距的,它的值是一个float型.查看源代码,默认textView 此属性是使用的是: android.internal. ...
- css如何设置label的字间距
css.html如何设置label的字间距 .myClass label{ letter-spacing: 10px; } 如果label需要居中,需加上 text-indent: 10px; 首行 ...
随机推荐
- 粒子动画——Pygame
你是否也想做出下图这么漂亮的动态效果?想的话就跟着我一起做吧=.= 工具: Python--Pygame 仔细观察上图,你能发现哪些机制呢?再在下面对比一下是否跟你想的一样. 运行机制: 1.随机方向 ...
- CentOS_mini下安装docker 之 安装docker CE
警告:切勿在没有配置 Docker YUM 源的情况下直接使用 yum 命令安装 Docker. 原文地址:https://yeasy.gitbooks.io/docker_practice/inst ...
- PostFix添加多个端口
/usr/local/*/config/postfix/master.cf 在/etc/services中搜索smtp,复制,添加smtp2<与上面一步对应起来的服务名>,后面为需要添加的 ...
- pyinstaller spec
pyinstaller options..script.py pyi-makespec options script.py [other scripts ...] pyinstaller option ...
- 家庭家长本-微信小程序
寒假在家的时候,做了一个简单的网页版家庭账本,后来自己学习了微信小程序的制作方法,现在想做一个微信小程序的家庭记账本. 首先要在微信公众平台注册一个微信小程序的账号,用的邮箱一个只能注册一个微信小程序 ...
- Chapter3_操作符_关系操作符
java中的关系操作符有等于“=”,不等于“!=”,大于“>”,小于“<”,大于等于“≥”,小于等于“≤”等.这些都不再赘述了,有一个有意思的点是关于等价性的讨论. 在java中测试两个对 ...
- # 2019-2020-3 《Java 程序设计》第四周总结
2019-2020-3 <Java 程序设计>第四周知识总结 第五章:继承 1.定义继承关系的语法结构: [修饰符] class 子类名 extends 父类名 { 类体定义 } 父类中应 ...
- mui.init方法配置
mui框架将很多功能配置都集中在mui.init方法中,要使用某项功能,只需要在mui.init方法中完成对应参数配置即可,目前支持在mui.init方法中配置的功能包括: 创建子页面. 关闭页面. ...
- python 更换 版本
这是一个悲伤的安装ipython的过程. 写下来留个教训吧. 也是希望对博友一些帮助吧. 注: 我也写了一篇window下安装bpython的文章(个人感觉bpython要比ipython强大的多), ...
- MD5盐值加密
加密思路 思路解析:(数据解析过程基于16进制来处理的,加密后为16进制字符串) 加密阶段: 对一个字符串进行MD5加密,我们需要使用到MessageDigest(消息摘要对象),需要一个盐值(sal ...