C# 在椭圆内正确显示文本
我需要在c#中正确显示绘制的椭圆内的文本,目前我使用的是以下内容C# 在椭圆内正确显示文本,c#,.net,winforms,system.drawing,C#,.net,Winforms,System.drawing,我需要在c#中正确显示绘制的椭圆内的文本,目前我使用的是以下内容 e.Graphics.DrawString(this.Text, base.Font, new SolidBrush(_NormalColorA), this.ClientRectangle, GetStringFormat(this.TextAlign)); GetStringFormat函数 static internal StringFormat GetStringFormat(ContentAlignment ctr
e.Graphics.DrawString(this.Text, base.Font, new SolidBrush(_NormalColorA), this.ClientRectangle, GetStringFormat(this.TextAlign));
GetStringFormat函数
static internal StringFormat GetStringFormat(ContentAlignment ctrlalign)
{
StringFormat strFormat = new StringFormat();
switch (ctrlalign)
{
case ContentAlignment.MiddleCenter:
strFormat.LineAlignment = StringAlignment.Center;
strFormat.Alignment = StringAlignment.Center;
break;
case ContentAlignment.MiddleLeft:
strFormat.LineAlignment = StringAlignment.Center;
strFormat.Alignment = StringAlignment.Near;
break;
case ContentAlignment.MiddleRight:
strFormat.LineAlignment = StringAlignment.Center;
strFormat.Alignment = StringAlignment.Far;
break;
case ContentAlignment.TopCenter:
strFormat.LineAlignment = StringAlignment.Near;
strFormat.Alignment = StringAlignment.Center;
break;
case ContentAlignment.TopLeft:
strFormat.LineAlignment = StringAlignment.Near;
strFormat.Alignment = StringAlignment.Near;
break;
case ContentAlignment.TopRight:
strFormat.LineAlignment = StringAlignment.Near;
strFormat.Alignment = StringAlignment.Far;
break;
case ContentAlignment.BottomCenter:
strFormat.LineAlignment = StringAlignment.Far;
strFormat.Alignment = StringAlignment.Center;
break;
case ContentAlignment.BottomLeft:
strFormat.LineAlignment = StringAlignment.Far;
strFormat.Alignment = StringAlignment.Near;
break;
case ContentAlignment.BottomRight:
strFormat.LineAlignment = StringAlignment.Far;
strFormat.Alignment = StringAlignment.Far;
break;
}
strFormat.HotkeyPrefix = System.Drawing.Text.HotkeyPrefix.None;
return strFormat;
}
在下面的图片中,您可以看到问题和预期,有什么想法吗
由于椭圆在几何上等同于线性缩放的圆,并且由于您的长轴和短轴始终与X轴和Y轴对齐,因此可以通过将椭圆的总宽度和高度乘以sqrt(2)/2来找到使文本可用区域最大化的内矩形 给定一个描述椭圆的矩形,此函数应该为文本计算正确的布局矩形:
private static RectangleF GetEllipseInnerRect(RectangleF ellipse) {
const float HalfSqrt2 = 0.707107f;
var innerSize = new SizeF(ellipse.Width * HalfSqrt2, ellipse.Height * HalfSqrt2);
return new RectangleF(
ellipse.Left + 0.5f * (ellipse.Width - innerSize.Width),
ellipse.Top + 0.5f * (ellipse.Height - innerSize.Height),
innerSize.Width,
innerSize.Height);
}
当矩形在椭圆外(相切,实际上)时,它正好可以位于一个位置。但是,如果您希望矩形位于内部,则有许多可能的矩形可以适应不同的宽度/高度。为了计算正确的坐标,您需要以某种方式约束解决方案。从设计上看,您希望将文本放置在1)外矩形对角线与椭圆的交点上2)椭圆X轴位于
((0,[椭圆高度]/2),([椭圆宽度],[椭圆高度]/2))
。左上角的点[P].X是外矩形宽度的~1/6,[P].Y是外矩形高度的~1/6。因此,[P]=(outer.width/6,outer.height/6)
(+图形中的偏移量(X,Y))。然后,内部矩形大小为(outer.width-[P].X*2,outer.height-[P].Y*2)
。然后,内部矩形是Offset.X+[P].X,Offset.Y+[P].Y,internal.Width,internal.Height
@RogerN最适合或最大适合的矩形