我试图在标签周围绘制一个框,例如使用StringAlignment.Far
对齐。我可以使用Size
找到g.MeasureString
的文字但我无法找到翻译原点的方法,以便找到一个绑定文本的Rectangle
。
说我有一个Point origin
可以从中绘制,而StringFormat format
表示我希望我的字符串具有哪个对齐方式。我可以使用Size
找到字符串的g.MeasureString(text, font)
。如何将此Point/Size
对转换为与g.DrawString(text, font, brush, origin, format)
调用重叠的矩形。
答案 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);
}