diff --git a/src/msw/anybutton.cpp b/src/msw/anybutton.cpp index bc8b9f9560..c5a51f8c16 100644 --- a/src/msw/anybutton.cpp +++ b/src/msw/anybutton.cpp @@ -546,17 +546,7 @@ wxSize wxMSWButton::IncreaseToStdSizeAndCache(wxControl *btn, const wxSize& size // By default all buttons have at least the standard size. if ( !btn->HasFlag(wxBU_EXACTFIT) ) { - // The "Recommended sizing and spacing" section of MSDN layout article - // documents the default button size as being 50*14 dialog units or - // 75*23 relative pixels (what we call DIPs). As dialog units don't - // scale well in high DPI because of rounding errors, just DIPs here. - // - // Moreover, it looks like the extra 2px borders around the visible - // part of the button are not scaled correctly in higher than normal - // DPI, so add them without scaling. - const wxSize sizeDef = btn->FromDIP(wxSize(73, 21)) + wxSize(2, 2); - - sizeBtn.IncTo(sizeDef); + sizeBtn.IncTo(wxButton::GetDefaultSize(btn)); } // wxBU_EXACTFIT is typically used alongside a text control or similar, diff --git a/src/msw/button.cpp b/src/msw/button.cpp index 858d48bb1d..b5500e19fa 100644 --- a/src/msw/button.cpp +++ b/src/msw/button.cpp @@ -163,30 +163,19 @@ wxSize wxButtonBase::GetDefaultSize(wxWindow* win) if ( s_sizeBtn.HasChanged(win) ) { - wxSize base; - if ( win ) - { - wxClientDC dc(win); - dc.SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT)); - base = wxPrivate::GetAverageASCIILetterSize(dc); - } - else - { - wxScreenDC dc; - dc.SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT)); - base = wxPrivate::GetAverageASCIILetterSize(dc); - } - - // The size of a standard button in the dialog units is 50x14, - // translate this to pixels. + // The "Recommended sizing and spacing" section of MSDN layout article + // documents the default button size as being 50*14 dialog units or + // 75*23 relative pixels (what we call DIPs). But dialog units don't + // work well in high DPI (and not just because of rounding errors, i.e. + // the values differ from the actual default button size used by + // Windows itself in high DPI by too much), so just use DIPs directly. // - // Windows' computes dialog units using average character width over - // upper- and lower-case ASCII alphabet and not using the average - // character width metadata stored in the font; see - // http://support.microsoft.com/default.aspx/kb/145994 for detailed - // discussion. - - s_sizeBtn.SetAtNewDPI(wxRescaleCoord(50, 14).From(4, 8).To(base)); + // Moreover, it looks like the extra 2px borders around the visible + // part of the button are not scaled correctly in higher than normal + // DPI, so add them without scaling. + s_sizeBtn.SetAtNewDPI( + wxWindow::FromDIP(wxSize(73, 21), win) + wxSize(2, 2) + ); } return s_sizeBtn.Get();