我正在开发 .net 3.5 Win Forms 程序,但遇到了文本绘制的“有趣”问题。
我正在实现一个文本编辑控件,它使用 DrawString() 和 StringFormat.GenericTypographic(以下简称 GT)绘制文本。当用户键入时,该行前面的整个单词(或单词组)会随机巧妙地左右移动。
这似乎可能是舍入错误——当字母被添加到行尾时,受影响的块看起来会在水平面上移动一个像素。如果我使用 StringFormat.GenericDefault (GD) 这不会发生,但字符呈现不太准确,这是 Not Acceptable 。
我认为我可以慢慢地将 GD 更改为 GT(MSDN 中讨论了每个设置的设置,显然可以在调试器中检查)并查看是哪个 FormatFlags 或其他设置导致了这种情况,然后从那里开始。但是,如果我复制 GD,将所有属性更改为与 GT 相同,则角色放置完全不同 - 这两个假定相同的对象的行为显然不相同。
恕我直言,像太多东西一样,.net Reflector 表明 StringFormat 只是非托管对象的包装器,我只能假设并非所有属性都暴露给 .net 软件。
任何人都可以建议任何可能对我有帮助的东西吗?我知道 TextRenderer 可能会提供一种替代的渲染方法,但我在设计过程的早期就忽略了这一点(尽管我现在实际上不记得问题是什么......)。
编辑
我用于渲染的代码如下:
sForm = new StringFormat(StringFormat.GenericTypographic);
sForm.FormatFlags |= StringFormatFlags.MeasureTrailingSpaces;
using (SolidBrush brush = new SolidBrush(frmt.ForegroundColour))
context.DrawString(line.Text, frmt.DisplayFont, brush, new PointF(horizontal, height), sForm);
最佳答案
嗯,我已经解决了这个问题。这不是我想要的方式,但作为引用,我是这样做的:
我已经有了为每个单词计算边界框的代码(用于在单击控件时计算插入符号位置并显示对齐的文本),所以我现在不是一次性绘制整条线,而是分别绘制每个单词.
连续打电话DrawString()
好像很浪费对于每个单词(当它可以一次性处理整个多行块时),但程序仍然非常快。
现在,如果我能弄清楚为什么随着单词的增长,它似乎想要更改单词中单个字母的字距调整...
关于.net DrawString/StringFormat 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3565171/