Ни Invalidate (), ни Refresh () не вызывают OnPaint () - PullRequest
11 голосов
/ 13 апреля 2010

Я пытаюсь перейти от строки № 1 к строке № 2 в следующем коде:

</p> <pre><code>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) для вызова. Два вопроса:

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

Ответы [ 3 ]

13 голосов
/ 13 апреля 2010

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

this.SetStyle(ControlStyles.UserPaint, true);

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

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

UserPaint Если true, элемент управления рисует сам, а не операционный Система делает это. Если ложь, краска событие не возбуждено. Только этот стиль относится к классам, полученным из Контроль.

3 голосов
/ 13 апреля 2010

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


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

 Graphics g = panel1.CreateGraphics();

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

  using (Graphics g = this.CreateGraphics())
  {
     // all your drawing here
  }
0 голосов
/ 13 апреля 2010
internal class MyTextBox : System.Windows.Forms.TextBox
{
    public MyTextBox()
    {
        this.SetStyle(ControlStyles.UserPaint, true);
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...