图形的C#字符串长度

图形的C#字符串长度,c#,graphics,C#,Graphics,我正在开发一个类似Word的程序。为此,我需要将字符串写入相同的“行”,并且我还希望能够以不同的格式设置每个单词/字母/句子,控制颜色、大小、字体等 所以我必须计算一个字符串的像素长度和高度,把它们排成一行。但是函数(Graphics)MeasureString存在一个问题,该函数将额外的长度放在字符串的前后。此函数还存在一些空白问题 我尝试了不同的StringFormatter,但每次它们返回的长度太长或不够 是否存在在图形对象上写入不同格式字符串的函数或计算字符串的精确像素长度的函数?Mea

我正在开发一个类似Word的程序。为此,我需要将字符串写入相同的“行”,并且我还希望能够以不同的格式设置每个单词/字母/句子,控制颜色、大小、字体等

所以我必须计算一个字符串的像素长度和高度,把它们排成一行。但是函数
(Graphics)MeasureString
存在一个问题,该函数将额外的长度放在字符串的前后。此函数还存在一些空白问题

我尝试了不同的StringFormatter,但每次它们返回的长度太长或不够


是否存在在
图形
对象上写入不同格式字符串的函数或计算字符串的精确像素长度的函数?

MeasureString是解决此问题的正确方法。
请看这面底部的样本,因为我认为没有其他方法。

测量是解决此问题的正确方法。
请看一看此侧底部的示例,因为我想说没有其他方法。

首先,这是一个需要正确解决的相当棘手的问题-您最好尝试找到一个现有控件(例如)来解决此问题

也就是说,如果你真的想这样做,那么这或多或少是解决这个问题的正确方法,但是如果你看一下,你会发现你看到的行为是故意的

该方法设计用于单个字符串 并在字符串前后包含少量额外空间 以允许悬垂图示符。此外,该方法还可以进行调整 glyph指向优化显示质量,并可能显示字符串 比测量报告的窄。获取合适的度量标准 用于布局中的相邻字符串(例如,在实现 格式化文本),请使用以下方法之一: 测量方法需要一个、一个和一个过程 . 此外,确保 是

所以在我看来,你应该改用

下面是我准备的一个示例,它以两种不同的颜色呈现一些文本。要试用,只需将其粘贴到新表单中即可

protected override void OnPaint(PaintEventArgs e)
{
    // This is where we wish to print our string
    var region = new RectangleF(50, 50, 200, 50);

    // This is the font we wish to use
    var font = new Font("Times New Roman", 16.0F);

    // Draw a string for comparison
    DrawString(e.Graphics, "RedBlack", font, Brushes.Black, new RectangleF(50, 150, 200, 50));

    // Draw the first string and keep a track of the Region it was rendered in
    var first = DrawString(e.Graphics, "Red", font, Brushes.Red, region);

    // Adjust the region we wish to print 
    region = new RectangleF(region.X + first.GetBounds(e.Graphics).Width, region.Y, region.Width, region.Height);

    // Draw the second string
    DrawString(e.Graphics, "Black", font, Brushes.Black, region);

    base.OnPaint(e);
}

private Region DrawString(Graphics g, string s, Font font, Brush brush, RectangleF layoutRectangle)
{
    var format = new StringFormat();
    format.SetMeasurableCharacterRanges(new[] { new CharacterRange(0, s.Length) });

    g.DrawString(s, font, brush, layoutRectangle, format);
    return g.MeasureCharacterRanges(s, font, layoutRectangle, format)[0];
}
这就是它看起来的样子

请注意,您需要小心剪裁-默认情况下,GDI会将渲染文本“包装”到新行上,但是这将不再起作用,您将得到类似的结果


此外,如果您尝试使用不同的字体/字体大小打印文本,则这些字体的“底部”不会与您期望的位置对齐。请尝试查看一些有关如何处理此问题的提示。

首先,这是一个需要正确解决的相当棘手的问题-您最好尝试找到一个现有控件(例如)来解决此问题

也就是说,如果你真的想这样做,那么这或多或少是解决这个问题的正确方法,但是如果你看一下,你会发现你看到的行为是故意的

该方法设计用于单个字符串 并在字符串前后包含少量额外空间 以允许悬垂图示符。此外,该方法还可以进行调整 glyph指向优化显示质量,并可能显示字符串 比测量报告的窄。获取合适的度量标准 用于布局中的相邻字符串(例如,在实现 格式化文本),请使用以下方法之一: 测量方法需要一个、一个和一个过程 . 此外,确保 是

所以在我看来,你应该改用

下面是我准备的一个示例,它以两种不同的颜色呈现一些文本。要试用,只需将其粘贴到新表单中即可

protected override void OnPaint(PaintEventArgs e)
{
    // This is where we wish to print our string
    var region = new RectangleF(50, 50, 200, 50);

    // This is the font we wish to use
    var font = new Font("Times New Roman", 16.0F);

    // Draw a string for comparison
    DrawString(e.Graphics, "RedBlack", font, Brushes.Black, new RectangleF(50, 150, 200, 50));

    // Draw the first string and keep a track of the Region it was rendered in
    var first = DrawString(e.Graphics, "Red", font, Brushes.Red, region);

    // Adjust the region we wish to print 
    region = new RectangleF(region.X + first.GetBounds(e.Graphics).Width, region.Y, region.Width, region.Height);

    // Draw the second string
    DrawString(e.Graphics, "Black", font, Brushes.Black, region);

    base.OnPaint(e);
}

private Region DrawString(Graphics g, string s, Font font, Brush brush, RectangleF layoutRectangle)
{
    var format = new StringFormat();
    format.SetMeasurableCharacterRanges(new[] { new CharacterRange(0, s.Length) });

    g.DrawString(s, font, brush, layoutRectangle, format);
    return g.MeasureCharacterRanges(s, font, layoutRectangle, format)[0];
}
这就是它看起来的样子

请注意,您需要小心剪裁-默认情况下,GDI会将渲染文本“包装”到新行上,但是这将不再起作用,您将得到类似的结果

此外,如果您尝试使用不同的字体/字体大小打印文本,则这些字体的“底部”不会与您期望的位置对齐。尝试查看一些关于如何处理的提示。

查看方法“备注”-它解释了额外间距(悬垂图示符)&注意,
MeasureCharacterRanges
用于精确布局计算。查看方法“备注”-它解释了额外间距(悬垂图示符)&注意,
MeasureCharacterRanges
是用于精确布局计算的内容。