如何确定给定固定宽度字体和最大宽度(以像素为单位)的最大字符数

时间:2009-10-14 09:44:26

标签: c# .net gdi+

给定一些像素(例如:300)和一个字体(固定类型,固定大小,如Consolas),如何确定我可以使用 GDI + 绘制的最大字符数?

文本不会写入Label等,而是使用GDI +绘制:

public void DrawString( string s, Font font, Brush brush, 
    RectangleF layoutRectangle, StringFormat format );

但是我想在绘制之前执行某些文本操作,因此我想知道我可以安全输出的最大字符数。

7 个答案:

答案 0 :(得分:6)

System.Drawing.Graphics方法MeasureString使用一些额外像素填充字符串宽度(我不知道为什么),因此测量一个固定长度字符的宽度,然后将其除以可用的最大宽度会给出最大宽度的字符数估计得太低。

要获得最大字符数,您必须按照以下方式执行迭代:

using (Graphics g = this.CreateGraphics())
{
    string s = "";
    SizeF size;
    int numberOfCharacters = 0;
    float maxWidth = 50;
    while (true)
    {
        s += "a";
        size = g.MeasureString(s, this.Font);
        if (size.Width > maxWidth)
        {
            break;
        }
        numberOfCharacters++;
    }
    // numberOfCharacters will now contain your max string length
}

更新:您每天都会学到新东西。 Graphics.MeasureString(和TextRenderer)用一些额外的像素填充边界以容纳悬垂的字形。有道理,但它可能很烦人。参见:

http://msdn.microsoft.com/en-us/library/6xe5hazb.aspx

看起来更好的方法是:

using (Graphics g = this.CreateGraphics())
{
    g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
    SizeF size = g.MeasureString("a", this.Font, new PointF(0, 0), 
        StringFormat.GenericTypographic);
    float maxWidth = 50; // or whatever
    int numberOfCharacters = (int)(maxWidth / size.Width);
}

答案 1 :(得分:3)

还有TextRenderer.MeasureText(),它产生不同的结果(这是绘制窗口控件时使用的,因此通常更准确)。

关于它的某个地方有一个关于它的讨论,但我现在找不到它。

修改: This MSDN Article更深入一点。

答案 2 :(得分:1)

我阅读了几个网站并提出了解决方案,

using (System.Drawing.Graphics graphics = CreateGraphics())
{
    System.Drawing.Size size = TextRenderer.MeasureText(graphics, id, e.Appearance.Font);
    if (size.Width > e.Column.Width)
    {
        int charFit = (int)(((double)e.Column.Width / (double)size.Width) * (double)id.Length);
        if (id.Length - charFit + 2 < id.Length)
        {
            e.DisplayText = string.Format("{0}{1}","...", id.Substring(id.Length - charFit + 2));
        }
    }
}

我在DevExpress网格视图的CustomDrawCell事件中进行了此更改。 如果您发现此解决方案存在任何缺陷,请与我们联系。

答案 3 :(得分:0)

您可以使用Drawing.Graphics.MeasureString()来获取其中一个字形的大小 然后只需检查它们中有多少适合您的绘图区域。

答案 4 :(得分:0)

如果是固定宽度,为什么不使用floor(pixelcount / fontwidth)?

答案 5 :(得分:0)

我认为System.Drawing.Graphics.MeasureString()可以帮到你。您可以将它与MeasureCharacterRanges结合使用,或者测量一个字符的大小,然后将该值除以像素数。像这样的东西,你可以玩结果让它工作。我相信这将是有效的解决方案,所以请询问是否有不清楚的地方=)

答案 6 :(得分:0)

虽然这是一个迟到的回复,但我遇到了同样的问题。

我认为你问题的答案就在你的问题中。你提到的函数DrawString函数有自动修剪长字符串的功能。请查看文档http://msdn.microsoft.com/en-us/library/19sb1bw6.aspx

该函数将修剪字符串,使其适合布局矩形。您必须将作为参数传递的stringformat对象的修剪属性设置为非none。