Search code examples
delphidelphi-7datetimepickertypographymonthcalendar

BoldDays for TDateTimePicker?


I'm using Delphi7 and I'd like to bold some days of a TDateTimePicker control.

I've read that, originally, it's a descendant of TMonthCalendar, thus it should be possible.

I've also found some example code, but it's in C#: http://social.msdn.microsoft.com/Forums/en/winforms/thread/03527023-694d-41ab-bffb-18c59fca1fda

Please note that I don't want to use any third party DateTimePicker controls, I'd like to stay with the standard one.


Solution

  • You are both right and wrong :-)

    See: http://www.experts-exchange.com/Programming/System/Windows__Programming/MFC/Q_23927552.html

    You are right that you can't set BoldDays under XP. But you are wrong because under Vista/Win7 you can!

    Here is the modified code:

    procedure TForm1.DateTimePicker1DropDown(Sender: TObject);
    const
      DTM_GETMCSTYLE = (DTM_FIRST + 12);
      DTM_SETMCSTYLE = (DTM_FIRST + 11);
      MCS_NOTRAILINGDATES = $0040;
      MCS_SHORTDAYSOFWEEK = $0080;
      MCS_NOSELCHANGEONNAV = $0100;
    var
      monthCalHandle: THandle;
      boldDates: array[0..2] of integer;
      style, prevstyle: LResult;
    begin
      style := SendMessage(DateTimePicker1.Handle, DTM_GETMCSTYLE, 0, 0);
      style := style or MCS_DAYSTATE; //or MCS_NOSELCHANGEONNAV or MCS_WEEKNUMBERS;
      prevstyle := SendMessage(DateTimePicker1.Handle, DTM_SETMCSTYLE, 0, style);
    
      monthCalHandle := SendMessage(dateTimePicker1.Handle, DTM_GETMONTHCAL, 0, 0);
    
      boldDates[0]:=$5a5a5a;
      boldDates[1]:=$5a5a5a;
      boldDates[2]:=$5a5a5a;
      SendMessage(monthCalHandle, MCM_SETDAYSTATE, 3, integer(@boldDates));
    end;
    

    Note: be sure to add a vista manifest to the file because otherwise it won't work!

    The constants are from an updated commctrl.h file, found here: http://www.koders.com/cpp/fid6A6537D52B537D0920D7A760D2073F7B65ADE310.aspx?s=WM_CAP_DRIVER_CONNECT

    Thanks for the help, you lead me to the solution! :-)