问题 Invalidate()和Refresh()都不会调用OnPaint()


我试图从以下代码中的第1行到第2行:

using System;  
using System.Windows.Forms;  

namespace MyNameSpace  
{  
    internal class MyTextBox : System.Windows.Forms.TextBox  
    {  
        protected override void OnEnabledChanged(EventArgs e)  
        {  
            base.OnEnabledChanged(e);  
            Invalidate(); // Line #1 - can get here  
            Refresh();  
        }

       protected override void OnPaint(PaintEventArgs e)  
       {
            base.OnPaint(e);   
            System.Diagnostics.Debugger.Break(); // Line #2 - can't get here  
       }  
    }  
}  


11904
2018-04-13 08:15


起源



答案:


要覆盖控件的绘图,必须将样式设置为UserPaint,如下所示:

this.SetStyle(ControlStyles.UserPaint, true);

有关更多信息,请参阅此

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.setstyle.aspx

UserPaint如果为true,则控件绘制   本身而不是经营   系统这样做。如果为false,则为Paint   事件没有提出。这种风格而已   适用于派生自的类   控制。


13
2018-04-13 08:19



非常感谢,SLC!我这是接受的答案。 - user181813


答案:


要覆盖控件的绘图,必须将样式设置为UserPaint,如下所示:

this.SetStyle(ControlStyles.UserPaint, true);

有关更多信息,请参阅此

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.setstyle.aspx

UserPaint如果为true,则控件绘制   本身而不是经营   系统这样做。如果为false,则为Paint   事件没有提出。这种风格而已   适用于派生自的类   控制。


13
2018-04-13 08:19



非常感谢,SLC!我这是接受的答案。 - user181813


编辑:在阅读克里斯的评论后,我同意你可能不应该使用这个。


要回答问题的其他部分,您可以使用以下命令获取任意控件的图形对象:

 Graphics g = panel1.CreateGraphics();

但是,当你这样做时,你也有责任清理它,所以正确的形式是:

  using (Graphics g = this.CreateGraphics())
  {
     // all your drawing here
  }

3
2018-04-13 08:45



但是应该不应该这样做。检查此链接: bobpowell.net/creategraphics.htm - Chris Dunaway


internal class MyTextBox : System.Windows.Forms.TextBox
{
    public MyTextBox()
    {
        this.SetStyle(ControlStyles.UserPaint, true);
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
    }
}

0
2018-04-13 08:25