查找对齐文本的边框
本文关键字:边框 文本 对齐 查找 | 更新日期: 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);
}