为什么我的自定义控件文本框的onpaint overided方法永远不会被调用?

时间:2016-09-06 09:12:31

标签: c# .net winforms textbox user-controls

我创建了一个自定义文本框,其边框为红色。然后我启动我的应用程序,但这个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的快照)?

1 个答案:

答案 0 :(得分:0)

您不应该创建新的Graphics对象。使用e.Graphics.DrawRectangle可以使用现有的Graphics对象绘制控件,如下所示:

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

另外,请在此重复我对残疾人旗帜的评论。添加自定义禁用标志毫无意义。使用Windows窗体TextBox控件已提供的Enabled属性。

编辑:请注意上述代码在TextBox的情况下无效,因为它处理的绘图方式不同。 TextBox基本上只是本机Win32 TextBox的包装器,所以你需要听一些告诉它重绘自己的消息。您还需要获取设备上下文的句柄并将其转换为托管的Graphics对象才能绘制。

请查看this article以获取有关如何在TextBox上绘制的代码和说明。特别是部分 2。绘制在页面底部的TextBox 上。