gpt4 book ai didi

.net DrawString/StringFormat 问题

转载 作者:行者123 更新时间:2023-12-03 17:59:54 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com