+ wxCHECK_RET( day > 0 && day < 32, "invalid day" );
+
+ int mask = 1 << (day - 1);
+ if ( mark )
+ m_marks |= mask;
+ else
+ m_marks &= ~mask;
+
+ // calling Refresh() here is not enough to change the day appearance
+ UpdateMarks();
+}
+
+void wxCalendarCtrl::SetHoliday(size_t day)
+{
+ wxCHECK_RET( day > 0 && day < 32, "invalid day" );
+
+ m_holidays |= 1 << (day - 1);
+}
+
+void wxCalendarCtrl::UpdateMarks()
+{
+ // Currently the native control may show more than one month if its size is
+ // big enough. Ideal would be to prevent this from happening but there
+ // doesn't seem to be any obvious way to do it, so for now just handle the
+ // possibility that we can display several of them: one before the current
+ // one and up to 12 after it.
+ MONTHDAYSTATE states[14] = { 0 };
+ const DWORD nMonths = MonthCal_GetMonthRange(GetHwnd(), GMR_DAYSTATE, NULL);
+
+ // although in principle the calendar might not show any days from the
+ // preceding months, it seems like it always does, consider e.g. Feb 2010
+ // which starts on Monday and ends on Sunday and so could fit on 4 lines
+ // without showing any subsequent months -- the standard control still
+ // shows it on 6 lines and the number of visible months is still 3
+ //
+ // OTOH Windows 7 control can show all 12 months or even years or decades
+ // in its window if you "zoom out" of it by double clicking on free areas
+ // so the return value can be (much, in case of decades view) greater than
+ // 3 but in this case marks are not visible anyhow so simply ignore it
+ if ( nMonths >= 2 && nMonths <= WXSIZEOF(states) )
+ {
+ // The current, fully visible month is always the second one.
+ states[1] = m_marks | m_holidays;
+
+ if ( !MonthCal_SetDayState(GetHwnd(), nMonths, states) )
+ {
+ wxLogLastError(wxT("MonthCal_SetDayState"));
+ }
+ }
+ //else: not a month view at all
+}
+
+void wxCalendarCtrl::UpdateFirstDayOfWeek()
+{
+ MonthCal_SetFirstDayOfWeek(GetHwnd(),
+ HasFlag(wxCAL_MONDAY_FIRST) ? MonthCal_Monday
+ : MonthCal_Sunday);