【问题标题】:Neither Invalidate() nor Refresh() invokes OnPaint()Invalidate() 和 Refresh() 都不会调用 OnPaint()
【发布时间】:2011-02-07 08:23:14
【问题描述】:

我试图在下面的代码中从第 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  
       }  
    }  
}  

但是,似乎 Invalidate() 和 Refresh() 都不会导致调用 OnPaint(PaintEventArgs e)。两个问题:

  1. 为什么不起作用?
  2. 如果无法修复:我只想调用 OnPaint(PaintEventArgs e) 以访问 e.Graphics 对象 - 还有其他方法吗?

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

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

    this.SetStyle(ControlStyles.UserPaint, true);
    

    更多信息请参见:

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

    UserPaint 如果为 true,则控件绘制 本身而不是操作 系统这样做。如果为假,则油漆 未引发事件。只有这种风格 适用于派生自的类 控制。

    【讨论】:

      【解决方案2】:
      internal class MyTextBox : System.Windows.Forms.TextBox
      {
          public MyTextBox()
          {
              this.SetStyle(ControlStyles.UserPaint, true);
          }
      
          protected override void OnPaint(PaintEventArgs e)
          {
              base.OnPaint(e);
          }
      }
      

      【讨论】:

        【解决方案3】:

        编辑:阅读 Chris 的评论后,我同意您可能不应该使用它。


        要回答问题的另一部分,您可以通过以下方式获取任意控件的图形对象:

         Graphics g = panel1.CreateGraphics();
        

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

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

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-22
        • 2011-11-18
        • 1970-01-01
        • 1970-01-01
        • 2018-07-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多