覆盖datetimepicker vb.net

时间:2011-10-12 13:40:46

标签: vb.net readonly datetimepicker onpaint overrides

我想覆盖datetimepicker对象以在属性_clearOnDisabled为true时删除texte。当_readOnly属性为true时,我想以黑色显示文本而不是灰色。

所以我尝试使用WndProc,但我似乎每个对象都通过我的函数而不仅仅是我的datetimepicker。当我输入WM_PAINT消息时,我得到100%的CPU。我也尝试覆盖OnPaint,但它没有进入。

帮助

Imports System.Drawing
Imports System.Windows.Forms
Imports DTP.WindowsMessages

Public Class DTP
    Inherits System.Windows.Forms.DateTimePicker

    Private _readOnly As Boolean = False
    Private _clearOnDisabled As Boolean = True
    Private _backColorReadOnly As Color = MyBase.BackColor

    Public Sub New()
        MyBase.New()
    End Sub

    Public Overrides Property BackColor() As Color
        Get
            Return MyBase.BackColor
        End Get
        Set(ByVal Value As Color)
            MyBase.BackColor = Value
            If Not _readOnly Then
                Me.Invalidate()
            End If
        End Set
    End Property

    Protected Overrides Sub WndProc(ByRef m As Message)
        Select Case m.Msg
            Case WM_ERASEBKGND
                Dim g As Graphics = Graphics.FromHdc(m.WParam)
                Dim backBrush As SolidBrush

                If _readOnly Then
                    backBrush = New SolidBrush(_backColorReadOnly)
                    g.FillRectangle(backBrush, Me.ClientRectangle)
                Else
                    backBrush = New SolidBrush(MyBase.BackColor)
                    g.FillRectangle(backBrush, Me.ClientRectangle)
                End If
                g.Dispose()
            Case WM_LBUTTONDOWN, WM_KEYDOWN
                If Not _readOnly Then
                    MyBase.WndProc(m)
                End If

                'Case WM_PAINT ', WM_NCPAINT, WM_DRAWITEM
                '    If Not _clearOnDisabled Then
                '        MyBase.WndProc(m)
                '    End If

            Case Else
                MyBase.WndProc(m)
        End Select
    End Sub

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        If Not _clearOnDisabled Then
            MyBase.OnPaint(e)
        End If
    End Sub

    Protected Overrides Sub OnPaintBackground(ByVal pevent As System.Windows.Forms.PaintEventArgs)
        MyBase.OnPaintBackground(pevent)
    End Sub

    Public Property [ReadOnly]() As Boolean
        Get
            Return _readOnly
        End Get
        Set(ByVal Value As Boolean)
            _readOnly = Value
            Me.Invalidate()
        End Set
    End Property

    Public Property BackColorReadOnly() As Color
        Get
            Return _backColorReadOnly
        End Get
        Set(ByVal Value As Color)
            _backColorReadOnly = Value
            If _readOnly Then
                Me.Invalidate()
            End If
        End Set
    End Property

End Class

1 个答案:

答案 0 :(得分:1)

不要吃油漆信息,而是在它之后涂漆:

Case WM_PAINT
  MyBase.WndProc(m)
  If _clearOnDisabled Then
    Dim dc As IntPtr = GetWindowDC(Me.Handle)
    Using g As Graphics = Graphics.FromHdc(dc)
      g.FillRectangle(SystemBrushes.Window, New Rectangle(SystemInformation.Border3DSize.Width, _
                                                            SystemInformation.Border3DSize.Height, _
                                                            Me.ClientSize.Width - SystemInformation.VerticalScrollBarWidth, _
                                                            Me.ClientSize.Height))
    End Using
    ReleaseDC(Me.Handle, dc)
  End If

你可以摆脱你的OnPaint,OnPaintBackground覆盖。