覆盖组件 class 中的表单 OnPaint 方法

Overriding a forms OnPaint method in component class

我希望重写我的组件的父窗体的 OnPaint 方法..

但是我在执行此操作时遇到了 2 个错误,第一个是分配父表单事件处理程序

  1. "OnPaint" 没有重载匹配委托 "PaintEventHandler"

  2. 无法使用实例引用访问来自 "Region.FromHrgn(IntPtr)" 的成员;用类型名称来限定它。

这是我的代码

    private Control hostControl;
    public override ISite Site
        {
            get { return base.Site; }
            set
            {
                base.Site = value;
                if (value == null)
                {
                    return;
                }

                IDesignerHost host = value.GetService(typeof(IDesignerHost)) as IDesignerHost;
                if (host != null)
                {
                    IComponent componentHost = host.RootComponent;
                    if (componentHost is ContainerControl)
                    {
                        hostControl = componentHost as ContainerControl;
                        hostControl.FindForm().Paint += new PaintEventHandler(this.OnPaint);
                    }
                }
            }
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            hostControl.Region = hostControl.Region.FromHrgn(CreateTriangle(0, 0, this.Width, this.Height, this.Width, this.Height));
        }

我哪里错了?

重写控件的 OnPaint() 方法通常推荐用于 THAT 控件的自定义绘制,而不是绘制另一个控件。您在代码中尝试做的是将宿主表单的 Paint 事件附加到控件的 OnPaint() 方法。这可能行不通。

如您在 MSDN 文档中所见,控件的 Paint 事件由 OnPaint() 方法引发。您可以附加自定义事件处理程序:

hostControl.FindForm().Paint += new PaintEventHandler(Form_Paint);

private void Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
  ...
}

PaintEventArgs 参数中,您将获得绘图所需的参数。