X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/df74e2d2510d0bf2e2ae6b888c5948a302a6e0eb..88932ec82d048d006cdc81bd309f5e59aee799ac:/src/msw/choice.cpp diff --git a/src/msw/choice.cpp b/src/msw/choice.cpp index e408eb89ad..e7c17023c1 100644 --- a/src/msw/choice.cpp +++ b/src/msw/choice.cpp @@ -200,12 +200,12 @@ wxChoice::~wxChoice() 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 ) @@ -612,18 +612,7 @@ void wxChoice::DoSetSize(int x, int y, 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 @@ -634,6 +623,42 @@ 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 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 // ----------------------------------------------------------------------------