X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4b6a582bef796b43ad4cf0a96bd40bfd631460c6..9ab7ff537d1ead0f0b07c14841474203c7fa59ba:/src/msw/calctrl.cpp?ds=sidebyside diff --git a/src/msw/calctrl.cpp b/src/msw/calctrl.cpp index 842efa50c6..cf0de6e223 100644 --- a/src/msw/calctrl.cpp +++ b/src/msw/calctrl.cpp @@ -36,6 +36,27 @@ IMPLEMENT_DYNAMIC_CLASS(wxCalendarCtrl, wxControl) +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +namespace +{ + +// values of week days used by the native control +enum +{ + MonthCal_Monday, + MonthCal_Tuesday, + MonthCal_Wednesday, + MonthCal_Thursday, + MonthCal_Friday, + MonthCal_Saturday, + MonthCal_Sunday +}; + +} // anonymous namespace + // ============================================================================ // implementation // ============================================================================ @@ -85,7 +106,7 @@ wxCalendarCtrl::Create(wxWindow *parent, } else { - wxLogLastError(_T("GetClassInfoEx(SysMonthCal32)")); + wxLogLastError(wxT("GetClassInfoEx(SysMonthCal32)")); } } @@ -96,7 +117,7 @@ wxCalendarCtrl::Create(wxWindow *parent, if ( !MSWCreateControl(clsname, wxEmptyString, pos, size) ) return false; - // initialize the control + // initialize the control UpdateFirstDayOfWeek(); SetDate(dt.IsValid() ? dt : wxDateTime::Today()); @@ -166,6 +187,15 @@ wxCalendarCtrl::HitTest(const wxPoint& pos, wxDateTime::WeekDay *wd) { WinStruct hti; + + // Vista and later SDKs add a few extra fields to MCHITTESTINFO which are + // not supported by the previous versions, as we don't use them anyhow we + // should pretend that we always use the old struct format to make the call + // below work on pre-Vista systems (see #11057) +#ifdef MCHITTESTINFO_V1_SIZE + hti.cbSize = MCHITTESTINFO_V1_SIZE; +#endif + hti.pt.x = pos.x; hti.pt.y = pos.y; switch ( MonthCal_HitTest(GetHwnd(), &hti) ) @@ -190,7 +220,26 @@ wxCalendarCtrl::HitTest(const wxPoint& pos, case MCHT_CALENDARDAY: if ( wd ) { - *wd = static_cast(hti.st.wDayOfWeek); + int day = hti.st.wDayOfWeek; + + // the native control returns incorrect day of the week when + // the first day isn't Monday, i.e. the first column is always + // "Monday" even if its label is "Sunday", compensate for it + const int first = LOWORD(MonthCal_GetFirstDayOfWeek(GetHwnd())); + if ( first == MonthCal_Monday ) + { + // as MonthCal_Monday is 0 while wxDateTime::Mon is 1, + // normally we need to do this to transform from MSW + // convention to wx one + day++; + day %= 7; + } + //else: but when the first day is MonthCal_Sunday, the native + // control still returns 0 (i.e. MonthCal_Monday) for the + // first column which looks like a bug in it but to work + // around it it's enough to not apply the correction above + + *wd = static_cast(day); } return wxCAL_HITTEST_HEADER; @@ -218,7 +267,7 @@ bool wxCalendarCtrl::SetDate(const wxDateTime& dt) dt.GetAsMSWSysTime(&st); if ( !MonthCal_SetCurSel(GetHwnd(), &st) ) { - wxLogDebug(_T("DateTime_SetSystemtime() failed")); + wxLogDebug(wxT("DateTime_SetSystemtime() failed")); return false; } @@ -266,7 +315,7 @@ bool wxCalendarCtrl::SetDateRange(const wxDateTime& dt1, const wxDateTime& dt2) if ( !MonthCal_SetRange(GetHwnd(), flags, st) ) { - wxLogDebug(_T("MonthCal_SetRange() failed")); + wxLogDebug(wxT("MonthCal_SetRange() failed")); } return flags != 0; @@ -361,13 +410,15 @@ void wxCalendarCtrl::UpdateMarks() if ( !MonthCal_SetDayState(GetHwnd(), nMonths, states) ) { - wxLogLastError(_T("MonthCal_SetDayState")); + wxLogLastError(wxT("MonthCal_SetDayState")); } } void wxCalendarCtrl::UpdateFirstDayOfWeek() { - MonthCal_SetFirstDayOfWeek(GetHwnd(), HasFlag(wxCAL_MONDAY_FIRST) ? 0 : 6); + MonthCal_SetFirstDayOfWeek(GetHwnd(), + HasFlag(wxCAL_MONDAY_FIRST) ? MonthCal_Monday + : MonthCal_Sunday); } // ----------------------------------------------------------------------------