有没有办法在控件中获取绘制字符串的位置?我正在编写一个充当GroupBox的控件,当我绘制充当标题的字符串时,边界线会穿过它。
为了解决这个问题,我只是填充和矩形标题所在的背面颜色,所以标题似乎没有被触及。我的问题是标题的位置由StringFormat决定,我通过Graphics.DrawString()方法。我不必显式声明字符串的位置,但我必须显式声明矩形的位置,我不知道字符串的位置在哪里。
我应该怎么做?
答案 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);
}