[COMCTL32] Combobox Implement logic for set and get dropdown height CORE-15833
authorJoachim Henze <Joachim.Henze@reactos.org>
Sat, 16 Mar 2019 01:11:00 +0000 (02:11 +0100)
committerJoachim Henze <Joachim.Henze@reactos.org>
Sat, 16 Mar 2019 01:11:00 +0000 (02:11 +0100)
by import of Wine commit
https://source.winehq.org/git/wine.git/commit/313c63e194aebdd517b3a85f8fe4d83acf170b62
merged from current Wine head.

Thanks to patches author Fabian Maurer
and also Doug Lyons for tests and adding initial the merge-patch.

dll/win32/comctl32/combo.c
dll/win32/comctl32/comctl32.h

index ee374f4..abbe395 100644 (file)
  * 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 );
index ee47772..73564eb 100644 (file)
@@ -147,6 +147,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;