2014-10-02 57 views
2

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

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

我应该怎么办?

回答

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); 
} 
相关问题