[PATCH v2 2/2] comctl32/combo: Implement logic for setting and getting dropdown height
Fabian Maurer
dark.shadow4 at web.de
Sun Aug 19 14:03:55 CDT 2018
Signed-off-by: Fabian Maurer <dark.shadow4 at web.de>
---
dlls/comctl32/combo.c | 43 ++++++++++++++++++++-----------------
dlls/comctl32/comctl32.h | 1 +
dlls/comctl32/tests/combo.c | 7 +-----
include/windowsx.h | 6 ++++++
4 files changed, 31 insertions(+), 26 deletions(-)
diff --git a/dlls/comctl32/combo.c b/dlls/comctl32/combo.c
index 712e27276a..12ea7bbff6 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 67da0e1677..b68b914296 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 5fee206fd1..923d826b30 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/windowsx.h b/include/windowsx.h
index 7a873140a4..93eb12343a 100644
--- a/include/windowsx.h
+++ b/include/windowsx.h
@@ -303,6 +303,9 @@ extern "C" {
#define ComboBox_GetText(hwndCtl, lpch, cchMax) \
GetWindowText((hwndCtl), (lpch), (cchMax))
+#define ComboBox_GetMinVisible(hwndCtl) \
+ ((int)SendMessage((hwndCtl), CB_GETMINVISIBLE, 0, 0))
+
#define ComboBox_GetTextLength(hwndCtl) \
GetWindowTextLength(hwndCtl)
@@ -336,6 +339,9 @@ extern "C" {
#define ComboBox_SetItemHeight(hwndCtl, index, cyItem) \
((int)SendMessage((hwndCtl), CB_SETITEMHEIGHT, (WPARAM)(int)(index), (LPARAM)(int)cyItem))
+#define ComboBox_SetMinVisible(hwndCtl, count) \
+ ((void)SendMessage((hwndCtl), CB_SETMINVISIBLE, (WPARAM)(int)(count), 0))
+
#define ComboBox_SetText(hwndCtl, lpsz) \
SetWindowText((hwndCtl), (lpsz))
--
2.18.0
More information about the wine-devel
mailing list