Метод TextBox OnPaint не вызывается?
Я использовал следующий код для создания текстового поля, но метод рисования не запускается в любой ситуации текстового поля. Можете ли вы предложить решение для запуска OnPaint()?
public class MyTextBox : TextBox
{
protected override void OnPaintBackground(PaintEventArgs pevent)
{
base.OnPaintBackground(pevent);
}
protected override void OnPaint(PaintEventArgs e)
{
ControlPaint.DrawBorder(e.Graphics,this.Bounds, Color.Red,ButtonBorderStyle.Solid);
base.OnPaint(e);
}
protected override void OnTextChanged(EventArgs e)
{
this.Invalidate();
this.Refresh();
base.OnTextChanged(e);
}
}
3 ответа
OnPaint не будет вызываться в TextBox по умолчанию, если вы не зарегистрируете его как элемент управления с самостоятельной росписью, сделав вызов:
SetStyle(ControlStyles.UserPaint, true);
например, из вашего конструктора MyTextBox.
Вы должны переключить вызовы в вашем OnPaint
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
ControlPaint.DrawBorder(e.Graphics, this.Bounds, Color.Red, ButtonBorderStyle.Solid);
}
base.OnPaint()
рисует TextBox
по-прежнему. Если вы позвоните DrawBorder
до base
вызов снова перезаписывается базовой реализацией.
Но согласно MSDN, Paint
событие не поддерживается TextBox
:
Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из вашего кода.
Происходит, когда элемент управления перерисовывается. Это событие не относится к этому классу.
Таким образом, ответ Бена Джекона должен решить эту проблему.
Я создал графический объект после того, как окно получилоWM_PAINT
сообщение.
С#
protected override void WndProc(ref Message m)
{
base.WndProc(m);
switch (m.Msg)
{
case WM_PAINT:
BackgroundText();
break;
}
}
private void BackgroundText()
{
if (DesignMode)
{
using (Graphics G = CreateGraphics())
{
TextRenderer.DrawText(G, "Project No.", new Font("Microsoft Sans Serif", 8.25), new Point(3, 1), Color.FromArgb(94, 101, 117));
}
return;
}
if (string.IsNullOrEmpty(Text))
{
using (Graphics G = CreateGraphics())
{
Color tColor = FindForm.ActiveControl == this ? Color.FromArgb(94, 101, 117) : SystemColors.Window;
TextRenderer.DrawText(G, "Project No.", new Font("Microsoft Sans Serif", 8.25), new Point(3, 1), tColor);
}
}
}
ВБ.НЕТ
Protected Overrides Sub WndProc(ByRef m As Message)
MyBase.WndProc(m)
Select Case m.Msg
Case WM_PAINT
BackgroundText()
End Select
End Sub
Private Sub BackgroundText()
If DesignMode Then
Using G As Graphics = CreateGraphics()
TextRenderer.DrawText(G, "Project No.", New Font("Microsoft Sans Serif", 8.25), New Point(3, 1), Color.FromArgb(94, 101, 117))
End Using
Return
End If
If String.IsNullOrEmpty(Text) Then
Using G As Graphics = CreateGraphics()
Dim tColor As Color = If(FindForm.ActiveControl Is Me, Color.FromArgb(94, 101, 117), SystemColors.Window)
TextRenderer.DrawText(G, "Project No.", New Font("Microsoft Sans Serif", 8.25), New Point(3, 1), tColor)
End Using
End If
End Sub