diff --git a/src/msw/window.cpp b/src/msw/window.cpp index 8a34b50fa9..246f47ba11 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -1787,6 +1787,15 @@ void wxWindowMSW::DoGetClientSize(int *x, int *y) const if ( y ) *y = rect.bottom; } + + // The size of the client window can't be negative but ::GetClientRect() + // can return negative size for an extremely small (1x1) window with + // borders so ensure that we correct it here as having negative sizes is + // completely unexpected. + if ( x && *x < 0 ) + *x = 0; + if ( y && *y < 0 ) + *y = 0; } void wxWindowMSW::DoGetPosition(int *x, int *y) const diff --git a/tests/window/clientsize.cpp b/tests/window/clientsize.cpp index 1b075fa1f6..57089680ef 100644 --- a/tests/window/clientsize.cpp +++ b/tests/window/clientsize.cpp @@ -37,10 +37,12 @@ public: private: CPPUNIT_TEST_SUITE( ClientSizeTestCase ); CPPUNIT_TEST( ClientToWindow ); + CPPUNIT_TEST( ClientSizeNotNegative ); CPPUNIT_TEST( WindowToClient ); CPPUNIT_TEST_SUITE_END(); void ClientToWindow(); + void ClientSizeNotNegative(); void WindowToClient(); wxWindow *m_win; @@ -78,6 +80,18 @@ void ClientSizeTestCase::ClientToWindow() m_win->ClientToWindowSize(m_win->GetClientSize())); } +void ClientSizeTestCase::ClientSizeNotNegative() +{ + wxWindow* w = new wxWindow(wxTheApp->GetTopWindow(), -1, + wxDefaultPosition, wxDefaultSize, + wxBORDER_THEME); + w->SetSize(wxSize(1,1)); + const wxSize szw = w->GetClientSize(); + CPPUNIT_ASSERT(szw.GetWidth() >= 0); + CPPUNIT_ASSERT(szw.GetHeight() >= 0); + w->Destroy(); +} + void ClientSizeTestCase::WindowToClient() { CPPUNIT_ASSERT(m_win->GetClientSize() ==