Метод 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
Другие вопросы по тегам