【问题标题】:Override datetimepicker vb.net覆盖 datetimepicker vb.net
【发布时间】:2011-12-06 03:50:47
【问题描述】:

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

所以我尝试使用 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

【问题讨论】:

    标签: vb.net readonly datetimepicker onpaint overriding


    【解决方案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 覆盖。

    【讨论】:

    • 嗨,这项工作很棒!但是与“Dim g As Graphics = Graphics.FromHdc(m.WParam)”有什么区别。有没有性能提升?
    • @Naster WParam 不起作用。 WM_PAINT message 中没有使用它。
    猜你喜欢
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 2021-09-28
    • 2013-07-16
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多