You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#使用AddArc()方法异常及弧形文字置顶显示问题

问题1:Label调用AddArc()设置Region后消失

原因

Region对象需要基于闭合的路径边界计算控件的可见渲染区域,你创建的GraphicsPath仅添加了一段180度的开放圆弧,没有形成闭合图形,系统计算得到的有效可见区域为空,最终Label不会被渲染,表现为直接消失。

修复代码

给路径追加直线段闭合圆弧,形成有效的闭合区域即可:

GraphicsPath gp = new GraphicsPath();
Rectangle rec = new Rectangle(20, 20, 50, 100);
gp.AddArc(rec, 0 , 180);
// 连接圆弧两个端点,闭合为半圆区域
gp.AddLine(rec.Right, rec.Top + rec.Height/2, rec.Left, rec.Top + rec.Height/2);
label2.Region = new Region(gp);
label2.Invalidate();

问题2:自绘弧形文字被绿色圆形Panel遮挡

原因

你当前的弧形文字绘制逻辑写在父容器(窗体/容器控件)的OnPaint事件中,WinForm的控件绘制顺序为:先绘制父容器本身,再按Z顺序从下到上绘制所有子控件。你放在父容器里绘制的文字会在子控件(绿色圆形Panel)绘制之前完成渲染,后续Panel绘制时会直接覆盖下层的内容,导致文字被遮挡。

解决方法

二选一即可:

  • 方案1:移除独立的绿色圆形Panel,将绿色圆形的绘制逻辑合并到当前OnPaint方法中,严格遵循先画底层圆形,再画上层弧形文字的绘制顺序,后绘制的内容会自然显示在上层。注意把原来循环里无意义的透明圆弧绘制代码移到循环外,避免重复执行无效GDI调用。
  • 方案2:如果必须保留独立的Panel控件,就不要在父容器上绘制弧形文字,自定义一个专门显示弧形文字的用户控件:
    1. 给自定义控件添加透明背景支持,在控件构造函数中添加配置:
      SetStyle(ControlStyles.SupportsTransparentBackColor, true);
      BackColor = Color.Transparent;
      
    2. 把弧形文字的绘制逻辑移到自定义控件的OnPaint方法中
    3. 将自定义控件和绿色圆形Panel放在同一个父容器中,调用自定义控件的BringToFront()方法将其Z顺序调整到Panel上方,即可显示在圆形上层。

现有代码角度计算问题修正

你原有代码的角度计算逻辑有误,Math.Cos/Math.Sin方法接收弧度参数,原有计算方式会导致文字分布错位、挤在一起,可参考以下逻辑调整:

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    var center = new Point(Width / 2, Height / 2);
    var radius = Math.Min(Width, Height) / 3;
    var text = "Hello";
    var font = new Font(FontFamily.GenericSansSerif, 24, FontStyle.Bold);
    
    // 方案1可放开下方注释,直接绘制底层绿色圆形
    // e.Graphics.FillEllipse(Brushes.LimeGreen, center.X - radius, center.Y - radius, radius*2, radius*2);

    // 弧形文字总张开角度设为180度(π弧度),从正上方开始排列
    float totalSweep = (float)Math.PI;
    float startAngle = -(float)Math.PI / 2;
    for (var i = 0; i < text.Length; ++i)
    {
        var c = text[i].ToString();
        var size = e.Graphics.MeasureString(c, font);
        var charRadius = radius + size.Height / 2;
        // 均匀计算每个字符对应的弧度
        var angle = startAngle + totalSweep * i / (text.Length - 1);

        var x = (int)(center.X + Math.Cos(angle) * charRadius);
        var y = (int)(center.Y + Math.Sin(angle) * charRadius);

        e.Graphics.TranslateTransform(x, y);
        e.Graphics.RotateTransform((float)(90 + 360 * angle / (2 * Math.PI)));
        e.Graphics.DrawString(c, font, Brushes.Red, 0, 0);
        e.Graphics.ResetTransform();
    }
}

运行效果参考:
运行效果截图


内容的提问来源于stack exchange,提问作者user18974397

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 01:12:25