永远不会调用OnPaint覆盖

时间:2010-02-07 00:42:11

标签: c# winforms

我已经在这几天了,这让我很生气。我有一个继承自System.Windows.Forms.Panel的控件,我试图覆盖OnPaint。它很简单,直截了当地说它。

public class CollapsiblePanel : System.Windows.Forms.Panel
{
  public CollapsiblePanel()
  {
   //
   // Required for the Windows Form Designer
   //
   InitializeComponent();

   //
   // TODO: Add any constructor code after InitializeComponent call
   //
   SetStyle
    (
     ControlStyles.AllPaintingInWmPaint | 
     ControlStyles.UserPaint      | ControlStyles.DoubleBuffer   |
     ControlStyles.ResizeRedraw     | ControlStyles.Selectable ,
     true
    );
        }

  protected override void OnPaint(PaintEventArgs e)
  {
            // This never runs no matter what I try!
            base.OnPaint(e);
        }
}

3 个答案:

答案 0 :(得分:20)

当我尝试覆盖OnPaint时,我对ProgressBar也有同样的问题。它永远不会被调用。


我在这里找到了解决方案:http://web.archive.org/web/20140214234801/http://osix.net/modules/article/?id=826

您必须创建一个构造函数并启用用户绘画,如下所示:

SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw, true);

默认值可能因框架版本和操作系统而异。

答案 1 :(得分:1)

如果要拨打this.Invalidate()

,请致电OnPaint

答案 2 :(得分:0)

我遇到了没有看到它有时会运行的问题。但这在Windows 7 x64,.NET Framework 4.0上运行 RIGHT AWAY 。只需将其添加到表单中。

class Class1 : Panel
{
    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        Console.WriteLine("hello world, I'm painting myself");
        // Process.Start("notepad.exe");
    }
}

如果看不到控制台输出,请尝试Process.Start(...)行。