Override datetimepicker vb.net
I would like to overrides the datetimepicker object to remove the texte when the property _clearOnDisabled is true. When _readOnly property is true, I would like to show the text in black not gray.
So I tried with WndProc but I seem that every single object go through my function not only my datetimepicker. I get 100% CPU when I put the WM_PAINT message. I also tried to overrides the OnP开发者_运维技巧aint but its not getting in.
Thx for the help
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
Don't eat the paint message, but paint after it:
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
You can get rid of your OnPaint, OnPaintBackground overrides.
精彩评论