bool wxCalendarCtrl::Create(wxWindow *parent, wxWindowID id, const wxDateTime& dt, const wxPoint& pos, const wxSize& size, long style, const wxString& name) { if ( !wxMSWDateControls::CheckInitialization() ) return false; // we need the arrows for the navigation style |= wxWANTS_CHARS; // initialize the base class if ( !CreateControl(parent, id, pos, size, style, wxDefaultValidator, name) ) return false; // create the native control: this is a bit tricky as we want to receive // double click events but the MONTHCAL_CLASS doesn't use CS_DBLCLKS style // and so we create our own copy of it which does static ClassRegistrar s_clsMonthCal; if ( !s_clsMonthCal.IsInitialized() ) { // get a copy of standard class and modify it WNDCLASS wc; if ( ::GetClassInfo(NULL, MONTHCAL_CLASS, &wc) ) { wc.lpszClassName = wxT("_wx_SysMonthCtl32"); wc.style |= CS_DBLCLKS; s_clsMonthCal.Register(wc); } else { wxLogLastError(wxT("GetClassInfoEx(SysMonthCal32)")); } } const wxChar * const clsname = s_clsMonthCal.IsRegistered() ? static_cast<const wxChar*>(s_clsMonthCal.GetName().t_str()) : MONTHCAL_CLASS; if ( !MSWCreateControl(clsname, wxEmptyString, pos, size) ) return false; // initialize the control UpdateFirstDayOfWeek(); SetDate(dt.IsValid() ? dt : wxDateTime::Today()); SetHolidayAttrs(); UpdateMarks(); Bind(wxEVT_LEFT_DOWN, &wxCalendarCtrl::MSWOnClick, this); Bind(wxEVT_LEFT_DCLICK, &wxCalendarCtrl::MSWOnDoubleClick, this); return true; }
bool wxCalendarCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) { NMHDR* hdr = (NMHDR *)lParam; switch ( hdr->code ) { case MCN_SELCHANGE: { // we need to update m_date first, before calling the user code // which expects GetDate() to return the new date const wxDateTime dateOld = m_date; const NMSELCHANGE * const sch = (NMSELCHANGE *)lParam; 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 // change anything -- filter it out if ( m_date != dateOld ) { if ( GenerateAllChangeEvents(dateOld) ) { // month changed, need to update the holidays if we use // them if ( SetHolidayAttrs() ) UpdateMarks(); } } } break; case MCN_GETDAYSTATE: { const NMDAYSTATE * const ds = (NMDAYSTATE *)lParam; for ( int i = 0; i < ds->cDayState; i++ ) { ds->prgDayState[i] = m_marks | m_holidays; } } break; default: return wxCalendarCtrlBase::MSWOnNotify(idCtrl, lParam, result); } *result = 0; return true; }
void wxCalendarCtrlBase::EnableHolidayDisplay(bool display) { long style = GetWindowStyle(); if ( display ) style |= wxCAL_SHOW_HOLIDAYS; else style &= ~wxCAL_SHOW_HOLIDAYS; if ( style == GetWindowStyle() ) return; SetWindowStyle(style); if ( display ) SetHolidayAttrs(); else ResetHolidayAttrs(); RefreshHolidays(); }
bool wxCalendarCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) { NMHDR* hdr = (NMHDR *)lParam; switch ( hdr->code ) { case MCN_SELCHANGE: { // we need to update m_date first, before calling the user code // which expects GetDate() to return the new date const wxDateTime dateOld = m_date; const NMSELCHANGE * const sch = (NMSELCHANGE *)lParam; 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 // change anything -- filter it out if ( m_date != dateOld ) { if ( GenerateAllChangeEvents(dateOld) ) { // month changed, need to update the holidays if we use // them SetHolidayAttrs(); UpdateMarks(); } } } break; case MCN_GETDAYSTATE: { const NMDAYSTATE * const ds = (NMDAYSTATE *)lParam; wxDateTime startDate; startDate.SetFromMSWSysDate(ds->stStart); // Ensure we have a valid date to work with. wxDateTime currentDate = m_date.IsValid() ? m_date : startDate; // Set to the start of month for comparison with startDate to // work correctly. currentDate.SetDay(1); for ( int i = 0; i < ds->cDayState; i++ ) { // set holiday/marks only for the "current" month if ( startDate == currentDate ) ds->prgDayState[i] = m_marks | m_holidays; else ds->prgDayState[i] = 0; startDate += wxDateSpan::Month(); } } break; default: return wxCalendarCtrlBase::MSWOnNotify(idCtrl, lParam, result); } *result = 0; return true; }