static void test_selection(DWORD style, const char * const text[], const int *edit, const int *list) { INT idx; HWND hCombo; hCombo = build_combo(style); SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)text[0]); SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)text[1]); SendMessage(hCombo, CB_SETCURSEL, -1, 0); old_parent_proc = (void *)SetWindowLongPtr(hMainWnd, GWLP_WNDPROC, (ULONG_PTR)parent_wnd_proc); idx = SendMessage(hCombo, CB_GETCURSEL, 0, 0); ok(idx == -1, "expected selection -1, got %d\n", idx); /* keyboard navigation */ expected_list_text = text[list[0]]; expected_edit_text = text[edit[0]]; selchange_fired = FALSE; SendMessage(hCombo, WM_KEYDOWN, VK_DOWN, 0); ok(selchange_fired, "CBN_SELCHANGE not sent!\n"); expected_list_text = text[list[1]]; expected_edit_text = text[edit[1]]; selchange_fired = FALSE; SendMessage(hCombo, WM_KEYDOWN, VK_DOWN, 0); ok(selchange_fired, "CBN_SELCHANGE not sent!\n"); expected_list_text = text[list[2]]; expected_edit_text = text[edit[2]]; selchange_fired = FALSE; SendMessage(hCombo, WM_KEYDOWN, VK_UP, 0); ok(selchange_fired, "CBN_SELCHANGE not sent!\n"); /* programmatic navigation */ expected_list_text = text[list[3]]; expected_edit_text = text[edit[3]]; selchange_fired = FALSE; SendMessage(hCombo, CB_SETCURSEL, list[3], 0); ok(!selchange_fired, "CBN_SELCHANGE sent!\n"); expected_list_text = text[list[4]]; expected_edit_text = text[edit[4]]; selchange_fired = FALSE; SendMessage(hCombo, CB_SETCURSEL, list[4], 0); ok(!selchange_fired, "CBN_SELCHANGE sent!\n"); SetWindowLongPtr(hMainWnd, GWLP_WNDPROC, (ULONG_PTR)old_parent_proc); DestroyWindow(hCombo); }
static void test_listbox_styles(DWORD cb_style) { BOOL (WINAPI *pGetComboBoxInfo)(HWND, PCOMBOBOXINFO); HWND combo; COMBOBOXINFO info; DWORD style, exstyle, expect_style, expect_exstyle; BOOL ret; pGetComboBoxInfo = (void*)GetProcAddress(GetModuleHandleA("user32.dll"), "GetComboBoxInfo"); if (!pGetComboBoxInfo){ win_skip("GetComboBoxInfo is not available\n"); return; } expect_style = WS_CHILD|WS_CLIPSIBLINGS|LBS_COMBOBOX|LBS_HASSTRINGS|LBS_NOTIFY; if (cb_style == CBS_SIMPLE) { expect_style |= WS_VISIBLE; expect_exstyle = WS_EX_CLIENTEDGE; } else { expect_style |= WS_BORDER; expect_exstyle = WS_EX_TOOLWINDOW; } combo = build_combo(cb_style); info.cbSize = sizeof(COMBOBOXINFO); SetLastError(0xdeadbeef); ret = pGetComboBoxInfo(combo, &info); ok(ret, "Failed to get combobox info structure.\n"); style = GetWindowLongW( info.hwndList, GWL_STYLE ); exstyle = GetWindowLongW( info.hwndList, GWL_EXSTYLE ); ok(style == expect_style, "%08x: got %08x\n", cb_style, style); ok(exstyle == expect_exstyle, "%08x: got %08x\n", cb_style, exstyle); if (cb_style != CBS_SIMPLE) expect_exstyle |= WS_EX_TOPMOST; SendMessageW(combo, CB_SHOWDROPDOWN, TRUE, 0 ); style = GetWindowLongW( info.hwndList, GWL_STYLE ); exstyle = GetWindowLongW( info.hwndList, GWL_EXSTYLE ); ok(style == (expect_style | WS_VISIBLE), "%08x: got %08x\n", cb_style, style); ok(exstyle == expect_exstyle, "%08x: got %08x\n", cb_style, exstyle); SendMessageW(combo, CB_SHOWDROPDOWN, FALSE, 0 ); style = GetWindowLongW( info.hwndList, GWL_STYLE ); exstyle = GetWindowLongW( info.hwndList, GWL_EXSTYLE ); ok(style == expect_style, "%08x: got %08x\n", cb_style, style); ok(exstyle == expect_exstyle, "%08x: got %08x\n", cb_style, exstyle); DestroyWindow(combo); }
static void test_changesize( DWORD style) { HWND hCombo = build_combo(style); RECT rc; INT ddheight, clheight, ddwidth, clwidth; /* get initial measurements */ GetClientRect( hCombo, &rc); clheight = rc.bottom - rc.top; clwidth = rc.right - rc.left; SendMessageA(hCombo, CB_GETDROPPEDCONTROLRECT, 0, (LPARAM)&rc); ddheight = rc.bottom - rc.top; ddwidth = rc.right - rc.left; /* use MoveWindow to move & resize the combo */ /* first make it slightly smaller */ MoveWindow( hCombo, 10, 10, clwidth - 2, clheight - 2, TRUE); GetClientRect( hCombo, &rc); ok( rc.right - rc.left == clwidth - 2, "clientrect witdh is %d vs %d\n", rc.right - rc.left, clwidth - 2); ok( rc.bottom - rc.top == clheight, "clientrect height is %d vs %d\n", rc.bottom - rc.top, clheight); SendMessageA(hCombo, CB_GETDROPPEDCONTROLRECT, 0, (LPARAM)&rc); ok( rc.right - rc.left == clwidth - 2, "drop-down rect witdh is %d vs %d\n", rc.right - rc.left, clwidth - 2); ok( rc.bottom - rc.top == ddheight, "drop-down rect height is %d vs %d\n", rc.bottom - rc.top, ddheight); ok( rc.right - rc.left == ddwidth -2, "drop-down rect width is %d vs %d\n", rc.right - rc.left, ddwidth - 2); /* new cx, cy is slightly bigger than the initial values */ MoveWindow( hCombo, 10, 10, clwidth + 2, clheight + 2, TRUE); GetClientRect( hCombo, &rc); ok( rc.right - rc.left == clwidth + 2, "clientrect witdh is %d vs %d\n", rc.right - rc.left, clwidth + 2); ok( rc.bottom - rc.top == clheight, "clientrect height is %d vs %d\n", rc.bottom - rc.top, clheight); SendMessageA(hCombo, CB_GETDROPPEDCONTROLRECT, 0, (LPARAM)&rc); ok( rc.right - rc.left == clwidth + 2, "drop-down rect witdh is %d vs %d\n", rc.right - rc.left, clwidth + 2); todo_wine { ok( rc.bottom - rc.top == clheight + 2, "drop-down rect height is %d vs %d\n", rc.bottom - rc.top, clheight + 2); } DestroyWindow(hCombo); }
static void test_setitemheight(DWORD style) { HWND hCombo = build_combo(style); RECT r; int i; trace("Style %x\n", style); GetClientRect(hCombo, &r); expect_rect(r, 0, 0, 100, font_height(GetStockObject(SYSTEM_FONT)) + 8); SendMessageA(hCombo, CB_GETDROPPEDCONTROLRECT, 0, (LPARAM)&r); MapWindowPoints(HWND_DESKTOP, hMainWnd, (LPPOINT)&r, 2); todo_wine expect_rect(r, 5, 5, 105, 105); for (i = 1; i < 30; i++) { SendMessage(hCombo, CB_SETITEMHEIGHT, -1, i); GetClientRect(hCombo, &r); expect_eq(r.bottom - r.top, i + 6, int, "%d"); } DestroyWindow(hCombo); }
static void test_setfont(DWORD style) { HWND hCombo; HFONT hFont1, hFont2; RECT r; int i; if (!is_font_installed("Marlett")) { skip("Marlett font not available\n"); return; } trace("Style %x\n", style); hCombo = build_combo(style); hFont1 = CreateFont(10, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, SYMBOL_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH|FF_DONTCARE, "Marlett"); hFont2 = CreateFont(8, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, SYMBOL_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH|FF_DONTCARE, "Marlett"); GetClientRect(hCombo, &r); expect_rect(r, 0, 0, 100, font_height(GetStockObject(SYSTEM_FONT)) + 8); SendMessageA(hCombo, CB_GETDROPPEDCONTROLRECT, 0, (LPARAM)&r); MapWindowPoints(HWND_DESKTOP, hMainWnd, (LPPOINT)&r, 2); todo_wine expect_rect(r, 5, 5, 105, 105); /* The size of the dropped control is initially equal to the size of the window when it was created. The size of the calculated dropped area changes only by how much the selection area changes, not by how much the list area changes. */ if (font_height(hFont1) == 10 && font_height(hFont2) == 8) { SendMessage(hCombo, WM_SETFONT, (WPARAM)hFont1, FALSE); GetClientRect(hCombo, &r); expect_rect(r, 0, 0, 100, 18); SendMessageA(hCombo, CB_GETDROPPEDCONTROLRECT, 0, (LPARAM)&r); MapWindowPoints(HWND_DESKTOP, hMainWnd, (LPPOINT)&r, 2); todo_wine expect_rect(r, 5, 5, 105, 105 - (font_height(GetStockObject(SYSTEM_FONT)) - font_height(hFont1))); SendMessage(hCombo, WM_SETFONT, (WPARAM)hFont2, FALSE); GetClientRect(hCombo, &r); expect_rect(r, 0, 0, 100, 16); SendMessageA(hCombo, CB_GETDROPPEDCONTROLRECT, 0, (LPARAM)&r); MapWindowPoints(HWND_DESKTOP, hMainWnd, (LPPOINT)&r, 2); todo_wine expect_rect(r, 5, 5, 105, 105 - (font_height(GetStockObject(SYSTEM_FONT)) - font_height(hFont2))); SendMessage(hCombo, WM_SETFONT, (WPARAM)hFont1, FALSE); GetClientRect(hCombo, &r); expect_rect(r, 0, 0, 100, 18); SendMessageA(hCombo, CB_GETDROPPEDCONTROLRECT, 0, (LPARAM)&r); MapWindowPoints(HWND_DESKTOP, hMainWnd, (LPPOINT)&r, 2); todo_wine expect_rect(r, 5, 5, 105, 105 - (font_height(GetStockObject(SYSTEM_FONT)) - font_height(hFont1))); } else { ok(0, "Expected Marlett font heights 10/8, got %d/%d\n", font_height(hFont1), font_height(hFont2)); } for (i = 1; i < 30; i++) { HFONT hFont = CreateFont(i, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, SYMBOL_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH|FF_DONTCARE, "Marlett"); int height = font_height(hFont); SendMessage(hCombo, WM_SETFONT, (WPARAM)hFont, FALSE); GetClientRect(hCombo, &r); expect_eq(r.bottom - r.top, height + 8, int, "%d"); SendMessage(hCombo, WM_SETFONT, 0, FALSE); DeleteObject(hFont); } DestroyWindow(hCombo); DeleteObject(hFont1); DeleteObject(hFont2); }
static void test_editselection(void) { HWND hCombo; INT start,end; HWND hEdit; COMBOBOXINFO cbInfo; BOOL ret; DWORD len; BOOL (WINAPI *pGetComboBoxInfo)(HWND, PCOMBOBOXINFO); char edit[20]; pGetComboBoxInfo = (void*)GetProcAddress(GetModuleHandleA("user32.dll"), "GetComboBoxInfo"); if (!pGetComboBoxInfo){ win_skip("GetComboBoxInfo is not available\n"); return; } /* Build a combo */ hCombo = build_combo(CBS_SIMPLE); cbInfo.cbSize = sizeof(COMBOBOXINFO); SetLastError(0xdeadbeef); ret = pGetComboBoxInfo(hCombo, &cbInfo); ok(ret, "Failed to get combobox info structure. LastError=%d\n", GetLastError()); hEdit = cbInfo.hwndItem; /* Initially combo selection is empty*/ len = SendMessage(hCombo, CB_GETEDITSEL, 0,0); ok(LOWORD(len)==0, "Unexpected start position for selection %d\n", LOWORD(len)); ok(HIWORD(len)==0, "Unexpected end position for selection %d\n", HIWORD(len)); /* Set some text, and press a key to replace it */ edit[0] = 0x00; SendMessage(hCombo, WM_SETTEXT, 0, (LPARAM)"Jason1"); SendMessage(hCombo, WM_GETTEXT, sizeof(edit), (LPARAM)edit); ok(strcmp(edit, "Jason1")==0, "Unexpected text retrieved %s\n", edit); /* Now what is the selection - still empty */ SendMessage(hCombo, CB_GETEDITSEL, (WPARAM)&start, (WPARAM)&end); len = SendMessage(hCombo, CB_GETEDITSEL, 0,0); ok(LOWORD(len)==0, "Unexpected start position for selection %d\n", LOWORD(len)); ok(HIWORD(len)==0, "Unexpected end position for selection %d\n", HIWORD(len)); /* Give it focus, and it gets selected */ SendMessage(hCombo, WM_SETFOCUS, 0, (LPARAM)hEdit); SendMessage(hCombo, CB_GETEDITSEL, (WPARAM)&start, (WPARAM)&end); len = SendMessage(hCombo, CB_GETEDITSEL, 0,0); ok(LOWORD(len)==0, "Unexpected start position for selection %d\n", LOWORD(len)); ok(HIWORD(len)==6, "Unexpected end position for selection %d\n", HIWORD(len)); /* Now emulate a key press */ edit[0] = 0x00; SendMessage(hCombo, WM_CHAR, 'A', 0x1c0001); SendMessage(hCombo, WM_GETTEXT, sizeof(edit), (LPARAM)edit); ok(strcmp(edit, "A")==0, "Unexpected text retrieved %s\n", edit); len = SendMessage(hCombo, CB_GETEDITSEL, 0,0); ok(LOWORD(len)==1, "Unexpected start position for selection %d\n", LOWORD(len)); ok(HIWORD(len)==1, "Unexpected end position for selection %d\n", HIWORD(len)); /* Now what happens when it gets more focus a second time - it doesn't reselect */ SendMessage(hCombo, WM_SETFOCUS, 0, (LPARAM)hEdit); len = SendMessage(hCombo, CB_GETEDITSEL, 0,0); ok(LOWORD(len)==1, "Unexpected start position for selection %d\n", LOWORD(len)); ok(HIWORD(len)==1, "Unexpected end position for selection %d\n", HIWORD(len)); DestroyWindow(hCombo); /* Start again - Build a combo */ hCombo = build_combo(CBS_SIMPLE); cbInfo.cbSize = sizeof(COMBOBOXINFO); SetLastError(0xdeadbeef); ret = pGetComboBoxInfo(hCombo, &cbInfo); ok(ret, "Failed to get combobox info structure. LastError=%d\n", GetLastError()); hEdit = cbInfo.hwndItem; /* Set some text and give focus so it gets selected */ edit[0] = 0x00; SendMessage(hCombo, WM_SETTEXT, 0, (LPARAM)"Jason2"); SendMessage(hCombo, WM_GETTEXT, sizeof(edit), (LPARAM)edit); ok(strcmp(edit, "Jason2")==0, "Unexpected text retrieved %s\n", edit); SendMessage(hCombo, WM_SETFOCUS, 0, (LPARAM)hEdit); /* Now what is the selection */ SendMessage(hCombo, CB_GETEDITSEL, (WPARAM)&start, (WPARAM)&end); len = SendMessage(hCombo, CB_GETEDITSEL, 0,0); ok(LOWORD(len)==0, "Unexpected start position for selection %d\n", LOWORD(len)); ok(HIWORD(len)==6, "Unexpected end position for selection %d\n", HIWORD(len)); /* Now change the selection to the apparently invalid start -1, end -1 and show it means no selection (ie start -1) but cursor at end */ SendMessage(hCombo, CB_SETEDITSEL, 0, -1); edit[0] = 0x00; SendMessage(hCombo, WM_CHAR, 'A', 0x1c0001); SendMessage(hCombo, WM_GETTEXT, sizeof(edit), (LPARAM)edit); ok(strcmp(edit, "Jason2A")==0, "Unexpected text retrieved %s\n", edit); DestroyWindow(hCombo); }