繁体   English   中英

在 .NET 中更改 DateTimePicker 的背景颜色

[英]Changing the background color of a DateTimePicker in .NET

.NET (至少在 2008 版本中,也可能在 2005 中),更改DateTimePickerBackColor属性对外观绝对没有影响。 如何更改文本区域的背景颜色,而不是下拉日历的背景颜色?

编辑:我说的是 Windows 窗体,而不是 ASP。

根据MSDN

设置BackColorDateTimePicker的外观没有影响。

您需要编写一个扩展DateTimePicker的自定义控件。 重写BackColor属性和WndProc方法。

无论何时更改BackColor ,都不要忘记调用myDTPicker.Invalidate()方法。 这将强制使用指定的新颜色重新绘制控件。

const int WM_ERASEBKGND = 0x14;
protected override void WndProc(ref System.Windows.Forms.Message m)
{
    if(m.Msg == WM_ERASEBKGND)
    {
        using(var g = Graphics.FromHdc(m.WParam))
        {
            using(var b = new SolidBrush(_backColor))
            {
                g.FillRectangle(b, ClientRectangle);
            }
        }
        return;
    }

    base.WndProc(ref m);
}

有一个从DateTimePicker派生的免费实现,它允许您在更改时更改BackColor属性。

请参阅 CodeProject 网站: DateTimePicker with Working BackColor

基于此 CodeProject: A DateTimePicker with Working BackColor (如上所示),我重写了一个自定义 datepicker 类(在 VB.NET 中),它允许自定义背景颜色、TextColor 和出现在下拉按钮旁边的小图像。

例如1:

在此处输入图片说明

例2:

在此处输入图片说明

要使其工作,只需使用以下代码在您的项目中创建一个新类并重新构建解决方案。
一个名为MyDateTimePicker的新控件现在应该出现在工具箱列表中:

Public Class MyDateTimePicker 
    Inherits System.Windows.Forms.DateTimePicker
    Private _disabled_back_color As Color
    Private _image As Image
    Private _text_color As Color = Color.Black

    Public Sub New()
        MyBase.New()
        Me.SetStyle(ControlStyles.UserPaint, True)
        _disabled_back_color = Color.FromKnownColor(KnownColor.Control)
    End Sub

    ''' <summary>
    '''     Gets or sets the background color of the control
    ''' </summary>
    <Browsable(True)>
    Public Overrides Property BackColor() As Color
        Get
            Return MyBase.BackColor
        End Get
        Set
            MyBase.BackColor = Value
        End Set
    End Property

    ''' <summary>
    '''     Gets or sets the background color of the control when disabled
    ''' </summary>
    <Category("Appearance"), Description("The background color of the component when disabled")>
    <Browsable(True)>
    Public Property BackDisabledColor() As Color
        Get
            Return _disabled_back_color
        End Get
        Set
            _disabled_back_color = Value
        End Set
    End Property

    ''' <summary>
    '''     Gets or sets the Image next to the dropdownbutton
    ''' </summary>
    <Category("Appearance"),
    Description("Get or Set the small Image next to the dropdownbutton")>
    Public Property Image() As Image
        Get
            Return _image
        End Get
        Set(ByVal Value As Image)
            _image = Value
            Invalidate()
        End Set
    End Property

    ''' <summary>
    '''     Gets or sets the text color when calendar is not visible
    ''' </summary>
    <Category("Appearance")>
    Public Property TextColor As Color
        Get
            Return _text_color
        End Get
        Set(value As Color)
            _text_color = value
        End Set
    End Property


    Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs)
        Dim g As Graphics = Me.CreateGraphics()
        g.TextRenderingHint = Drawing.Text.TextRenderingHint.ClearTypeGridFit

        'Dropdownbutton rectangle
        Dim ddb_rect As New Rectangle(ClientRectangle.Width - 17, 0, 17, ClientRectangle.Height)
        'Background brush
        Dim bb As Brush

        Dim visual_state As ComboBoxState

        'When enabled the brush is set to Backcolor, 
        'otherwise to color stored in _disabled_back_Color
        If Me.Enabled Then
            bb = New SolidBrush(Me.BackColor)
            visual_state = ComboBoxState.Normal
        Else
            bb = New SolidBrush(Me._disabled_back_color)
            visual_state = ComboBoxState.Disabled
        End If

        'Filling the background
        g.FillRectangle(bb, 0, 0, ClientRectangle.Width, ClientRectangle.Height)

        'Drawing the datetime text
        g.DrawString(Me.Text, Me.Font, New SolidBrush(TextColor), 5, 2)

        'Drawing icon
        If Not _image Is Nothing Then
            Dim im_rect As New Rectangle(ClientRectangle.Width - 40, 4, ClientRectangle.Height - 8, ClientRectangle.Height - 8)
            g.DrawImage(_image, im_rect)
        End If

        'Drawing the dropdownbutton using ComboBoxRenderer
        ComboBoxRenderer.DrawDropDownButton(g, ddb_rect, visual_state)

        g.Dispose()
        bb.Dispose()
    End Sub
End Class

*注意这个类是简化的,所以它的功能有限

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM