/////////////////////////////////////////////////////////////////////////////
-// Name: msw/datectrl.cpp
+// Name: src/msw/datectrl.cpp
// Purpose: wxDatePickerCtrl implementation
// Author: Vadim Zeitlin
// Modified by:
#pragma hdrstop
#endif
+#if wxUSE_DATEPICKCTRL
+
#ifndef WX_PRECOMP
+ #include "wx/app.h"
+ #include "wx/intl.h"
+ #include "wx/dcclient.h"
+ #include "wx/msw/wrapwin.h"
+ #include "wx/msw/wrapcctl.h"
+ #include "wx/msw/private.h"
#endif
-#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/wrapwin.h"
-#include "wx/msw/wrapcctl.h"
-#include "wx/msw/private.h"
-
// apparently some versions of mingw define these macros erroneously
#ifndef DateTime_GetSystemtime
#define DateTime_GetSystemtime DateTime_GetSystemTime
return false;
}
+#if wxUSE_DYNLIB_CLASS
INITCOMMONCONTROLSEX icex;
icex.dwSize = sizeof(icex);
icex.dwICC = ICC_DATE_CLASSES;
}
s_initDone = true;
+#endif
}
wxSize wxDatePickerCtrl::DoGetBestSize() const
{
- const int y = GetCharHeight();
+ wxClientDC dc(wx_const_cast(wxDatePickerCtrl *, this));
+ dc.SetFont(GetFont());
+
+ // we can't use FormatDate() here as the CRT doesn't always use the same
+ // format as the date picker control
+ wxString s;
+ for ( int len = 100; ; len *= 2 )
+ {
+ if ( ::GetDateFormat
+ (
+ LOCALE_USER_DEFAULT, // the control should use the same
+ DATE_SHORTDATE, // the format used by the control
+ NULL, // use current date (we don't care)
+ NULL, // no custom format
+ wxStringBuffer(s, len), // output buffer
+ len // and its length
+ ) )
+ {
+ // success
+ break;
+ }
+
+ const DWORD rc = ::GetLastError();
+ if ( rc != ERROR_INSUFFICIENT_BUFFER )
+ {
+ wxLogApiError(_T("GetDateFormat"), rc);
- wxSize best(DEFAULT_ITEM_WIDTH, EDIT_HEIGHT_FROM_CHAR_HEIGHT(y));
+ // fall back on wxDateTime, what else to do?
+ s = wxDateTime::Today().FormatDate();
+ break;
+ }
+ }
+
+ // the control adds a lot of extra space around separators
+ s.Replace(_T(","), _T(" , "));
+
+ int x, y;
+ dc.GetTextExtent(s, &x, &y);
+
+ wxSize best(x + 40 /* margin + arrows */, EDIT_HEIGHT_FROM_CHAR_HEIGHT(y));
CacheBestSize(best);
return best;
}
}
#endif // wxUSE_DATEPICKCTRL
-