Saltar al contenido

Cambiar el color de fondo de un DateTimePicker en .NET

Solución:

Según MSDN:

Establecer el BackColor no tiene ningún efecto sobre la apariencia de la DateTimePicker.

Necesita escribir un control personalizado que se extienda DateTimePicker. Anular el BackColor propiedad y la WndProc método.

Siempre que cambie el BackColor, no olvides llamar al myDTPicker.Invalidate() método. Esto obligará al control a volver a dibujar utilizando el nuevo color especificado.

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);
}

Existe una implementación gratuita derivada de DateTimePicker que te permite cambiar BackColor propiedad en cambio.

Consulte el sitio web de CodeProject: DateTimePicker con trabajar BackColor

Basado en este CodeProject: A DateTimePicker con BackColor funcional (como se publicó arriba) He reescrito una clase de datepicker personalizada (en VB.NET) que permite personalizar el color de fondo, TextColor y la pequeña imagen que aparece junto al botón desplegable.

Ejemplo 1:

ingrese la descripción de la imagen aquí

Ejemplo 2:

ingrese la descripción de la imagen aquí

Para que funcione, simplemente cree una nueva clase en su proyecto con el siguiente código y reconstruya la solución.
Un nuevo control llamado MyDateTimePicker ahora debería aparecer en la lista de la caja de herramientas:

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

* Tenga en cuenta que esta clase está simplificada, por lo que tiene una funcionalidad limitada

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *