使用对齐方式查找文本的边界矩形

时间:2015-12-10 09:14:15

标签: c# gdi+

我试图在标签周围绘制一个框,例如使用StringAlignment.Far对齐。我可以使用Size找到g.MeasureString的文字但我无法找到翻译原点的方法,以便找到一个绑定文本的Rectangle

说我有一个Point origin可以从中绘制,而StringFormat format表示我希望我的字符串具有哪个对齐方式。我可以使用Size找到字符串的g.MeasureString(text, font)。如何将此Point/Size对转换为与g.DrawString(text, font, brush, origin, format)调用重叠的矩形。

2 个答案:

答案 0 :(得分:1)

c转换为托管代码很困难。如果可用,您应该直接使用.Net代码。

对于MeasureString,请参阅链接Graphics.MeasureString Method

示例:

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

    Graphics g = e.Graphics;
    Font font = new Font("Arial", 16);
    SizeF sz = g.MeasureString("Text...", font);

    Rectangle rc = new Rectangle(0,0, (int)sz.Width, (int)sz.Height);
    Debug.WriteLine(rc.Width.ToString());
    Debug.WriteLine(rc.Height.ToString());

    //change top/left origin of rectangle
    rc.X = 10;
    rc.Y = 20;
}

您只需要文字的宽度和高度。您可以更改rectangle的左上角。

顺便说一句,C方法给出一个顶部/左侧坐标为零的矩形,因此它与Size

的信息相同

修改

这将使带有分词标记的文本适合宽度为100的矩形。矩形的高度未知。 TextRenderer.MeasureText会告诉我们矩形的高度。可以更改上/左角,可以更改对齐。

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

    Font font = new Font("Arial", 10);

    string text = "I'm trying to draw a box around a label which has been aligned.";
    Size layout = new Size(100, 0);

    Size sz = TextRenderer.MeasureText(e.Graphics, text, font, layout,
            TextFormatFlags.WordBreak);
    Rectangle rc = new Rectangle(new Point(0,0), sz);

    e.Graphics.DrawRectangle(Pens.Black, rc);
    TextRenderer.DrawText(e.Graphics, text, font, rc,
        SystemColors.ControlText, SystemColors.Control, TextFormatFlags.WordBreak);
}

答案 1 :(得分:0)

我的方法是使用 SetMeasurableCharacterRanges 来获取整个文本的区域。 考虑到 OnPaint:

protected override void OnPaint(PaintEventArgs e)
{
Graphics g = e.Graphics;
Font font = new Font("Arial", 16);
string text = "Border of this text";

StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Center;

RectangleF area = new RectangleF(0, 0, 246, 84);

sf.SetMeasurableCharacterRanges(new CharacterRange[] { new CharacterRange(0, text.Length) });
Region[] r = g.MeasureCharacterRanges(text, font, area, sf);

Rectangle rf = new Rectangle((int)r[0].GetBounds(g).X, (int)r[0].GetBounds(g).Y, (int)r[0].GetBounds(g).Width, (int)r[0].GetBounds(g).Height);

g.DrawString(text, font, Brushes.Black, area, sf);
g.DrawRectangle(new Pen(Color.Red, 1), rf);
}