2010-08-25 101 views
5

我正在开发一个.net 3.5 Win Forms程序,我遇到了一个“有趣”的文本绘图问题。.net DrawString/StringFormat问题

我正在实现一个文本编辑控件,它使用DrawString()和StringFormat.GenericTypographic(从此以后,GT)绘制文本。当用户键入时,该行中较早的整个单词(或一组单词)随机左右微妙地移动。

看起来很可能是四舍五入错误 - 受影响的块看起来会在字符添加到行的末尾时在水平面中移动一个像素。如果我使用StringFormat.GenericDefault(GD),这不会发生,但字符渲染不准确,这是不可接受的。

我推断我可以慢慢地将GD变成GT(每个设置在MSDN中讨论,显然可以在调试器中检查),并查看哪些FormatFlags或其他设置导致了这种情况。但是,如果我拿一份GD的副本,改变所有的属性,使它与GT完全相同,那么角色的位置就会大不相同 - 这两个被认为是相同的对象的行为显然是不一样的。

像太多事情恕我直言,.net反射器显示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); 
+0

你使用MeasureString()?通过该呼叫显示一个片段。 – 2010-08-25 11:21:04

+1

我不在这里使用MeasureString() - 我编辑了答案来显示我在做什么。 – 2010-08-25 11:36:33

回答

0

好了,我已经解决了这个问题。这不是我想要做的方式,但作为参考,我做了这样的:

我已经有代码来计算每个单词的边界框(用于在控制单击时计算插入位置并显示合理的文字),所以我不是一口气绘制整条线,而是单独绘制每个单词。

为每个单词连续呼叫DrawString()似乎很浪费(当它可以一次处理整个多行块时),但程序仍然非常快。

现在,如果我能明白为什么它似乎要改变,因为这个词的增长在单词中的各个字母字距...