如何继承PaintEventArgs创建自定义事件参数并传递表盘旋转角度?
解决方案
1. 修复AnglePaintEventArgs的CS7036错误
PaintEventArgs的构造函数要求必须传入Graphics和ClipRectangle参数,自定义子类时必须显式调用基类构造函数并传入这两个参数。正确实现如下:
public class AnglePaintEventArgs : PaintEventArgs { // 存储要传递的角度值 public double Angle { get; } // 调用基类构造函数,传入必要参数,同时初始化自定义的Angle属性 public AnglePaintEventArgs(Graphics graphics, Rectangle clipRectangle, double angle) : base(graphics, clipRectangle) { Angle = angle; } }
2. 自定义Panel控件实现带角度参数的绘制事件
原生Panel的Paint事件参数类型固定为PaintEventArgs,无法直接替换为自定义的AnglePaintEventArgs。因此需要自定义一个继承自Panel的控件,封装角度逻辑并提供自定义事件:
public class AnglePanel : Panel { // 自定义事件,用于传递包含角度的绘制参数 public event EventHandler<AnglePaintEventArgs> AnglePaint; private double _currentAngle; // 对外暴露角度属性,设置时自动触发重绘 public double CurrentAngle { get => _currentAngle; set { _currentAngle = value; Invalidate(); } } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); // 触发自定义事件,将原生PaintEventArgs的参数和当前角度一起传递 AnglePaint?.Invoke(this, new AnglePaintEventArgs(e.Graphics, e.ClipRectangle, CurrentAngle)); } }
3. 使用自定义控件并绑定事件
在窗体中使用AnglePanel控件,绑定自定义的AnglePaint事件,直接从事件参数中获取角度进行绘制:
private void anglePanel1_AnglePaint(object sender, AnglePaintEventArgs e) { if (_showGraphic) { Point center = new Point(75, 75); // 使用using自动释放GDI+资源,避免内存泄漏 using (Pen myPen = new Pen(Brushes.Red, 30)) { // 从事件参数中获取角度,注意:Math.Cos/Sin接受弧度,若使用度数需转换:e.Angle * Math.PI / 180 double angle = e.Angle; int x_end = Convert.ToInt32(Math.Cos(angle) * 75); int y_end = Convert.ToInt32(Math.Sin(angle) * 75); Point endPoint = new Point(x_end + center.X, y_end + center.Y); e.Graphics.FillEllipse(Brushes.Yellow, 0, 0, center.X * 2, center.Y * 2); e.Graphics.DrawLine(myPen, center, endPoint); } } } // 绑定事件(可在窗体设计器或构造函数中执行) this.anglePanel1.AnglePaint += anglePanel1_AnglePaint;
4. 更新角度的方式
只需设置AnglePanel的CurrentAngle属性,控件会自动触发重绘:
// 示例:设置角度为π/2弧度(90度) anglePanel1.CurrentAngle = Math.PI / 2;
内容的提问来源于stack exchange,提问作者autoguider
相关产品推荐
相关产品推荐

