Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net DrawString/StringFormat问题_.net_Winforms_System.drawing - Fatal编程技术网

.net DrawString/StringFormat问题

.net DrawString/StringFormat问题,.net,winforms,system.drawing,.net,Winforms,System.drawing,我正在开发一个.NET3.5WinForms程序,在文本绘制方面遇到了一个“有趣”的问题 我正在实现一个文本编辑控件,它使用DrawString()和StringFormat.GenericTypographic(此后为GT)绘制文本。当用户输入时,行中前面的整个单词(或一组单词)会微妙地随机左右移动 这似乎可能是舍入错误-当字母添加到线条末端时,受影响的块看起来会在水平面上移动一个像素。如果我使用StringFormat.GenericDefault(GD),这不会发生,但字符的渲染精度较低,

我正在开发一个.NET3.5WinForms程序,在文本绘制方面遇到了一个“有趣”的问题

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

这似乎可能是舍入错误-当字母添加到线条末端时,受影响的块看起来会在水平面上移动一个像素。如果我使用StringFormat.GenericDefault(GD),这不会发生,但字符的渲染精度较低,这是不可接受的

我推断我可以慢慢地将GD更改为GT(每个设置在MSDN中讨论,显然可以在调试器中检查),然后查看是哪个FormatFlags或其他设置导致了这种情况,并从那里开始。但是,如果我复制一个GD,更改所有属性,使其与GT相同,字符的位置是完全不同的-这两个假定相同的对象的行为显然是不同的

与IMHO中的许多内容一样,.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()
(当它可以一次性处理整个多行块时),这似乎是浪费,但程序仍然非常快

现在,如果我能弄明白为什么它似乎想随着单词的增长而改变单词中单个字母的字距…

您使用MeasureString()吗?显示该调用的一个片段。我在这里不使用MeasureString()-我编辑了答案以显示我在做什么。