]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/choice.cpp
simplify code to return from the end of the function
[wxWidgets.git] / src / msw / choice.cpp
index e408eb89ada65493712377b3e698d661e2f03356..e7c17023c1c48bf52a43ffbc02ca669de32bebd3 100644 (file)
@@ -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<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
 // ----------------------------------------------------------------------------