覆盖组件类

时间:2017-08-23 11:58:00

标签: c# winforms winforms-interop

我希望覆盖我的组件的父窗体的OnPaint方法..

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

  1. “OnPaint”没有重载符合委托“PaintEventHandler”

  2. 无法使用实例引用访问“Region.FromHrgn(IntPtr)”中的成员;请改为使用类型名称进行限定。

  3. 继承我的代码

        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));
            }
    

    我哪里错了?

1 个答案:

答案 0 :(得分:0)

通常建议覆盖控件的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参数中,您将获得绘图所需的参数。