5

我正在做的是获取字符串的像素大小并将其转换为百分之一英寸(即像素/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;
}

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

Font myFont = new Font("Arial", <font size>, FontStyle.Regular, GraphicsUnit.Point);

我相信我必须使用GraphicsUnit.Point自定义控件,因为我正在绘制字符串,但有GraphicsUnit关系吗?

MeasureText功能是否正常工作,或者还有其他事情发生?

编辑

我正在绘制自定义打印预览控件。打印预览控件中的单位是“英寸/100”(因此进行了转换)。我相信文本、图像等是用打印机图形对象绘制的,但我并不完全确定。

4

3 回答 3

3

很久以前,我遇到了一个类似的问题,专门测量文本框内的文本。问题的关键在于:绘制文本有两种主要方式。Win32 API 和 System.Drawing。如果您尝试测量文本框中的文本,它将使用 Win32 API 进行绘制,您还需要使用 Win32 API 对其进行测量。如果您测量由 System.Drawing 绘制的文本,那么您使用 .net 进行的测量将匹配。

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

你没有说你具体测量了什么以及在哪里测量,所以这个答案甚至可能不适用。

于 2010-12-29T19:26:38.633 回答
0

选项会有所不同,字体越大,影响越大。这是最适合我们的设置 - 您的里程可能会有所不同。(代码很奇怪,因为我们在 J# 中使用它):

private static System.Drawing.StringFormat createStringFormat()
{

    System.Drawing.StringFormat fmt = new System.Drawing.StringFormat (System.Drawing.StringFormat.get_GenericTypographic());
    fmt.set_Trimming(System.Drawing.StringTrimming.None);
    fmt.set_FormatFlags(System.Drawing.StringFormatFlags.MeasureTrailingSpaces | System.Drawing.StringFormatFlags.NoWrap);
    return fmt;
}
于 2011-06-10T01:11:03.823 回答
0

字体提示。

Windows 使用的字体是有提示的,这意味着它们可能与字体指定的大小不完全相同。

http://blogs.msdn.com/b/cjacks/archive/2006/05/11/595525.aspx

于 2011-06-10T02:07:18.840 回答