.net DrawString/StringFormat 问题

标签 .net winforms system.drawing

我正在开发 .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/

相关文章:

.net - Elasticsearch .net NEST - DeleteByQuery 不起作用但搜索相同的查询有效

c# - C# 中的/= 运算符有什么作用?

c# - 计算winforms TextBox控件中显示行数的最准确方法

c# - Bitmap.Save 保存一个图标实际上保存了一个.png

c# - 类继承与多态——绘制简单形状

C# - 将 PointF 转换为 Point

c# - Thread、Task 和 async/await 关键字之间的区别

c# - 支持 .Net 中的脚本

c# - ListView 帮助..(Windows 窗体)

c# - 为特定应用程序禁用 Windows 10 缩放