3

我有一个有趣的问题。我快到了,但很好奇其他人将如何解决它。我想在预定义的区域中显示一些多行文本。我不知道文本将是什么或区域有多大,因此必须通用编写该函数。您可以假设始终使用标准字体,但必须更改磅值。

假设您有一个函数,该函数将绘制在字符串参数中传递给它的文本。该函数有一个要在其中绘制的表单对象,并且还传递了一个矩形对象,该对象定义了表单上文本的边界区域。该函数需要在给定矩形中以适合的字体显示表单上的文本。对我来说,挑战是计算字体的大小,以使文本尽可能地适合文本,在具有最小空白的矩形中。

这两个方程可能有用:

float pixels = (points *dpi)/72f;
float points = (pixels*72f)/dpi);

还:

float dpi = CreateGraphics().DpiY;
4

3 回答 3

2

嗯,这很棘手。直接计算点大小是行不通的,文本的宽度取决于字体度量。二分搜索是一种显而易见的策略,但它在实践中行不通。真实类型的提示和自动换行会破坏它的稳定性。

我建议您从二分搜索开始,将 hi 和 lo 设置为合理的默认值,例如 72 和 6。然后当范围缩小到 5 点时,开始测试每个单独的点大小,直到找到适合的最大点。当你编写算法时,一定要确保你指望尺寸 N 适合但尺寸 N-1 不适合。

于 2010-09-24T19:01:05.220 回答
2

任何解决方案都存在一个重大问题,即您还需要根据宽度来确定这一点,这完全取决于字体。这意味着您需要根据预定义的磅值字体独立计算每个单词的宽度。当您更改点大小时,不能保证它是一致的。

如果您希望它准确,解决方案不会很快。

我建议选择两个点大小(比如 6 和 18)代表最小和中点到高点,并计算每个点大小中每个单词的像素宽度。然后,您可以计算两种大小的文本的面积。

然后,您可以推断出您认为合适的矩形区域,并使用基于文本长度的任意宽度/高度比来确定目标大小(宽度和高度)——例如,有一个最佳可读宽度。

然后,您将需要反复尝试在矩形内自动换行并在点大小上向后工作,直到文本适合矩形。

于 2010-09-24T19:02:44.550 回答
0

对点大小的二分搜索:从最大的可用点大小开始。如果它不适合,请尝试一半,...

于 2010-09-24T18:46:34.687 回答