Bob*_*ers 5 .net system.drawing winforms
我正在开发一个.NET 3.5赢形式的程序和我碰到与文本绘制一个"有趣"的问题.
我正在实现一个文本编辑控件,它使用DrawString()和StringFormat.GenericTypographic(以下称为GT)绘制文本.当用户键入时,行中较早的单词(或单词组)随机地左右移动.
它似乎可能是舍入误差 - 受影响的块看起来在水平平面中移动一个像素,因为字母被添加到线的末端.如果我使用StringFormat.GenericDefault(GD),则不会发生这种情况,但字符渲染的准确性会降低,这是不可接受的.
我推断我可以慢慢地将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);
Run Code Online (Sandbox Code Playgroud)
嗯,我已经解决了这个问题。这不是我想要的方式,但作为参考,我这样做了:
我已经有了计算每个单词的边界框的代码(用于计算单击控件时的插入符号位置并显示对齐的文本),因此我现在不是一次性绘制整条线,而是单独绘制每个单词。
不断地调用每个单词似乎很浪费DrawString()(当它可以一次性处理整个多行块时),但程序仍然非常快。
现在,如果我能弄清楚为什么它似乎想要随着单词的增长而改变单词中各个字母的字偶距......
| 归档时间: |
|
| 查看次数: |
788 次 |
| 最近记录: |