Fabian Maurer : comctl32/combo: Implement logic for setting and getting dropdown height.

Alexandre Julliard julliard at winehq.org
Mon Aug 20 13:26:11 CDT 2018


Module: wine
Branch: master
Commit: 313c63e194aebdd517b3a85f8fe4d83acf170b62
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=313c63e194aebdd517b3a85f8fe4d83acf170b62

Author: Fabian Maurer <dark.shadow4 at web.de>
Date:   Sun Aug 19 21:03:55 2018 +0200

comctl32/combo: Implement logic for setting and getting dropdown height.

Signed-off-by: Fabian Maurer <dark.shadow4 at web.de>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/comctl32/combo.c       | 43 +++++++++++++++++++++++--------------------
 dlls/comctl32/comctl32.h    |  1 +
 dlls/comctl32/tests/combo.c |  7 +------
 include/commctrl.h          |  5 +++++
 4 files changed, 30 insertions(+), 26 deletions(-)

diff --git a/dlls/comctl32/combo.c b/dlls/comctl32/combo.c
index 712e272..12ea7bb 100644
--- a/dlls/comctl32/combo.c
+++ b/dlls/comctl32/combo.c
@@ -18,10 +18,6 @@
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  *
- * TODO:
- *   - ComboBox_[GS]etMinVisible()
- *   - CB_GETMINVISIBLE, CB_SETMINVISIBLE
- *   - CB_SETTOPINDEX
  */
 
 #include <stdarg.h>
@@ -459,6 +455,11 @@ static LRESULT COMBO_Create( HWND hwnd, LPHEADCOMBO lphc, HWND hwndParent, LONG
    */
   lphc->wState |= CBF_MEASUREITEM;
 
+  /*
+   * Per default the comctl32 version of combo shows up to 30 items
+   */
+  lphc->visibleItems = 30;
+
   /* M$ IE 3.01 actually creates (and rapidly destroys) an ownerless combobox */
 
   if( lphc->owner || !(style & WS_VISIBLE) )
@@ -1010,23 +1011,18 @@ static void CBDropDown( LPHEADCOMBO lphc )
 
    if (nItems > 0)
    {
-      int nHeight;
-      int nIHeight;
-
-      nIHeight = (int)SendMessageW(lphc->hWndLBox, LB_GETITEMHEIGHT, 0, 0);
+        int nIHeight = (int)SendMessageW(lphc->hWndLBox, LB_GETITEMHEIGHT, 0, 0);
 
-      nHeight = nIHeight*nItems;
-
-      if (nHeight < nDroppedHeight - COMBO_YBORDERSIZE())
-         nDroppedHeight = nHeight + COMBO_YBORDERSIZE();
-
-      if (nDroppedHeight < nHeight)
-      {
-            if (nItems < 5)
-                nDroppedHeight = (nItems+1)*nIHeight;
-            else if (nDroppedHeight < 6*nIHeight)
-                nDroppedHeight = 6*nIHeight;
-      }
+        if (lphc->dwStyle & CBS_NOINTEGRALHEIGHT)
+        {
+            nDroppedHeight -= 1;
+        }
+        else
+        {
+            if (nItems > lphc->visibleItems)
+            nItems = lphc->visibleItems;
+            nDroppedHeight = nItems * nIHeight + COMBO_YBORDERSIZE();
+        }
    }
 
    r.left = rect.left;
@@ -2135,6 +2131,13 @@ static LRESULT CALLBACK COMBO_WindowProc( HWND hwnd, UINT message, WPARAM wParam
             return SendMessageW(lphc->hWndEdit, EM_LIMITTEXT, wParam, lParam);
         return  TRUE;
 
+    case CB_GETMINVISIBLE:
+        return lphc->visibleItems;
+
+    case CB_SETMINVISIBLE:
+        lphc->visibleItems = (INT)wParam;
+        return TRUE;
+
     default:
         if (message >= WM_USER)
             WARN("unknown msg WM_USER+%04x wp=%04lx lp=%08lx\n", message - WM_USER, wParam, lParam );
diff --git a/dlls/comctl32/comctl32.h b/dlls/comctl32/comctl32.h
index 67da0e1..b68b914 100644
--- a/dlls/comctl32/comctl32.h
+++ b/dlls/comctl32/comctl32.h
@@ -149,6 +149,7 @@ typedef struct
    INT            fixedOwnerDrawHeight;
    INT            droppedWidth;   /* last two are not used unless set */
    INT            editHeight;     /* explicitly */
+   INT            visibleItems;
 } HEADCOMBO, *LPHEADCOMBO;
 
 extern BOOL COMBO_FlipListbox(HEADCOMBO *lphc, BOOL ok, BOOL bRedrawButton) DECLSPEC_HIDDEN;
diff --git a/dlls/comctl32/tests/combo.c b/dlls/comctl32/tests/combo.c
index 5fee206..923d826 100644
--- a/dlls/comctl32/tests/combo.c
+++ b/dlls/comctl32/tests/combo.c
@@ -1165,7 +1165,7 @@ static void test_combo_dropdown_size(DWORD style)
         int limit;
     } info_height[] = {
         {33, 50, -1},
-        {35, 50, 40},
+        {35, 100, 40},
         {15, 50, 3},
     };
 
