From: Paul Gofman pgofman@codeweavers.com
--- dlls/user32/combo.c | 4 +-- dlls/user32/tests/combo.c | 68 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 2 deletions(-)
diff --git a/dlls/user32/combo.c b/dlls/user32/combo.c index 5f2ddb3dcdf..0d32c9a3f2d 100644 --- a/dlls/user32/combo.c +++ b/dlls/user32/combo.c @@ -230,10 +230,10 @@ static INT CBGetTextAreaHeight(HEADCOMBO *lphc, BOOL clip_item_height) measureItem.CtlID = id; measureItem.itemID = -1; measureItem.itemWidth = clientRect.right; - measureItem.itemHeight = item_height - 6; /* ownerdrawn cb is taller */ + measureItem.itemHeight = item_height - 2; /* ownerdrawn cb is taller */ measureItem.itemData = 0; SendMessageW(lphc->owner, WM_MEASUREITEM, id, (LPARAM)&measureItem); - item_height = 6 + measureItem.itemHeight; + item_height = 2 + measureItem.itemHeight;
/* * Send a second one in the case of a fixed ownerdraw list to calculate the diff --git a/dlls/user32/tests/combo.c b/dlls/user32/tests/combo.c index 77dec2382bd..ec22b4cf5cb 100644 --- a/dlls/user32/tests/combo.c +++ b/dlls/user32/tests/combo.c @@ -962,6 +962,70 @@ static void test_combo_setfont(void) DeleteObject(hf); }
+static int test_wm_measureitem_count; + +static LRESULT CALLBACK test_measure_item_wnd_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) +{ + if (msg == WM_MEASUREITEM) + { + MEASUREITEMSTRUCT *m = (MEASUREITEMSTRUCT *)lparam; + unsigned int expected; + + ++test_wm_measureitem_count; + ok(m->CtlType == ODT_COMBOBOX, "got %#x.\n", m->CtlType); + ok(m->CtlID == COMBO_ID, "got %u.\n", m->CtlID); + expected = get_font_height(GetStockObject(SYSTEM_FONT)) + 2; + if (m->itemID == -1) + { + ok(m->itemHeight == expected, "got %u, expected %u.\n", m->itemHeight, expected); + m->itemHeight = expected + 4; + } + return TRUE; + } + return DefWindowProcA(hwnd, msg, wparam, lparam); +} + +static void test_combo_measureitem(DWORD style) +{ + unsigned int expected; + HWND parent, combo; + WNDCLASSW wc; + RECT r; + + wc.style = CS_HREDRAW | CS_VREDRAW; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = GetModuleHandleA(NULL); + wc.hIcon = NULL; + wc.hCursor = LoadCursorA(NULL, (LPCSTR)IDC_ARROW); + wc.hbrBackground = GetSysColorBrush(COLOR_WINDOW); + wc.lpszMenuName = NULL; + wc.lpszClassName = L"test_measure_item"; + wc.lpfnWndProc = test_measure_item_wnd_proc; + RegisterClassW(&wc); + + winetest_push_context("style %#lx", style); + parent = CreateWindowA("test_measure_item", "Test measure", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 10, 10, 300, 300, NULL, NULL, NULL, 0); + test_wm_measureitem_count = 0; + combo = CreateWindowA("ComboBox", "Combo", WS_VISIBLE|WS_CHILD|style, 5, 5, 100, 100, parent, (HMENU)COMBO_ID, NULL, 0); + if (style & CBS_OWNERDRAWFIXED) + ok(test_wm_measureitem_count == 2, "got %d.\n", test_wm_measureitem_count); + else if (style & CBS_OWNERDRAWVARIABLE) + ok(test_wm_measureitem_count == 1, "got %d.\n", test_wm_measureitem_count); + else + ok(!test_wm_measureitem_count, "got %d.\n", test_wm_measureitem_count); + GetClientRect(combo, &r); + expected = get_font_height(GetStockObject(SYSTEM_FONT)) + 8; + if (style & (CBS_OWNERDRAWFIXED | CBS_OWNERDRAWVARIABLE)) + expected += 4; + expect_rect(r, 0, 0, 100, expected); + + DestroyWindow(combo); + DestroyWindow(parent); + UnregisterClassW(L"test_measure_item", GetModuleHandleA(NULL)); + winetest_pop_context(); +} + START_TEST(combo) { brush_red = CreateSolidBrush(RGB(255, 0, 0)); @@ -986,6 +1050,10 @@ START_TEST(combo) test_listbox_size(CBS_DROPDOWN); test_combo_ctlcolor(); test_combo_setfont(); + test_combo_measureitem(CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED); + test_combo_measureitem(CBS_DROPDOWNLIST | CBS_OWNERDRAWVARIABLE); + test_combo_measureitem(CBS_DROPDOWNLIST); + test_combo_measureitem(CBS_DROPDOWN | CBS_OWNERDRAWFIXED);
DestroyWindow(hMainWnd); DeleteObject(brush_red);