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 */