无法使用 Control.OnPaint 方法

Can't get Control.OnPaint method to work

我根本找不到类似的东西(基本上 so else 的每个问题总是语法问题)而且...,情况有点复杂。为了避免使用 500 行代码,我将对它的大部分内容进行描述:

我有一个作为父窗体的窗体 (MdiParent),另一个窗体是一个子窗体,但基本上是一个功能齐全的窗体。我在子窗体中使用了几个 OnPaint 方法, 工作得很好,父窗体 上的 3 个自定义按钮也有自己的 OnPaint 方法。这 3 个按钮(实际上是面板)和父窗体上的所有其他控件都包含在 PictureBox 中完全填充父窗体,并用于通过 TransparencyKey 使父窗体的背景透明/点击(没有找到任何其他这样做的方法)。

问题是父级上的每个 OnPaint 方法根本不起作用(它们正在执行但不绘制任何东西)。

这是一些代码,但这不是我要说的问题:

        this.myButtonObject1.BackColor = System.Drawing.Color.Red;
        this.myButtonObject1.Location = new System.Drawing.Point(840, 0);
        this.myButtonObject1.Name = "myButtonObject1";
        this.myButtonObject1.Size = new System.Drawing.Size(50, 50);
        this.myButtonObject1.TabIndex = 0;
        this.myButtonObject1.Click += new System.EventHandler(this.myButton1_Click);
        this.myButtonObject1.Paint += new System.Windows.Forms.PaintEventHandler(this.myButtonObject1_Paint);


    private void myButtonObject1_Paint(object sender, PaintEventArgs e)
    {
        Graphics g = e.Graphics;
        LinearGradientBrush lgb = new LinearGradientBrush(new PointF(0, 0), new PointF(myButtonObject1.Width, myButtonObject1.Height), Color.Green, Color.Lime);
        Pen p = new Pen(lgb, 5);
        g.DrawRectangle(p, myButtonObject1.Bounds);
        lgb.Dispose();
        p.Dispose();
    }

如果有人能告诉我;我做错了什么?

PS:我使用的是 .net 4.5,VS 2015,除了 TopMost FormBorderStyle ShowInTaskbar StartPosition 和ofc 颜色和 transparencyKey,但我认为这与此无关。

myButtonObject1.FlatStyle 设置为 FlatStyle.Standard

更新

您的代码中的小错误是使用 Panel's Bounds 属性,它在运行时将引用其 Parent 中的 Panel's Location!但是绘图代码必须是相对对象,而不是它的父对象!

所以不要使用Bounds而是ClientRectangle并确保设置正确PenAlignment:

using (LinearGradientBrush lgb = 
   new LinearGradientBrush(ClientRectangle, Color.Green, Color.Lime, 0f) ) //or some angle!
using (Pen p = new Pen(lgb, 5))
{
    p.Alignment = PenAlignment.Inset;
    g.DrawRectangle(p, ClientRectangle);
}