diff --git a/samples/aui/auidemo.cpp b/samples/aui/auidemo.cpp index 3d81eed050..78fa5692d3 100644 --- a/samples/aui/auidemo.cpp +++ b/samples/aui/auidemo.cpp @@ -847,6 +847,10 @@ MyFrame::MyFrame(wxWindow* parent, tb4->AddTool(ID_SampleItem+29, wxT("Item 8"), tb4_bmp1); tb4->SetToolDropDown(ID_DropDownToolbarItem, true); tb4->SetCustomOverflowItems(prepend_items, append_items); + wxChoice* choice = new wxChoice(tb4, ID_SampleItem+35); + choice->AppendString(wxT("One choice")); + choice->AppendString(wxT("Another choice")); + tb4->AddControl(choice); tb4->Realize(); diff --git a/src/msw/choice.cpp b/src/msw/choice.cpp index fd54852b9d..8abdba2c70 100644 --- a/src/msw/choice.cpp +++ b/src/msw/choice.cpp @@ -553,8 +553,21 @@ void wxChoice::DoSetSize(int x, int y, int width, int height, int sizeFlags) { + const int heightBest = GetBestSize().y; + // we need the real height below so get the current one if it's not given - if ( height != wxDefaultCoord && height != GetBestSize().y ) + if ( height == wxDefaultCoord ) + { + // height not specified, use the same as before + DoGetSize(NULL, &height); + } + else if ( height == heightBest ) + { + // we don't need to manually manage our height, let the system use the + // default one + m_heightOwn = wxDefaultCoord; + } + else // non-default height specified { // set our new own height but be careful not to make it too big: the // native control apparently stores it as a single byte and so setting @@ -568,10 +581,6 @@ void wxChoice::DoSetSize(int x, int y, else if ( m_heightOwn < COMBO_HEIGHT_ADJ ) m_heightOwn = COMBO_HEIGHT_ADJ; } - else // height not specified - { - DoGetSize(NULL, &height); - } // the height which we must pass to Windows should be the total height of diff --git a/tests/controls/comboboxtest.cpp b/tests/controls/comboboxtest.cpp index 82678cc1e4..512c1e12c1 100644 --- a/tests/controls/comboboxtest.cpp +++ b/tests/controls/comboboxtest.cpp @@ -49,8 +49,12 @@ private: CPPUNIT_TEST_SUITE( ComboBoxTestCase ); wxTEXT_ENTRY_TESTS(); + + CPPUNIT_TEST( Size ); CPPUNIT_TEST_SUITE_END(); + void Size(); + wxComboBox *m_combo; DECLARE_NO_COPY_CLASS(ComboBoxTestCase) @@ -81,3 +85,28 @@ void ComboBoxTestCase::tearDown() // tests themselves // ---------------------------------------------------------------------------- +void ComboBoxTestCase::Size() +{ + // under MSW changing combobox size is a non-trivial operation because of + // confusion between the size of the control with and without dropdown, so + // check that it does work as expected + + const int heightOrig = m_combo->GetSize().y; + + // check that the height doesn't change if we don't touch it + m_combo->SetSize(100, -1); + CPPUNIT_ASSERT_EQUAL( heightOrig, m_combo->GetSize().y ); + + // check that setting both big and small (but not too small, there is a + // limit on how small the control can become under MSW) heights works + m_combo->SetSize(-1, 50); + CPPUNIT_ASSERT_EQUAL( 50, m_combo->GetSize().y ); + + m_combo->SetSize(-1, 10); + CPPUNIT_ASSERT_EQUAL( 10, m_combo->GetSize().y ); + + // and also that restoring it works (this used to be broken before 2.9.1) + m_combo->SetSize(-1, heightOrig); + CPPUNIT_ASSERT_EQUAL( heightOrig, m_combo->GetSize().y ); +} +