From 1e43584aa751510ef59ce97ea0a5abad7241365a Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Mon, 14 Feb 2011 22:12:10 +0000 Subject: [PATCH] Don't make buttons with images too wide in wxMSW. We used to increase the button size to the standard size first and then add the extra padding the buttons with images. This resulted in too much padding for the buttons with short text labels and images. Instead, add the padding for the image first and only then increase the button size to the standard one if still needed. See #12924. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@66892 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/msw/private/button.h | 22 ++++++++++++++++++---- src/msw/button.cpp | 21 +++++++++++---------- 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/include/wx/msw/private/button.h b/include/wx/msw/private/button.h index a6f2e68a93..a6c9b64374 100644 --- a/include/wx/msw/private/button.h +++ b/include/wx/msw/private/button.h @@ -47,15 +47,29 @@ enum Size_AuthNeeded = 1 }; -// common implementation of wxButton and wxToggleButton::DoGetBestSize() -// (implemented in src/msw/button.cpp) -wxSize ComputeBestSize(wxControl *btn, int flags = 0); +// NB: All the functions below are implemented in src/msw/button.cpp -// compute the button size (as if wxBU_EXACTFIT were specified, i.e. without +// Compute the button size (as if wxBU_EXACTFIT were specified, i.e. without // adjusting it to be of default size if it's smaller) for the given label size WXDLLIMPEXP_CORE wxSize GetFittingSize(wxWindow *win, const wxSize& sizeLabel, int flags = 0); +// Compute the button size (as if wxBU_EXACTFIT were specified) by computing +// its label size and then calling GetFittingSize(). +wxSize ComputeBestFittingSize(wxControl *btn, int flags = 0); + +// Increase the size passed as parameter to be at least the standard button +// size if the control doesn't have wxBU_EXACTFIT style and also cache it as +// the best size and return its value -- this is used in DoGetBestSize() +// implementation. +wxSize IncreaseToStdSizeAndCache(wxControl *btn, const wxSize& size); + +// helper of wxToggleButton::DoGetBestSize() +inline wxSize ComputeBestSize(wxControl *btn, int flags = 0) +{ + return IncreaseToStdSizeAndCache(btn, ComputeBestFittingSize(btn, flags)); +} + } // namespace wxMSWButton #endif // _WX_MSW_PRIVATE_BUTTON_H_ diff --git a/src/msw/button.cpp b/src/msw/button.cpp index 6323ec0bc9..55e66816a5 100644 --- a/src/msw/button.cpp +++ b/src/msw/button.cpp @@ -397,14 +397,19 @@ wxSize wxMSWButton::GetFittingSize(wxWindow *win, return sizeBtn; } -wxSize wxMSWButton::ComputeBestSize(wxControl *btn, int flags) +wxSize wxMSWButton::ComputeBestFittingSize(wxControl *btn, int flags) { wxClientDC dc(btn); wxSize sizeBtn; dc.GetMultiLineTextExtent(btn->GetLabelText(), &sizeBtn.x, &sizeBtn.y); - sizeBtn = GetFittingSize(btn, sizeBtn, flags); + return GetFittingSize(btn, sizeBtn, flags); +} + +wxSize wxMSWButton::IncreaseToStdSizeAndCache(wxControl *btn, const wxSize& size) +{ + wxSize sizeBtn(size); // all buttons have at least the standard size unless the user explicitly // wants them to be of smaller size and used wxBU_EXACTFIT style when @@ -595,6 +600,8 @@ void wxButton::AdjustForBitmapSize(wxSize &size) const wxSize wxButton::DoGetBestSize() const { + wxButton * const self = const_cast(this); + wxSize size; // account for the text part if we have it or if we don't have any image at @@ -606,19 +613,13 @@ wxSize wxButton::DoGetBestSize() const if ( GetAuthNeeded() ) flags |= wxMSWButton::Size_AuthNeeded; - size = wxMSWButton::ComputeBestSize(const_cast(this), flags); + size = wxMSWButton::ComputeBestFittingSize(self, flags); } if ( m_imageData ) - { AdjustForBitmapSize(size); - // The best size has changed so even if it had been already cached by - // ComputeBestSize() call above we still need to update it. - CacheBestSize(size); - } - - return size; + return wxMSWButton::IncreaseToStdSizeAndCache(self, size); } /* static */ -- 2.47.2