#if wxUSE_DATEPICKCTRL
#include "wx/datectrl.h"
+#include "wx/app.h"
+#include "wx/intl.h"
+#include "wx/dynlib.h"
#define _WX_DEFINE_DATE_EVENTS_
#include "wx/dateevt.h"
#include "wx/msw/wrapcctl.h"
#include "wx/msw/private.h"
+#if defined(__GNUWIN32__) && ! wxCHECK_W32API_VERSION( 2, 4 )
+typedef struct tagNMDATETIMECHANGE
+{
+ NMHDR nmhdr;
+ DWORD dwFlags;
+ SYSTEMTIME st;
+} NMDATETIMECHANGE, FAR * LPNMDATETIMECHANGE;
+#endif
+
// ============================================================================
// implementation
// ============================================================================
{
const wxDateTime::Tm tm(dt.GetTm());
- st->wYear = tm.year;
- st->wMonth = tm.mon - wxDateTime::Jan + 1;
+ st->wYear = (WXWORD)tm.year;
+ st->wMonth = (WXWORD)(tm.mon - wxDateTime::Jan + 1);
st->wDay = tm.mday;
st->wDayOfWeek =
const wxValidator& validator,
const wxString& name)
{
+ // although we already call InitCommonControls() in app.cpp which is
+ // supposed to initialize all common controls, in comctl32.dll 4.72 (and
+ // presumably earlier versions 4.70 and 4.71, date time picker not being
+ // supported in < 4.70 anyhow) it does not do it and we have to initialize
+ // it explicitely
+ static bool s_initDone = false; // MT-ok: used from GUI thread only
+ if ( !s_initDone )
+ {
+ if ( wxTheApp->GetComCtl32Version() < 470 )
+ {
+ wxLogError(_("This system doesn't support date picker control, please upgrade your version of comctl32.dll"));
+
+ return false;
+ }
+
+ INITCOMMONCONTROLSEX icex;
+ icex.dwSize = sizeof(icex);
+ icex.dwICC = ICC_DATE_CLASSES;
+
+ wxDynamicLibrary dllComCtl32(_T("comctl32.dll"), wxDL_VERBATIM);
+
+ typedef BOOL (WINAPI *ICCEx_t)(INITCOMMONCONTROLSEX *);
+ wxDYNLIB_FUNCTION( ICCEx_t, InitCommonControlsEx, dllComCtl32 );
+
+ if ( pfnInitCommonControlsEx )
+ {
+ (*pfnInitCommonControlsEx)(&icex);
+ }
+
+ s_initDone = true;
+ }
+
+
+ // use wxDP_SPIN if wxDP_DEFAULT (0) was given as style
+ if ( !(style & wxDP_DROPDOWN) )
+ style |= wxDP_SPIN;
+
// initialize the base class
if ( !CreateControl(parent, id, pos, size, style, validator, name) )
return false;
// create the native control
- if ( !MSWCreateControl(DATETIMEPICK_CLASS, _T(""), pos, size) )
+ if ( !MSWCreateControl(DATETIMEPICK_CLASS, wxEmptyString, pos, size) )
return false;
if ( dt.IsValid() )
{
WXDWORD styleMSW = wxDatePickerCtrlBase::MSWGetStyle(style, exstyle);
- // for now this is unconditional, but we should support drop down control
- // style as well later
- styleMSW |= DTS_UPDOWN | DTS_SHORTDATEFORMAT;
+ // although MSDN doesn't mention it, DTS_UPDOWN doesn't work with
+ // comctl32.dll 4.72
+ if ( wxTheApp->GetComCtl32Version() > 472 && (style & wxDP_SPIN) )
+ styleMSW |= DTS_UPDOWN;
+ //else: drop down by default
+
+#ifdef DTS_SHORTDATECENTURYFORMAT
+ if ( style & wxDP_SHOWCENTURY )
+ styleMSW |= DTS_SHORTDATECENTURYFORMAT;
+ else
+#endif // DTS_SHORTDATECENTURYFORMAT
+ styleMSW |= DTS_SHORTDATEFORMAT;
return styleMSW;
}
// wxDatePickerCtrl operations
// ----------------------------------------------------------------------------
+#ifndef DateTime_GetSystemtime
+ #define DateTime_GetSystemtime DateTime_GetSystemTime
+#endif
+
+#ifndef DateTime_SetSystemtime
+ #define DateTime_SetSystemtime DateTime_SetSystemTime
+#endif
+
void wxDatePickerCtrl::SetValue(const wxDateTime& dt)
{
// as we don't support DTS_SHOWNONE style so far, we don't allow setting
}
#endif // wxUSE_DATEPICKCTRL
+