@@ -1182,7 +1182,6 @@ static void test_combo_dropdown_size(DWORD style)
                 info_test->height_combo, hMainWnd, (HMENU)COMBO_ID, NULL, 0);
 
         min_visible_expected = SendMessageA(hCombo, CB_GETMINVISIBLE, 0, 0);
-        todo_wine
         ok(min_visible_expected == 30, "Unexpected number of items %d.\n", min_visible_expected);
 
         cbInfo.cbSize = sizeof(COMBOBOXINFO);
@@ -1202,10 +1201,8 @@ static void test_combo_dropdown_size(DWORD style)
             min_visible_expected = info_test->limit;
 
             ret = SendMessageA(hCombo, CB_SETMINVISIBLE, min_visible_expected, 0);
-            todo_wine
             ok(ret, "Failed to set visible limit.\n");
             min_visible_actual = SendMessageA(hCombo, CB_GETMINVISIBLE, 0, 0);
-            todo_wine
             ok(min_visible_expected == min_visible_actual, "test %d: unexpected number of items %d.\n",
                     test, min_visible_actual);
         }
@@ -1242,7 +1239,6 @@ static void test_combo_dropdown_size(DWORD style)
             if (expected_height_list < 0)
                 expected_height_list = 0;
 
-            todo_wine
             ok(expected_height_list == height_list, "Test %d, expected list height to be %d, got %d\n",
                     test, expected_height_list, height_list);
         }
@@ -1250,7 +1246,6 @@ static void test_combo_dropdown_size(DWORD style)
         {
             expected_height_list = min(info_test->num_items, min_visible_expected) * height_item;
 
-            todo_wine
             ok(expected_height_list == height_list, "Test %d, expected list height to be %d, got %d\n",
                     test, expected_height_list, height_list);
         }
diff --git a/include/commctrl.h b/include/commctrl.h
index 455f8a4..936b2e4 100644
--- a/include/commctrl.h
+++ b/include/commctrl.h
@@ -5220,6 +5220,11 @@ static const WCHAR WC_COMBOBOXW[] = { 'C','o','m','b','o','B','o','x',0 };
 #define CB_SETCUEBANNER           (CBM_FIRST + 3)
 #define CB_GETCUEBANNER           (CBM_FIRST + 4)
 
+#define ComboBox_GetMinVisible(hwnd) \
+        ((int)SendMessage((hwnd), CB_GETMINVISIBLE, 0, 0))
+#define ComboBox_SetMinVisible(hwnd, count) \
+        ((BOOL)SendMessage((hwnd), CB_SETMINVISIBLE, (WPARAM)(count), 0))
+
 /**************************************************************************
  * Edit control
  */




More information about the wine-cvs mailing list