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

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

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

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

最佳答案

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);
}

关于c# - 如何确定给定固定宽度字体和最大宽度(以像素为单位)的最大字符数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1565263/

10-15 06:48