Пользовательский элемент управления vb .NET, наследуемый от TextBox, не запускает событие Paint - PullRequest
3 голосов
/ 25 августа 2010

Мне нужен многострочный TextBox, который всегда отключен, но он не должен закрашиваться серым цветом, но я хочу сохранить выбранный дизайнером цвет.

Ранее у меня было то же требование с всегда черной меткой (без мультилинии), поэтому я унаследовал от метки:

Imports System.ComponentModel

   Public Class LabelDisabled
        Inherits Label

        Sub New()
            InitializeComponent()
            Enabled = False
        End Sub

        Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
            ' always draw it black
            e.Graphics.DrawString(Me.Text, Me.Font, Brushes.Black, 0, 0)
        End Sub

    End Class

Это прекрасно работает.Теперь мне нужно то же самое, но с многострочной меткой, поэтому я решил наследовать от TextBox:

Imports System.ComponentModel

Public Class CustomControl1
    Inherits TextBox

    Sub New()

        InitializeComponent()
        'Paint never fires anyway
        'Enabled = False
    End Sub


    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        Dim brush As New SolidBrush(Me.ForeColor)
        e.Graphics.DrawString(Me.Text, Me.Font, brush, 0, 0)
    End Sub

End Class

Теперь событие Paint никогда не запускается в элементе управления CustomControl1 - TextBox наследуется -.* Почему я не могу получить событие Paint?

Кроме того, если я хочу сделать свойство Enabled невидимым и не устанавливаемым пользователем, я делаю:

<Browsable(False),
DefaultValue(False)>
Public Overloads Property Enabled As Boolean
    Get
        Return False
    End Get
    Set(ByVal value As Boolean)
    End Set
End Property

Но этоКстати, я тоже не могу установить «реальное» свойство Enabled, я имею в виду поле поддержки.

Ответы [ 2 ]

4 голосов
/ 25 августа 2010

Я нашел решение. Похоже, TextBox отключает событие Paint даже для подклассов. Но вы можете заставить бит WM_PAINT вызывать SetStyle:

Public Class DisabledTextBox
    Inherits TextBox

    Public Sub New()
        InitializeComponent()

        Enabled = False
        SetStyle(ControlStyles.Selectable, False)
        SetStyle(ControlStyles.UserPaint, True)

    End Sub

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        Dim brush As New SolidBrush(Me.ForeColor)
        e.Graphics.DrawString(Me.Text, Me.Font, brush, 0, 0)
    End Sub

End Class

Работает отлично, как и ожидалось:)

0 голосов
/ 11 января 2012

вот ваш ответ:

Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
    MyBase.OnPaint(e)
    e.Graphics.FillRectangle(Brushes.LightGray, Me.DisplayRectangle)
    Dim sf As New StringFormat
    sf.FormatFlags = StringFormatFlags.NoWrap
    sf.HotkeyPrefix = Drawing.Text.HotkeyPrefix.Show 'if Mnemonic property is set to true
    sf.HotkeyPrefix = Drawing.Text.HotkeyPrefix.Hide 'or none if Mnemonic property is set to false
    sf.LineAlignment = StringAlignment.Center 'horizontal alignment
    sf.Alignment = StringAlignment.Center ' vertical ...
    Dim rect As Rectangle = Me.DisplayRectangle ' this is your text bounds for setting your text alignement using StringFormat(sf)
    e.Graphics.DrawString("Something", Me.Font, Brushes.DarkOliveGreen, rect, sf)
End Sub
...