代码之家  ›  专栏  ›  技术社区  ›  Bob Sammers 15ee8f99-57ff-4f92-890c-b56153

.net DrawString/StringFormat问题

  •  5
  • Bob Sammers 15ee8f99-57ff-4f92-890c-b56153  · 技术社区  · 15 年前

    我正在实现一个文本编辑控件,它使用DrawString()和StringFormat.generictyprographic格式(此后,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);
    
    1 回复  |  直到 15 年前
        1
  •  0
  •   Bob Sammers 15ee8f99-57ff-4f92-890c-b56153    15 年前

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

    我已经有了为每个单词计算边界框的代码(用于在控件中单击时计算插入符号的位置以及显示对齐的文本),因此我现在不是一次绘制整行,而是分别绘制每个单词。

    不停地打电话似乎很浪费 DrawString() 对于每个单词(当它可以一次性处理整个多行块时),但是程序仍然非常快。