C# 如何计算字体的点大小,以使其最适合预定义区域?

C# 如何计算字体的点大小,以使其最适合预定义区域?,c#,graphics,fonts,font-size,dpi,C#,Graphics,Fonts,Font Size,Dpi,我有一个有趣的问题。我就快到了,但我很好奇其他人会如何应对。我想在预定义区域中显示一些多行文字。我不知道文本是什么,也不知道区域有多大,所以函数必须一般地编写。您可以假设始终使用标准字体,但点大小是必须更改的 假设您有一个函数,该函数将绘制以字符串参数形式传递给它的文本。该函数有一个要绘制的表单对象,还传递了一个矩形对象,用于定义表单上文本的边界区域。函数需要在给定的矩形中以合适的大字体显示表单上的文本。我面临的挑战是如何计算字体的大小,以使文本尽可能地适合矩形中最小的空白 这两个方程式可能有用

我有一个有趣的问题。我就快到了,但我很好奇其他人会如何应对。我想在预定义区域中显示一些多行文字。我不知道文本是什么,也不知道区域有多大,所以函数必须一般地编写。您可以假设始终使用标准字体,但点大小是必须更改的

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

这两个方程式可能有用:

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


点大小的二进制搜索:
从可用的最大点大小开始。如果不合适,试一半,…

好吧,这很棘手。直接计算点大小是行不通的,文本的宽度取决于字体度量。二进制搜索是一种明显的策略,但在实践中无法奏效。真正的类型暗示和单词包装合谋破坏了它的稳定性


我建议您从二进制搜索开始,将hi和lo设置为合理的默认值,如72和6。然后,当范围缩小到5个点时,开始测试每个点的大小,直到找到适合的最大点。编写算法时,请确保使用适合的大小N,但不适合的大小N-1。

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

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

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

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


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

您如何确定“适合”?哇,看看迄今为止的建议,我没有意识到最后一点会如此反复!如果我们假设文本没有被包装呢。硬回车会将多行分隔开,因此我们只需担心最长的行的宽度。如果我们不考虑换行怎么办。我们假设换行符将线分开,没有一条线会延伸到矩形之外。重要的是首先计算宽度,并且在计算后不要更改它,然后可以使用宽度限制线的长度,并最终得到一个(可能)额外一到两行高的矩形。它并不总是看起来很好,但报纸专栏使用了仔细计算的列宽,以允许最大的可读性。请选择字母或A4比例的矩形(约1.3:1)。此外,字宽数组将有助于快速迭代解决方案。不允许换行会更容易吗?是的,二进制搜索失败的可能性要小得多。但由于暗示而不是零。当范围小于1点时停止搜索。
float dpi = CreateGraphics().DpiY;