Now that user32 and comctl32 combo are separated, this won't lead to a regression anymore.
Signed-off-by: Fabian Maurer dark.shadow4@web.de --- dlls/user32/combo.c | 8 -------- dlls/user32/tests/combo.c | 20 ++++++++++---------- 2 files changed, 10 insertions(+), 18 deletions(-)
diff --git a/dlls/user32/combo.c b/dlls/user32/combo.c index dcfa661f97..31ec6af526 100644 --- a/dlls/user32/combo.c +++ b/dlls/user32/combo.c @@ -1029,14 +1029,6 @@ static void CBDropDown( LPHEADCOMBO lphc )
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; - } }
r.left = rect.left; diff --git a/dlls/user32/tests/combo.c b/dlls/user32/tests/combo.c index 3358e846a0..0d3b1b170f 100644 --- a/dlls/user32/tests/combo.c +++ b/dlls/user32/tests/combo.c @@ -688,25 +688,25 @@ static void test_listbox_size(DWORD style) int height_combo; BOOL todo; } info_height[] = { - {2, 24, TRUE}, + {2, 24, FALSE}, {2, 41, TRUE}, - {2, 42, TRUE}, - {2, 50, TRUE}, + {2, 42, FALSE}, + {2, 50, FALSE}, {2, 60}, {2, 80}, {2, 89}, {2, 90}, {2, 100},
- {10, 24, TRUE}, + {10, 24, FALSE}, {10, 41, TRUE}, - {10, 42, TRUE}, - {10, 50, TRUE}, - {10, 60, TRUE}, - {10, 80, TRUE}, + {10, 42, FALSE}, + {10, 50, FALSE}, + {10, 60, FALSE}, + {10, 80, FALSE}, {10, 89, TRUE}, - {10, 90, TRUE}, - {10, 100, TRUE}, + {10, 90, FALSE}, + {10, 100, FALSE}, };
for(test = 0; test < ARRAY_SIZE(info_height); test++)
Signed-off-by: Fabian Maurer dark.shadow4@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))