查找对齐文本的边框

本文关键字:边框 文本 对齐 查找 | 更新日期: 2023-09-27 18:26:20

例如,我正试图在使用StringAlignment.Far对齐的标签周围绘制一个方框。我可以用g.MeasureString找到文本的Size,但我找不到一种翻译原点的方法,这样我就可以找到一个约束文本的Rectangle

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

查找对齐文本的边框

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

对于MeasureString,请参见链接图形。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;
}

你只需要文本的宽度和高度。您可以更改矩形的左/上角。

顺便说一下,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);
}

我的方法是使用SetMeasureableCharacterRanges来获取整个文本的区域。考虑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);
}