为什么TextRenderer.MeasureText无法在C#中使用较大的字体正确测量文本?

Mik*_*ebb 5 c# drawing text measurement

我正在做的是获取字符串的像素大小并将其转换为百分之一英寸(即像素/ DPI =英寸,英寸*100 =百分之一英寸).这是我的代码:

private static SizeF TextSize(string text, Font txtFnt)
{
    SizeF txtSize = new SizeF();

    // The size returned is 'Size(int width, int height)' where width and height
    // are the dimensions of the string in pixels
    Size s = System.Windows.Forms.TextRenderer.MeasureText(text, txtFnt);

    // Value based on normal DPI settings of 96
    txtSize.Width = (float)Math.Ceiling((float)s.Width / 96f * 100f); 
    txtSize.Height = (float)Math.Ceiling((float)s.Height / 96f * 100f);

    return txtSize;
}
Run Code Online (Sandbox Code Playgroud)

现在,使用Arial字体,这对于小于12的字体都可以正常工作,但之后字符开始被切断,因为计算出的尺寸小于实际尺寸.我知道我的DPI设置设置为96.我的字体定义与字体大小的变化相同:

Font myFont = new Font("Arial", <font size>, FontStyle.Regular, GraphicsUnit.Point);
Run Code Online (Sandbox Code Playgroud)

我相信我必须使用,GraphicsUnit.Point因为我正在绘制字符串的自定义控件,但GraphicsUnit事情呢?

MeasureText功能甚至正常工作,或有别的事?

编辑

我正在绘制自定义打印预览控件.打印预览控件中的单位为"英寸/ 100"(因此转换).我相信文本,图像等是用Printer图形对象绘制的,但我不完全确定.

hov*_*ova 3

很久以前,我遇到了类似的问题,特别是测量文本框中的文本。问题的关键在于:绘制文本有两种主要方法。Win32 API 和 System.Drawing。如果您尝试测量文本框中的文本,它将使用 Win32 API 进行绘制,并且您还需要使用 Win32 API 来测量它。如果您测量由 System.Drawing 绘制的文本,则使用 .net 的测量结果将匹配。

基本上,表单文本框使用 Win32 API 进行布局和绘制,并且测量也需要来自 Win32。

您没有具体说明您在测量什么以及在哪里测量,因此这个答案可能不适用。