From 9573840bcf042dda2d273d5c8f3c2bda27e89d01 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 26 Feb 2010 14:10:02 +0000 Subject: [PATCH] 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 --- src/msw/calctrl.cpp | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/msw/calctrl.cpp b/src/msw/calctrl.cpp index a429ae43fc..529209551f 100644 --- a/src/msw/calctrl.cpp +++ b/src/msw/calctrl.cpp @@ -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) ) + { + wxFAIL_MSG("unexpectedly few months shown in the control"); + } + else if ( nMonths == WXSIZEOF(states) ) { - wxLogLastError(wxT("MonthCal_SetDayState")); + // 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() -- 2.45.2