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