使用StringFormat的字符串的位置

时间:2014-10-02 04:21:42

标签: c# controls string-formatting

有没有办法在控件中获取绘制字符串的位置?我正在编写一个充当GroupBox的控件,当我绘制充当标题的字符串时,边界线会穿过它。 enter image description here

为了解决这个问题,我只是填充和矩形标题所在的背面颜色,所以标题似乎没有被触及。我的问题是标题的位置由StringFormat决定,我通过Graphics.DrawString()方法。我不必显式声明字符串的位置,但我必须显式声明矩形的位置,我不知道字符串的位置在哪里。

我应该怎么做?

1 个答案:

答案 0 :(得分:2)

我相信您可以使用MeasureCharacterRanges来准确衡量字符串位置

这是一个小样本:

进行测量的方法:

public static RectangleF MeasureStringBounds(Graphics graphics, string text, Font  font,RectangleF bounding, StringFormat format)
{
    var ranges =new[] {new CharacterRange(0, text.Length)};

    format.SetMeasurableCharacterRanges(ranges);

    var regions = graphics.MeasureCharacterRanges(text, font, bounding, format);
    var accurateBoundings = regions[0].GetBounds(graphics);

    return accurateBoundings;
}

用法:

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);

    var str = "hello";
    var format = new StringFormat {Alignment = StringAlignment.Center};

    e.Graphics.DrawString(str, Font, new SolidBrush(Color.Black), new Rectangle(0, 0, Width, Height), format);

    //measuring part
    var region = MeasureStringBounds(e.Graphics, str, Font, new RectangleF(0, 0, Width, Height), format);
    //Draw measured region
    e.Graphics.DrawRectangle(new Pen(Color.Red), region.X, region.Y, region.Width, region.Height);
}