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

如何使用派生自PaintEventArgs的AnglePaintEventArgs重写Paint事件处理器

解决方案

方案一:直接在窗体中维护角度变量(最简单)

不需要自定义EventArgs或派生Panel,直接在窗体类中添加存储角度的字段,在Paint事件处理方法中直接使用这个值即可,这是最简洁的实现方式:

public partial class Form1 : Form
{
    // 存储要绘制的角度
    private int _drawAngle = 0;

    public Form1()
    {
        InitializeComponent();
        panel1.Paint += panel1_Paint;
    }

    private void panel1_Paint(object sender, PaintEventArgs e)
    {
        // 使用_drawAngle执行绘制逻辑
        Graphics g = e.Graphics;
        int centerX = panel1.Width / 2;
        int centerY = panel1.Height / 2;
        int length = 50;
        double radian = _drawAngle * Math.PI / 180;
        int endX = centerX + (int)(length * Math.Cos(radian));
        int endY = centerY - (int)(length * Math.Sin(radian));
        g.DrawLine(Pens.Red, centerX, centerY, endX, endY);
    }

    // 示例:修改角度并触发重绘
    private void btnUpdateAngle_Click(object sender, EventArgs e)
    {
        _drawAngle += 30;
        panel1.Refresh();
    }
}

方案二:派生Panel并自定义事件(适合复杂场景)

如果确实需要通过自定义EventArgs传递参数,必须派生Panel类——因为原生Panel只会触发基于PaintEventArgs的Paint事件,无法直接触发自定义事件。具体实现步骤:

  1. 派生自定义Panel类,声明委托和事件:
public class AnglePanel : Panel
{
    // 自定义委托,参数为AnglePaintEventArgs
    public delegate void AnglePaintEventHandler(object sender, AnglePaintEventArgs e);

    // 自定义事件
    public event AnglePaintEventHandler AnglePaint;

    private int _angle = 0;
    public int Angle
    {
        get => _angle;
        set
        {
            _angle = value;
            Refresh(); // 角度变更时触发重绘
        }
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        // 创建自定义EventArgs并触发事件
        var angleArgs = new AnglePaintEventArgs(e.Graphics, e.ClipRectangle, _angle);
        AnglePaint?.Invoke(this, angleArgs);
    }
}

// 补充自定义EventArgs的公共属性,方便外部访问
public class AnglePaintEventArgs : PaintEventArgs
{
    public int Angle { get; }

    public AnglePaintEventArgs(Graphics graphic, Rectangle rectangle, int angle) 
        : base(graphic, rectangle)
    {
        Angle = angle;
    }
}
  1. 在窗体中使用自定义Panel并绑定事件:
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        var anglePanel = new AnglePanel();
        anglePanel.Dock = DockStyle.Fill;
        Controls.Add(anglePanel);

        // 绑定自定义事件
        anglePanel.AnglePaint += AnglePanel_AnglePaint;
        // 设置初始角度
        anglePanel.Angle = 45;
    }

    private void AnglePanel_AnglePaint(object sender, AnglePaintEventArgs e)
    {
        // 使用e.Angle执行绘制逻辑
        Graphics g = e.Graphics;
        var panel = (AnglePanel)sender;
        int centerX = panel.Width / 2;
        int centerY = panel.Height / 2;
        int length = 50;
        double radian = e.Angle * Math.PI / 180;
        int endX = centerX + (int)(length * Math.Cos(radian));
        int endY = centerY - (int)(length * Math.Sin(radian));
        g.DrawLine(Pens.Blue, centerX, centerY, endX, endY);
    }
}

原有写法无效的原因

  • 原生Panel的Paint事件由系统触发,传递的是PaintEventArgs实例,无法强制转换为AnglePaintEventArgs(实际对象类型不匹配)。
  • 你尝试的事件绑定写法存在语法错误:PaintEventHandler需要绑定符合签名的方法,而非直接传入EventArgs类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 11:47:46