generate double click events in the native MSW version of wxCalendarCtrl

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@53008 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2008-04-04 15:49:08 +00:00
parent a4fcd589a8
commit b3ed70208b
3 changed files with 44 additions and 5 deletions

View File

@@ -298,11 +298,11 @@ public:
// implementation only from now on
protected:
// generate the given calendar event(s)
void GenerateEvent(wxEventType type)
// generate the given calendar event, return true if it was processed
bool GenerateEvent(wxEventType type)
{
wxCalendarEvent event(this, GetDate(), type);
HandleWindowEvent(event);
return HandleWindowEvent(event);
}
// generate all the events for the selection change from dateOld to current

View File

@@ -55,6 +55,8 @@ protected:
virtual bool MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result);
void MSWOnDoubleClick(wxMouseEvent& event);
private:
wxDateTime m_date;

View File

@@ -60,12 +60,38 @@ wxCalendarCtrl::Create(wxWindow *parent,
if ( !CreateControl(parent, id, pos, size, style, wxDefaultValidator, name) )
return false;
// create the native control
if ( !MSWCreateControl(MONTHCAL_CLASS, wxEmptyString, pos, size) )
// 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(_T("GetClassInfoEx(SysMonthCal32)"));
}
}
const wxChar * const clsname = s_clsMonthCal.IsRegistered()
? s_clsMonthCal.GetName().wx_str()
: MONTHCAL_CLASS;
if ( !MSWCreateControl(clsname, wxEmptyString, pos, size) )
return false;
SetDate(dt.IsValid() ? dt : wxDateTime::Today());
Connect(wxEVT_LEFT_DOWN,
wxMouseEventHandler(wxCalendarCtrl::MSWOnDoubleClick));
return true;
}
@@ -300,4 +326,15 @@ bool wxCalendarCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
return wxCalendarCtrlBase::MSWOnNotify(idCtrl, lParam, result);
}
void wxCalendarCtrl::MSWOnDoubleClick(wxMouseEvent& event)
{
if ( HitTest(event.GetPosition()) == wxCAL_HITTEST_DAY )
{
if ( GenerateEvent(wxEVT_CALENDAR_DOUBLECLICKED) )
return; // skip event.Skip() below
}
event.Skip();
}
#endif // wxUSE_CALENDARCTRL