Clear();
}
-bool wxChoice::MSWGetComboBoxInfo(COMBOBOXINFO* info) const
+bool wxChoice::MSWGetComboBoxInfo(tagCOMBOBOXINFO* info) const
{
// TODO-Win9x: Get rid of this once we officially drop support for Win9x
// and just call the function directly.
#if wxUSE_DYNLIB_CLASS
- typedef BOOL (WINAPI *GetComboBoxInfo_t)(HWND, COMBOBOXINFO*);
+ typedef BOOL (WINAPI *GetComboBoxInfo_t)(HWND, tagCOMBOBOXINFO*);
static GetComboBoxInfo_t s_pfnGetComboBoxInfo = NULL;
static bool s_triedToLoad = false;
if ( !s_triedToLoad )
wxSize wxChoice::DoGetBestSize() const
{
// The base version returns the size of the largest string
- wxSize best( wxChoiceBase::DoGetBestSize() );
-
- // We just need to adjust it to account for the arrow width.
- best.x += 5*GetCharWidth();
-
- // set height on our own
- if( HasFlag( wxCB_SIMPLE ) )
- best.y = SetHeightSimpleComboBox(GetCount());
- else
- best.y = EDIT_HEIGHT_FROM_CHAR_HEIGHT(GetCharHeight());
-
- return best;
+ return GetSizeFromTextSize(wxChoiceBase::DoGetBestSize().x);
}
int wxChoice::SetHeightSimpleComboBox(int nItems) const
return EDIT_HEIGHT_FROM_CHAR_HEIGHT( cy ) * wxMin( wxMax( nItems, 3 ), 6 ) + hItem - 1;
}
+wxSize wxChoice::DoGetSizeFromTextSize(int xlen, int ylen) const
+{
+ int cHeight = GetCharHeight();
+
+ // We are interested in the difference of sizes between the whole control
+ // and its child part. I.e. arrow, separators, etc.
+ wxSize tsize(xlen, 0);
+
+ // FIXME-VC6: Only VC6 needs this guard, see WINVER definition in
+ // include/wx/msw/wrapwin.h
+#if defined(WINVER) && WINVER >= 0x0500
+ WinStruct<COMBOBOXINFO> info;
+ if ( MSWGetComboBoxInfo(&info) )
+ {
+ tsize.x += info.rcItem.left + info.rcButton.right - info.rcItem.right
+ + info.rcItem.left + 3; // right and extra margins
+ }
+ else // Just use some rough approximation.
+#endif // WINVER >= 0x0500
+ {
+ tsize.x += 4*cHeight;
+ }
+
+ // set height on our own
+ if( HasFlag( wxCB_SIMPLE ) )
+ tsize.y = SetHeightSimpleComboBox(GetCount());
+ else
+ tsize.y = EDIT_HEIGHT_FROM_CHAR_HEIGHT(cHeight);
+
+ // Perhaps the user wants something different from CharHeight
+ if ( ylen > 0 )
+ tsize.IncBy(0, ylen - cHeight);
+
+ return tsize;
+}
+
// ----------------------------------------------------------------------------
// Popup operations
// ----------------------------------------------------------------------------