- // Ignore height parameter because height doesn't mean 'initially
- // displayed' height, it refers to the drop-down menu as well. The
- // wxWindows interpretation is different; also, getting the size returns
- // the _displayed_ size (NOT the drop down menu size) so
- // setting-getting-setting size would not work.
+ 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 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
+ // own height to 256 pixels results in default height being used (255
+ // is still ok)
+ m_heightOwn = height;
+
+ if ( m_heightOwn > UCHAR_MAX )
+ m_heightOwn = UCHAR_MAX;
+ // nor too small: see MSWUpdateVisibleHeight()
+ else if ( m_heightOwn < COMBO_HEIGHT_ADJ )
+ m_heightOwn = COMBO_HEIGHT_ADJ;
+ }
+
+
+ // the height which we must pass to Windows should be the total height of
+ // the control including the drop down list while the height given to us
+ // is, of course, just the height of the permanently visible part of it so
+ // add the drop down height to it
+
+ // don't make the drop down list too tall, arbitrarily limit it to 30
+ // items max and also don't make it too small if it's currently empty
+ size_t nItems = GetCount();
+ if (!HasFlag(wxCB_SIMPLE))
+ {
+ if ( !nItems )
+ nItems = 9;
+ else if ( nItems > 30 )
+ nItems = 30;
+ }
+
+ const int hItem = SendMessage(GetHwnd(), CB_GETITEMHEIGHT, 0, 0);
+ int heightWithItems = 0;
+ if (!HasFlag(wxCB_SIMPLE))
+ // The extra item (" + 1") is required to prevent a vertical
+ // scrollbar from appearing with comctl32.dll versions earlier
+ // than 6.0 (such as found in Win2k).
+ heightWithItems = height + hItem*(nItems + 1);
+ else
+ heightWithItems = SetHeightSimpleComboBox(nItems);