Delphi - TDateTimePicker kiegészítése a hetek sorszámával

forráskód letöltése
A TMonthCalendar komponensnek van egy WeekNumbers property-je, amivel a hetek sorszámának megjelenítését kapcsolhatjuk ki és be. A TDateTimePicker komponensnél ez a property hiányzik, ennek ellenére egy kis trükkel megoldható, hogy a legördülő TMonthCalendar komponensben is láthatóak legyenek ezek a számok. A feladat megoldásához a TDateTimePicker komponens OnDropDown eseményét használjuk fel.
Első lépésben egy DTM_GETMONTHCAL üzenetet küldünk a komponensnek a SendMessage függvénnyel. Ez eredményül visszaadja a TMonthCalendar azonosítóját (Handle), vagy 0-t, ha nem sikerült a művelet.
  mh:=SendMessage(DateTimePicker1.Handle, DTM_GETMONTHCAL, 0, 0);
Ezután a GetWindowLong függvénnyel lekérdezzük a TMonthCalendar beállításait egy változóba, majd az MCS_WEEKNUMBERS konstanst hozzáadjuk az értékhez, és a SetWindowLong függvénnyel beállítjuk az új stílust.
    wl:=GetWindowLong(mh, GWL_STYLE);
    wl:=wl or MCS_WEEKNUMBERS;
    SetWindowLong(mh, GWL_STYLE, wl);
A hetek sorszámai a MointhCalendar bal szélén jelennek meg, eltolva egy kicsit a többi értéket. Éppen ezért a komponens méretét egy kicsit szélesebbre állítjuk, hogy minden elférjen benne:
    SendMessage(mh, MCM_GETMINREQRECT, 0, integer(@r));
    MoveWindow(mh, 0, 0, r.Right+4, r.Bottom, True);
Az MCM_GETMINREQRECT függvénnyel lekérdezzük egy TRect típusú struktúrába a jelenlegi méretet, majd a MoveWindow függvénnyel beállítjuk az újat. Ez 4 pixellel lesz szélesebb az eredetinél.