Fix assert when using year or decade view in Windows 7 calendar control.

Windows 7 native calendar control is capable of showing more than 3 months
simultaneously in its year or decade view which is shown when the user zooms
out of the month view by double clicking the control header. This resulted in
an assert failure in the code, update it to simply not do anything in this
view.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63561 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2010-02-26 14:10:02 +00:00
parent 6331afb053
commit 9573840bcf

View File

@ -403,22 +403,33 @@ void wxCalendarCtrl::UpdateMarks()
// before it and from the one after it so days from 3 different months can
// be partially shown
MONTHDAYSTATE states[3] = { 0 };
const int nMonths = MonthCal_GetMonthRange(GetHwnd(), GMR_DAYSTATE, NULL);
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
wxCHECK_RET( nMonths == (int)WXSIZEOF(states), "unexpected months range" );
// the fully visible month is the one in the middle
states[1] = m_marks | m_holidays;
if ( !MonthCal_SetDayState(GetHwnd(), nMonths, states) )
//
// 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 < WXSIZEOF(states) )
{
wxLogLastError(wxT("MonthCal_SetDayState"));
wxFAIL_MSG("unexpectedly few months shown in the control");
}
else if ( nMonths == WXSIZEOF(states) )
{
// the fully visible month is the one in the middle
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()