如何删除 DateTimePicker 控件的边框?
How to remove the border of a DateTimePicker Control?
是否可以去除DateTimePicker的边框?
因为我正在尝试使其无边框设计。
一个使用派生自 DateTimePicker 的自定义控件的示例。
它添加了一些 public 属性,允许更改控件边框的颜色和样式。
BorderColor
设置边框的颜色。它默认为 Color.Transparent
.
BorderStyle
设置边框样式(实线、点线、虚线等)。它默认为 Solid
.
BorderColorUseBackColor
是一个开关,用于将BorderColor
属性设置为Control的BackColor
值。当设置为 True
时,BorderColor
无法更改。但是,值集会被缓存,并且会在 属性 设置为 False
. 时设置
要绘制由这些属性定义的边框,控件会覆盖 WndProc to handle the WM_PAINT message and draws a custom Border using the standard ControlPaint.DrawBorder() 方法。
如果要隐藏控件的边框,只需设置BorderColorUseBackColor = True
即可(如前所述,BorderColor
固定为控件的BackColor
, 因此它不可见).
Imports System.ComponentModel
Imports System.Drawing
Imports System.Windows.Forms
<DesignerCategory("Code"), ToolboxItem(True)>
Public Class DateTimePickerEx
Inherits DateTimePicker
Const WM_PAINT As Integer = &HF
Private m_BorderStyle As ButtonBorderStyle = ButtonBorderStyle.Solid
Private m_BorderColor As Color = Color.Transparent
Private m_CurrentBorderColor As Color = Color.Transparent
Private m_UseBackColor As Boolean = False
<DefaultValue(GetType(Color), "Transparent")>
Public Property BorderColor As Color
Get
Return m_BorderColor
End Get
Set
If m_UseBackColor Then
m_CurrentBorderColor = Value
Return
End If
If m_BorderColor <> Value Then
m_BorderColor = Value
Invalidate()
End If
End Set
End Property
<DefaultValue(GetType(ButtonBorderStyle), "Solid")>
Public Property BorderStyle As ButtonBorderStyle
Get
Return m_BorderStyle
End Get
Set
If m_BorderStyle <> Value Then
m_BorderStyle = Value
Invalidate()
End If
End Set
End Property
<DefaultValue(GetType(Boolean), "False")>
Public Property BorderColorUseBackColor As Boolean
Get
Return m_UseBackColor
End Get
Set
If Value Then
m_CurrentBorderColor = m_BorderColor
BorderColor = BackColor
m_UseBackColor = Value
Else
m_UseBackColor = Value
BorderColor = m_CurrentBorderColor
End If
End Set
End Property
Protected Overrides Sub WndProc(ByRef m As Message)
MyBase.WndProc(m)
Select Case m.Msg
Case WM_PAINT
If IsHandleCreated Then
Using g = Graphics.FromHwndInternal(Me.Handle)
ControlPaint.DrawBorder(g, ClientRectangle, m_BorderColor, m_BorderStyle)
End Using
m.Result = IntPtr.Zero
End If
End Select
End Sub
End Class
是否可以去除DateTimePicker的边框?
因为我正在尝试使其无边框设计。
一个使用派生自 DateTimePicker 的自定义控件的示例。
它添加了一些 public 属性,允许更改控件边框的颜色和样式。
BorderColor
设置边框的颜色。它默认为Color.Transparent
.BorderStyle
设置边框样式(实线、点线、虚线等)。它默认为Solid
.BorderColorUseBackColor
是一个开关,用于将BorderColor
属性设置为Control的BackColor
值。当设置为True
时,BorderColor
无法更改。但是,值集会被缓存,并且会在 属性 设置为False
. 时设置
要绘制由这些属性定义的边框,控件会覆盖 WndProc to handle the WM_PAINT message and draws a custom Border using the standard ControlPaint.DrawBorder() 方法。
如果要隐藏控件的边框,只需设置BorderColorUseBackColor = True
即可(如前所述,BorderColor
固定为控件的BackColor
, 因此它不可见).
Imports System.ComponentModel
Imports System.Drawing
Imports System.Windows.Forms
<DesignerCategory("Code"), ToolboxItem(True)>
Public Class DateTimePickerEx
Inherits DateTimePicker
Const WM_PAINT As Integer = &HF
Private m_BorderStyle As ButtonBorderStyle = ButtonBorderStyle.Solid
Private m_BorderColor As Color = Color.Transparent
Private m_CurrentBorderColor As Color = Color.Transparent
Private m_UseBackColor As Boolean = False
<DefaultValue(GetType(Color), "Transparent")>
Public Property BorderColor As Color
Get
Return m_BorderColor
End Get
Set
If m_UseBackColor Then
m_CurrentBorderColor = Value
Return
End If
If m_BorderColor <> Value Then
m_BorderColor = Value
Invalidate()
End If
End Set
End Property
<DefaultValue(GetType(ButtonBorderStyle), "Solid")>
Public Property BorderStyle As ButtonBorderStyle
Get
Return m_BorderStyle
End Get
Set
If m_BorderStyle <> Value Then
m_BorderStyle = Value
Invalidate()
End If
End Set
End Property
<DefaultValue(GetType(Boolean), "False")>
Public Property BorderColorUseBackColor As Boolean
Get
Return m_UseBackColor
End Get
Set
If Value Then
m_CurrentBorderColor = m_BorderColor
BorderColor = BackColor
m_UseBackColor = Value
Else
m_UseBackColor = Value
BorderColor = m_CurrentBorderColor
End If
End Set
End Property
Protected Overrides Sub WndProc(ByRef m As Message)
MyBase.WndProc(m)
Select Case m.Msg
Case WM_PAINT
If IsHandleCreated Then
Using g = Graphics.FromHwndInternal(Me.Handle)
ControlPaint.DrawBorder(g, ClientRectangle, m_BorderColor, m_BorderStyle)
End Using
m.Result = IntPtr.Zero
End If
End Select
End Sub
End Class