Native month calendar functions doesn't always return correct values in the
time part of SYSTEMTIME so ignore it and use just the date component.
To simplify doing it, add helper (MSW-specific) SetFromMSWSysDate() and
GetAsMSWSysDate() functions which convert between wxDateTime and SYSTEMTIME
but take only date component into account.
This commit partially replaces changes of r63560 and closes #11276.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@64208
c3d73ce0-8a6f-49c7-b76d-
6d57e0e08775
// SYSTEMTIME format
// ------------------------------------------------------------------------
#ifdef __WXMSW__
// SYSTEMTIME format
// ------------------------------------------------------------------------
#ifdef __WXMSW__
// convert SYSTEMTIME to wxDateTime
// convert SYSTEMTIME to wxDateTime
- wxDateTime& SetFromMSWSysTime(const struct _SYSTEMTIME&);
+ wxDateTime& SetFromMSWSysTime(const struct _SYSTEMTIME& st);
// convert wxDateTime to SYSTEMTIME
// convert wxDateTime to SYSTEMTIME
- void GetAsMSWSysTime(struct _SYSTEMTIME*) const;
+ void GetAsMSWSysTime(struct _SYSTEMTIME* st) const;
+
+ // same as above but only take date part into account, time is always zero
+ wxDateTime& SetFromMSWSysDate(const struct _SYSTEMTIME& st);
+ void GetAsMSWSysDate(struct _SYSTEMTIME* st) const;
#endif // __WXMSW__
// comparison (see also functions below for operator versions)
#endif // __WXMSW__
// comparison (see also functions below for operator versions)
st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
}
st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
}
+wxDateTime& wxDateTime::SetFromMSWSysDate(const SYSTEMTIME& st)
+{
+ return Set(st.wDay,
+ static_cast<wxDateTime::Month>(wxDateTime::Jan + st.wMonth - 1),
+ st.wYear,
+ 0, 0, 0, 0);
+}
+
void wxDateTime::GetAsMSWSysTime(SYSTEMTIME* st) const
{
const wxDateTime::Tm tm(GetTm());
void wxDateTime::GetAsMSWSysTime(SYSTEMTIME* st) const
{
const wxDateTime::Tm tm(GetTm());
st->wSecond = tm.sec;
st->wMilliseconds = tm.msec;
}
st->wSecond = tm.sec;
st->wMilliseconds = tm.msec;
}
+
+void wxDateTime::GetAsMSWSysDate(SYSTEMTIME* st) const
+{
+ const wxDateTime::Tm tm(GetTm());
+
+ st->wYear = (WXWORD)tm.year;
+ st->wMonth = (WXWORD)(tm.mon - wxDateTime::Jan + 1);
+ st->wDay = tm.mday;
+
+ st->wDayOfWeek =
+ st->wHour =
+ st->wMinute =
+ st->wSecond =
+ st->wMilliseconds = 0;
+}
+
#endif // __WXMSW__
#endif // wxUSE_DATETIME
#endif // __WXMSW__
#endif // wxUSE_DATETIME
case MCHT_CALENDARDATE:
if ( date )
case MCHT_CALENDARDATE:
if ( date )
- date->SetFromMSWSysTime(hti.st);
+ date->SetFromMSWSysDate(hti.st);
return wxCAL_HITTEST_DAY;
case MCHT_CALENDARDAY:
return wxCAL_HITTEST_DAY;
case MCHT_CALENDARDAY:
{
wxCHECK_MSG( dt.IsValid(), false, "invalid date" );
{
wxCHECK_MSG( dt.IsValid(), false, "invalid date" );
- const wxDateTime date = dt.GetDateOnly();
-
- date.GetAsMSWSysTime(&st);
+ dt.GetAsMSWSysDate(&st);
if ( !MonthCal_SetCurSel(GetHwnd(), &st) )
{
wxLogDebug(wxT("DateTime_SetSystemtime() failed"));
if ( !MonthCal_SetCurSel(GetHwnd(), &st) )
{
wxLogDebug(wxT("DateTime_SetSystemtime() failed"));
+ m_date = dt.GetDateOnly();
{
#if wxDEBUG_LEVEL
SYSTEMTIME st;
{
#if wxDEBUG_LEVEL
SYSTEMTIME st;
if ( !MonthCal_GetCurSel(GetHwnd(), &st) )
{
wxASSERT_MSG( !m_date.IsValid(), "mismatch between data and control" );
if ( !MonthCal_GetCurSel(GetHwnd(), &st) )
{
wxASSERT_MSG( !m_date.IsValid(), "mismatch between data and control" );
return wxDefaultDateTime;
}
return wxDefaultDateTime;
}
+ wxDateTime dt;
+ dt.SetFromMSWSysDate(st);
// Windows XP and earlier didn't include the time component into the
// returned date but Windows 7 does, so we can't compare the full objects
// in the same way under all the Windows versions, just compare their date
// parts
// Windows XP and earlier didn't include the time component into the
// returned date but Windows 7 does, so we can't compare the full objects
// in the same way under all the Windows versions, just compare their date
// parts
- wxASSERT_MSG( dt.GetDateOnly() == m_date.GetDateOnly(),
- "mismatch between data and control" );
+ wxASSERT_MSG( dt.IsSameDate(m_date), "mismatch between data and control" );
#endif // wxDEBUG_LEVEL
return m_date;
#endif // wxDEBUG_LEVEL
return m_date;
if ( dt1 )
{
if ( flags & GDTR_MIN )
if ( dt1 )
{
if ( flags & GDTR_MIN )
- dt1->SetFromMSWSysTime(st[0]);
+ dt1->SetFromMSWSysDate(st[0]);
else
*dt1 = wxDefaultDateTime;
}
else
*dt1 = wxDefaultDateTime;
}
if ( dt2 )
{
if ( flags & GDTR_MAX )
if ( dt2 )
{
if ( flags & GDTR_MAX )
- dt2->SetFromMSWSysTime(st[1]);
+ dt2->SetFromMSWSysDate(st[1]);
else
*dt2 = wxDefaultDateTime;
}
else
*dt2 = wxDefaultDateTime;
}
// which expects GetDate() to return the new date
const wxDateTime dateOld = m_date;
const NMSELCHANGE * const sch = (NMSELCHANGE *)lParam;
// which expects GetDate() to return the new date
const wxDateTime dateOld = m_date;
const NMSELCHANGE * const sch = (NMSELCHANGE *)lParam;
- m_date.SetFromMSWSysTime(sch->stSelStart);
+ m_date.SetFromMSWSysDate(sch->stSelStart);
// changing the year or the month results in a second dummy
// MCN_SELCHANGE event on this system which doesn't really
// changing the year or the month results in a second dummy
// MCN_SELCHANGE event on this system which doesn't really