为什么我的自定义控件textbox'的onpaint overrides方法从未被调用

本文关键字:方法 overrides 调用 onpaint 自定义控件 我的 textbox 为什么 | 更新日期: 2023-09-27 18:05:53

我已经创建了一个自定义的文本框,边框为红色。然后我启动我的应用程序,但这个OnPaint从未被调用。

我的代码是:

public partial class UserControl1 : TextBox
    {
        public string disable, disableFlag;
        public string Disable 
        { 
            get 
            { 
                return disable;
            } 
            set 
            { 
                disable = value;
                disableFlag = disable;
                //OnPaint(PaintEventArgs.Empty);
            } 
        }
        public UserControl1()
        {
            InitializeComponent();
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            this.Text = "testing 1";
            if (disable == "true")
            {
                Pen redPen = new Pen(Color.Red);
                Graphics graphics = this.CreateGraphics();
                graphics.DrawRectangle(redPen, this.Location.X,
                              this.Location.Y, this.Width, this.Height);
                //  base.DrawFrame(e.Graphics);
            }
        }
    }

请让我知道是什么问题(这里是winform http://prntscr.com/ceq7x5的快照)?

为什么我的自定义控件textbox'的onpaint overrides方法从未被调用

你不应该创建一个新的图形对象。使用e.Graphics.DrawRectangle可以使用已经存在的图形对象在控件上绘制,如下所示:

Pen redPen = new Pen(Color.Red);
e.Graphics.DrawRectangle(redPen, this.Location.X,
                          this.Location.Y, this.Width, this.Height);

同样,在这里重复一下我关于禁用标志的评论。添加自定义禁用标志是没有意义的。使用Windows窗体文本框控件已经提供的Enabled属性。

编辑:请注意,上面的代码不工作在TextBox的情况下,因为它处理绘图不同。TextBox基本上只是本机Win32 TextBox的包装器,所以你需要听取相当多的消息,告诉它重新绘制自己。你还需要获得设备上下文的句柄,并将其转换为能够绘图的托管图形对象。

查看这篇文章,了解如何在TextBox顶部绘制的代码和解释。特别是2部分。在页面底部文本框上绘图