Ни 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  
       }  
    }  
}  

код >

Однако кажется, что neiter Invalidate() или Refresh() вызывает вызов OnPaint (PaintEventArgs e). Два вопроса:

  • Почему он не работает?
  • Если он не может быть исправлен: я хочу только вызвать OnPaint (PaintEventArgs e), чтобы получить доступ к объекту e.Graphics - есть ли другой способ сделать это?

Ответ 1

Чтобы переопределить чертеж элемента управления, вы должны установить стиль UserPaint следующим образом:

this.SetStyle(ControlStyles.UserPaint, true);

См. это для получения дополнительной информации:

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

UserPaint Если true, то управляющая краска сам, а не система делает это. Если false, Paint событие не поднимается. Только этот стиль относится к классам, полученным из Управление.

Ответ 2

Изменить: прочитав комментарий Криса, я согласен, что вы, вероятно, не должны этого использовать.


Чтобы ответить на другую часть вопроса, вы можете получить графический объект для произвольного элемента управления с помощью:

 Graphics g = panel1.CreateGraphics();

Но при этом вы также несете ответственность за очистку, поэтому правильная форма:

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

Ответ 3

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

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