如何删除 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