This is an answer to a question in comments section of the following article (I can't otherwise find a link to simply respond to that question): A DateTimePicker with working BackColor, by Vincenzo Rossi.
I wanted to come up with a simpler solution that has no limitations. I hit the same problem and came to the same conclusions as in the original post. However I didn't like the limitations, namely that one couldn't directly edit the days/months/years in the control anymore. Then I found a great solution here:
Basically, you create a control inheriting from
DateTimePicker and add this override:
const int WM_ERASEBKGND = 0x14;
protected override void WndProc(ref System.Windows.Forms.Message m)
if(m.Msg == WM_ERASEBKGND)
Graphics g = Graphics.FromHdc(m.WParam);
g.FillRectangle(new SolidBrush(_backColor), ClientRectangle);
_backColor is the color of your choice...)
If you want to change the color, simply call the
Invalidate() method of your
DateTimePicker after changing
_backColor. To me, that works wonderful, without any limitations.