Изменение цвета фона DateTimePicker в .NET

В .NET (по крайней мере, в версии 2008 года, а может быть, и в 2005 году) изменение свойства BackColor для DateTimePicker абсолютно не влияет на внешний вид. Как изменить цвет фона текстовой области, а не раскрывающегося календаря?

Редактировать: Я говорил о формах Windows, а не об ASP.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
15
0
42 225
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Согласно MSDN:

Setting the BackColor has no effect on the appearance of the DateTimePicker.

Вам нужно написать собственный элемент управления, расширяющий 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);
}

Извините, что пришлось так долго принимать. Я надеялся, что есть другие решения, которые не предполагают знания шестнадцатеричных значений, но забыл об этом.

Daniel H 05.01.2009 21:47

Спасибо тебе за этот пост. Я настраиваю элемент управления DateTimePicker, и это указывает мне правильное направление.

Chris Porter 14.02.2009 01:33

Я пробовал это изменение в Vista (с визуальными стилями и без них), но это не сработало.

Phil Wright 16.02.2009 08:53

@Qua вы пытались вызвать myDTPicker.Invalidate () после установки цвета фона?

Vivek 30.10.2009 23:37

Также можете подтвердить, что это не работает в Win 7 с включенными визуальными стилями. Однако он работал без визуальных стилей. Для тестирования я сделал простой класс, наследующий от DateTimePicker, и скопировал / вставил код Вивека. Я заменил _backColor на Color.Blue, но поле никогда не было синим, когда были включены визуальные стили.

James Johnston 09.08.2011 22:45

Любые предложения, как добиться того же для .NET Compact Framework (интеллектуальное устройство)? У нас там нет WndProc.

Sumeet 12.10.2011 12:04

Итак, я опробовал приведенный выше код и также могу подтвердить, что он работает в Win 7, но только тогда, когда флажок «Включить визуальные стили XP» не установлен (VB.NET). Есть ли похожее сообщение Windows, которое я могу «перехватить» и которое позволяет мне изменить цвет текста? Я знаю код для рисования текста, и я пробовал перехватывать сообщения вроде WM_PAINT и WM_CTLCOLOR, но безрезультатно. Если у вас есть предложения, это было бы действительно здорово. Кстати, я попытался переопределить OnPaint, но не получил желаемых результатов (я не могу выбрать дату непосредственно в текстовой части элемента управления).

ProtoNoob 06.12.2014 02:15

Полное отключение визуальных стилей для меня не вариант, поэтому я попытался специально отключить тему в элементе управления с помощью SetWindowTheme, но, похоже, это не имело никакого эффекта.

Nyerguds 24.05.2016 14:03

Существует бесплатная реализация, производная от DateTimePicker, которая позволяет изменять свойство BackColor при изменении.

См. Веб-сайт CodeProject: DateTimePicker с рабочим BackColor

Это полностью лоботомизированная версия, в которой вы можете использовать только раскрывающийся список календаря, чтобы выбрать дату.

Nyerguds 13.05.2016 13:40

На основе этого CodeProject: DateTimePicker с рабочим 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

* Обратите внимание, что этот класс упрощен, поэтому его функциональность ограничена.

Это работает даже в Windows 7. Но это меняет внешний вид DatetimePicker из-за Combobox. Впрочем, хорошее решение.

LuckyLuke82 22.11.2017 16:42

отличная работа !!!!!

Nikolaos Polygenis 01.12.2020 18:13

Другие вопросы по теме