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





Согласно MSDN:
Setting the
BackColorhas no effect on the appearance of theDateTimePicker.
Вам нужно написать собственный элемент управления, расширяющий 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, и это указывает мне правильное направление.
Я пробовал это изменение в Vista (с визуальными стилями и без них), но это не сработало.
@Qua вы пытались вызвать myDTPicker.Invalidate () после установки цвета фона?
Также можете подтвердить, что это не работает в Win 7 с включенными визуальными стилями. Однако он работал без визуальных стилей. Для тестирования я сделал простой класс, наследующий от DateTimePicker, и скопировал / вставил код Вивека. Я заменил _backColor на Color.Blue, но поле никогда не было синим, когда были включены визуальные стили.
Любые предложения, как добиться того же для .NET Compact Framework (интеллектуальное устройство)? У нас там нет WndProc.
Итак, я опробовал приведенный выше код и также могу подтвердить, что он работает в Win 7, но только тогда, когда флажок «Включить визуальные стили XP» не установлен (VB.NET). Есть ли похожее сообщение Windows, которое я могу «перехватить» и которое позволяет мне изменить цвет текста? Я знаю код для рисования текста, и я пробовал перехватывать сообщения вроде WM_PAINT и WM_CTLCOLOR, но безрезультатно. Если у вас есть предложения, это было бы действительно здорово. Кстати, я попытался переопределить OnPaint, но не получил желаемых результатов (я не могу выбрать дату непосредственно в текстовой части элемента управления).
Полное отключение визуальных стилей для меня не вариант, поэтому я попытался специально отключить тему в элементе управления с помощью SetWindowTheme, но, похоже, это не имело никакого эффекта.
Существует бесплатная реализация, производная от DateTimePicker, которая позволяет изменять свойство BackColor при изменении.
См. Веб-сайт CodeProject: DateTimePicker с рабочим BackColor
Это полностью лоботомизированная версия, в которой вы можете использовать только раскрывающийся список календаря, чтобы выбрать дату.
На основе этого 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. Впрочем, хорошее решение.
отличная работа !!!!!
Извините, что пришлось так долго принимать. Я надеялся, что есть другие решения, которые не предполагают знания шестнадцатеричных значений, но забыл об этом.