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

Mar*_*ini 4 .net c# gdi+

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

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

public void DrawString( string s, Font font, Brush brush, 
    RectangleF layoutRectangle, StringFormat format );
Run Code Online (Sandbox Code Playgroud)

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

Mus*_*sis 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
}
Run Code Online (Sandbox Code Playgroud)

更新:你每天都学到新东西.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);
}
Run Code Online (Sandbox Code Playgroud)