convenient, DoGetBestClientSize() when writing your own custom window
class to change the value returned by this public non-virtual method.
+ Notice that the best size respects the minimal and maximal size
+ explicitly set for the window, if any. So even if some window believes
+ that it needs 200 pixels horizontally, calling SetMaxSize() with a
+ width of 100 would ensure that GetBestSize() returns the width of at
+ most 100 pixels.
+
@see CacheBestSize(), @ref overview_windowsizing
*/
wxSize GetBestSize() const;
// it to be used
wxSize size = DoGetBestClientSize();
if ( size != wxDefaultSize )
- {
size += DoGetBorderSize();
+ else
+ size = DoGetBestSize();
- CacheBestSize(size);
- return size;
- }
+ // Ensure that the best size is at least as large as min size.
+ size.IncTo(GetMinSize());
+
+ // And not larger than max size.
+ size.DecToIfSpecified(GetMaxSize());
- return DoGetBestSize();
+ // Finally cache result and return.
+ CacheBestSize(size);
+ return size;
}
int wxWindowBase::GetBestHeight(int width) const
{
m_minWidth = minSize.x;
m_minHeight = minSize.y;
+
+ InvalidateBestSize();
}
void wxWindowBase::SetMaxSize(const wxSize& maxSize)
{
m_maxWidth = maxSize.x;
m_maxHeight = maxSize.y;
+
+ InvalidateBestSize();
}
void wxWindowBase::SetInitialSize(const wxSize& size)
CPPUNIT_TEST_SUITE( SetSizeTestCase );
CPPUNIT_TEST( SetSize );
CPPUNIT_TEST( SetSizeLessThanMinSize );
+ CPPUNIT_TEST( BestSize );
CPPUNIT_TEST_SUITE_END();
void SetSize();
void SetSizeLessThanMinSize();
+ void BestSize();
+
+ // Helper class overriding DoGetBestSize() for testing purposes.
+ class MyWindow : public wxWindow
+ {
+ public:
+ MyWindow(wxWindow* parent)
+ : wxWindow(parent, wxID_ANY)
+ {
+ }
+
+ protected:
+ virtual wxSize DoGetBestSize() const { return wxSize(50, 250); }
+ };
wxWindow *m_win;
void SetSizeTestCase::setUp()
{
- m_win = new wxWindow(wxTheApp->GetTopWindow(), wxID_ANY);
+ m_win = new MyWindow(wxTheApp->GetTopWindow());
}
void SetSizeTestCase::tearDown()
CPPUNIT_ASSERT_EQUAL( size, m_win->GetSize() );
}
+void SetSizeTestCase::BestSize()
+{
+ CPPUNIT_ASSERT_EQUAL( wxSize(50, 250), m_win->GetBestSize() );
+
+ m_win->SetMinSize(wxSize(100, 100));
+ CPPUNIT_ASSERT_EQUAL( wxSize(100, 250), m_win->GetBestSize() );
+
+ m_win->SetMaxSize(wxSize(200, 200));
+ CPPUNIT_ASSERT_EQUAL( wxSize(100, 200), m_win->GetBestSize() );
+}