more accurate best size calculation logic (use the current date format)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@38009 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -180,9 +180,46 @@ WXDWORD wxDatePickerCtrl::MSWGetStyle(long style, WXDWORD *exstyle) const
|
|||||||
|
|
||||||
wxSize wxDatePickerCtrl::DoGetBestSize() const
|
wxSize wxDatePickerCtrl::DoGetBestSize() const
|
||||||
{
|
{
|
||||||
const int y = GetCharHeight();
|
wxClientDC dc(wx_const_cast(wxDatePickerCtrl *, this));
|
||||||
|
dc.SetFont(GetFont());
|
||||||
|
|
||||||
wxSize best(DEFAULT_ITEM_WIDTH, EDIT_HEIGHT_FROM_CHAR_HEIGHT(y));
|
// 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);
|
||||||
|
|
||||||
|
// 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);
|
CacheBestSize(best);
|
||||||
return best;
|
return best;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user