https://git.reactos.org/?p=reactos.git;a=commitdiff;h=f37104dadfeaa8aa2a39ba...
commit f37104dadfeaa8aa2a39ba630c25d7d4b5627a0b Author: Amine Khaldi amine.khaldi@reactos.org AuthorDate: Tue Apr 3 13:25:05 2018 +0100 Commit: Amine Khaldi amine.khaldi@reactos.org CommitDate: Tue Apr 3 13:25:05 2018 +0100
[COMCTL32_WINETEST] Sync with Wine Staging 3.3. CORE-14434 --- modules/rostests/winetests/comctl32/animate.c | 32 +- modules/rostests/winetests/comctl32/button.c | 123 ++++--- modules/rostests/winetests/comctl32/combo.c | 158 +++++++-- modules/rostests/winetests/comctl32/datetime.c | 43 ++- modules/rostests/winetests/comctl32/dpa.c | 91 +++--- modules/rostests/winetests/comctl32/edit.c | 305 +++++++++++------ modules/rostests/winetests/comctl32/header.c | 157 +++++---- modules/rostests/winetests/comctl32/imagelist.c | 245 ++++++++------ modules/rostests/winetests/comctl32/ipaddress.c | 36 +-- modules/rostests/winetests/comctl32/listbox.c | 116 +++++-- modules/rostests/winetests/comctl32/listview.c | 395 +++++++++++++++-------- modules/rostests/winetests/comctl32/misc.c | 14 +- modules/rostests/winetests/comctl32/monthcal.c | 38 ++- modules/rostests/winetests/comctl32/mru.c | 47 ++- modules/rostests/winetests/comctl32/msg.h | 16 +- modules/rostests/winetests/comctl32/pager.c | 7 +- modules/rostests/winetests/comctl32/precomp.h | 1 + modules/rostests/winetests/comctl32/progress.c | 143 ++++++-- modules/rostests/winetests/comctl32/propsheet.c | 96 ++++-- modules/rostests/winetests/comctl32/rebar.c | 63 ++-- modules/rostests/winetests/comctl32/static.c | 16 +- modules/rostests/winetests/comctl32/status.c | 28 +- modules/rostests/winetests/comctl32/subclass.c | 19 +- modules/rostests/winetests/comctl32/syslink.c | 7 +- modules/rostests/winetests/comctl32/tab.c | 395 +++++++++++++---------- modules/rostests/winetests/comctl32/taskdialog.c | 16 +- modules/rostests/winetests/comctl32/toolbar.c | 93 ++++-- modules/rostests/winetests/comctl32/tooltips.c | 244 ++++++++++++-- modules/rostests/winetests/comctl32/trackbar.c | 34 +- modules/rostests/winetests/comctl32/treeview.c | 197 ++++++++--- modules/rostests/winetests/comctl32/updown.c | 28 +- modules/rostests/winetests/comctl32/v6util.h | 54 +--- 32 files changed, 2224 insertions(+), 1033 deletions(-)
diff --git a/modules/rostests/winetests/comctl32/animate.c b/modules/rostests/winetests/comctl32/animate.c index 9324acd0e6..6fcb847404 100644 --- a/modules/rostests/winetests/comctl32/animate.c +++ b/modules/rostests/winetests/comctl32/animate.c @@ -17,7 +17,15 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include "precomp.h" +#include <stdarg.h> + +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "winuser.h" +#include "commctrl.h" + +#include "wine/test.h"
#define SEARCHING_AVI_INDEX 151 /* From shell32 resource library */ #define INVALID_AVI_INDEX 0xffff @@ -100,26 +108,6 @@ static void create_animate(DWORD parent_style, DWORD animate_style) update_window(hAnimateParentWnd); }
-static void init(void) -{ - HMODULE hComctl32; - BOOL (WINAPI *pInitCommonControlsEx)(const INITCOMMONCONTROLSEX*); - - hComctl32 = GetModuleHandleA("comctl32.dll"); - pInitCommonControlsEx = (void*)GetProcAddress(hComctl32, "InitCommonControlsEx"); - if (pInitCommonControlsEx) - { - INITCOMMONCONTROLSEX iccex; - iccex.dwSize = sizeof(iccex); - iccex.dwICC = ICC_ANIMATE_CLASS; - pInitCommonControlsEx(&iccex); - } - else - InitCommonControls(); - - shell32 = LoadLibraryA("Shell32.dll"); -} - static void destroy_animate(void) { MSG msg; @@ -167,7 +155,7 @@ static void test_play(void)
START_TEST(animate) { - init(); + shell32 = LoadLibraryA("Shell32.dll");
test_play();
diff --git a/modules/rostests/winetests/comctl32/button.c b/modules/rostests/winetests/comctl32/button.c index ccc052b327..d73fc1da9b 100644 --- a/modules/rostests/winetests/comctl32/button.c +++ b/modules/rostests/winetests/comctl32/button.c @@ -22,13 +22,10 @@
#undef USE_WINE_TODOS
-#include "wine/test.h" - -#include <assert.h> -#include <wingdi.h> -#include <winuser.h> +#include <windows.h> #include <commctrl.h>
+#include "wine/test.h" #include "v6util.h" #include "msg.h"
@@ -59,20 +56,14 @@ struct wndclass_redirect_data /* returned pointer is valid as long as activation context is alive */ static WCHAR* get_versioned_classname(const WCHAR *name) { - BOOL (WINAPI *pFindActCtxSectionStringW)(DWORD,const GUID *,ULONG,LPCWSTR,PACTCTX_SECTION_KEYED_DATA); struct wndclass_redirect_data *wnddata; ACTCTX_SECTION_KEYED_DATA data; BOOL ret;
- pFindActCtxSectionStringW = (void*)GetProcAddress(GetModuleHandleA("kernel32"), "FindActCtxSectionStringW"); - memset(&data, 0, sizeof(data)); data.cbSize = sizeof(data); - - ret = pFindActCtxSectionStringW(0, NULL, - ACTIVATION_CONTEXT_SECTION_WINDOW_CLASS_REDIRECTION, - name, &data); - ok(ret, "got %d, error %u\n", ret, GetLastError()); + ret = FindActCtxSectionStringW(0, NULL, ACTIVATION_CONTEXT_SECTION_WINDOW_CLASS_REDIRECTION, name, &data); + ok(ret, "Failed to find class redirection section, error %u\n", GetLastError()); wnddata = (struct wndclass_redirect_data*)data.lpData; return (WCHAR*)((BYTE*)wnddata + wnddata->name_offset); } @@ -361,8 +352,6 @@ static const struct message setstate_seq[] = { BM_SETSTATE, sent }, { WM_APP, sent|wparam|lparam, 0, 0 }, { WM_PAINT, sent }, - { WM_NCPAINT, sent|optional }, /* FIXME: Wine sends it */ - { WM_ERASEBKGND, sent|defwinproc|optional }, { WM_PAINT, sent|optional }, { 0 } }; @@ -383,8 +372,6 @@ static const struct message setstate_user_seq[] = { WM_COMMAND, sent|wparam|parent, MAKEWPARAM(ID_BUTTON, BN_HILITE) }, { WM_APP, sent|wparam|lparam, 0, 0 }, { WM_PAINT, sent }, - { WM_NCPAINT, sent|optional }, /* FIXME: Wine sends it */ - { WM_ERASEBKGND, sent|defwinproc|optional }, { 0 } };
@@ -455,8 +442,7 @@ static const struct message setcheck_radio_redraw_seq[] = { WM_STYLECHANGED, sent|wparam|defwinproc, GWL_STYLE }, { WM_APP, sent|wparam|lparam, 0, 0 }, { WM_PAINT, sent }, - { WM_NCPAINT, sent|optional }, /* FIXME: Wine sends it */ - { WM_ERASEBKGND, sent|defwinproc|optional }, + { WM_NCPAINT, sent|defwinproc|optional }, /* FIXME: Wine sends it */ { 0 } };
@@ -470,7 +456,7 @@ static HWND create_button(DWORD style, HWND parent) style |= WS_CHILD|BS_NOTIFY; menuid = (HMENU)ID_BUTTON; } - hwnd = CreateWindowExA(0, "Button", "test", style, 0, 0, 50, 14, parent, menuid, 0, NULL); + hwnd = CreateWindowExA(0, WC_BUTTONA, "test", style, 0, 0, 50, 14, parent, menuid, 0, NULL); ok(hwnd != NULL, "failed to create a button, 0x%08x, %p\n", style, parent); pSetWindowSubclass(hwnd, button_subclass_proc, 0, 0); return hwnd; @@ -522,12 +508,25 @@ static void test_button_messages(void) { BS_OWNERDRAW, DLGC_BUTTON, setfocus_ownerdraw_seq, killfocus_ownerdraw_seq, setstyle_ownerdraw_seq, setstate_ownerdraw_seq, clearstate_ownerdraw_seq, setcheck_ignored_seq }, + { BS_SPLITBUTTON, DLGC_BUTTON | DLGC_UNDEFPUSHBUTTON | DLGC_WANTARROWS, + setfocus_seq, killfocus_seq, setstyle_seq, + setstate_seq, setstate_seq, setcheck_ignored_seq }, + { BS_DEFSPLITBUTTON, DLGC_BUTTON | DLGC_DEFPUSHBUTTON | DLGC_WANTARROWS, + setfocus_seq, killfocus_seq, setstyle_seq, + setstate_seq, setstate_seq, setcheck_ignored_seq }, + { BS_COMMANDLINK, DLGC_BUTTON | DLGC_UNDEFPUSHBUTTON, + setfocus_seq, killfocus_seq, setstyle_seq, + setstate_seq, setstate_seq, setcheck_ignored_seq }, + { BS_DEFCOMMANDLINK, DLGC_BUTTON | DLGC_DEFPUSHBUTTON, + setfocus_seq, killfocus_seq, setstyle_seq, + setstate_seq, setstate_seq, setcheck_ignored_seq }, }; + LOGFONTA logfont = { 0 }; const struct message *seq; + HFONT zfont, hfont2; unsigned int i; HWND hwnd, parent; DWORD dlg_code; - HFONT zfont; BOOL todo;
/* selection with VK_SPACE should capture button window */ @@ -544,10 +543,19 @@ static void test_button_messages(void) 100, 100, 200, 200, 0, 0, 0, NULL); ok(parent != 0, "Failed to create parent window\n");
+ logfont.lfHeight = -12; + logfont.lfWeight = FW_NORMAL; + strcpy(logfont.lfFaceName, "Tahoma"); + + hfont2 = CreateFontIndirectA(&logfont); + ok(hfont2 != NULL, "Failed to create Tahoma font\n"); + for (i = 0; i < sizeof(button)/sizeof(button[0]); i++) { + HFONT prevfont, hfont; MSG msg; DWORD style, state; + HDC hdc;
trace("%d: button test sequence\n", i); hwnd = create_button(button[i].style, parent); @@ -561,7 +569,15 @@ static void test_button_messages(void) ok(style == button[i].style, "expected style %x got %x\n", button[i].style, style);
dlg_code = SendMessageA(hwnd, WM_GETDLGCODE, 0, 0); - ok(dlg_code == button[i].dlg_code, "%u: wrong dlg_code %08x\n", i, dlg_code); + if (button[i].style == BS_SPLITBUTTON || + button[i].style == BS_DEFSPLITBUTTON || + button[i].style == BS_COMMANDLINK || + button[i].style == BS_DEFCOMMANDLINK) + { + ok(dlg_code == button[i].dlg_code || broken(dlg_code == DLGC_BUTTON) /* WinXP */, "%u: wrong dlg_code %08x\n", i, dlg_code); + } + else + ok(dlg_code == button[i].dlg_code, "%u: wrong dlg_code %08x\n", i, dlg_code);
ShowWindow(hwnd, SW_SHOW); UpdateWindow(hwnd); @@ -587,7 +603,8 @@ static void test_button_messages(void) SendMessageA(hwnd, BM_SETSTYLE, button[i].style | BS_BOTTOM, TRUE); SendMessageA(hwnd, WM_APP, 0, 0); /* place a separator mark here */ while (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE)) DispatchMessageA(&msg); - ok_sequence(sequences, COMBINED_SEQ_INDEX, button[i].setstyle, "BM_SETSTYLE on a button", TRUE); + todo = button[i].style == BS_OWNERDRAW; + ok_sequence(sequences, COMBINED_SEQ_INDEX, button[i].setstyle, "BM_SETSTYLE on a button", todo);
style = GetWindowLongA(hwnd, GWL_STYLE); style &= ~(WS_VISIBLE | WS_CHILD | BS_NOTIFY); @@ -602,7 +619,7 @@ static void test_button_messages(void) SendMessageA(hwnd, BM_SETSTATE, TRUE, 0); SendMessageA(hwnd, WM_APP, 0, 0); /* place a separator mark here */ while (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE)) DispatchMessageA(&msg); - ok_sequence(sequences, COMBINED_SEQ_INDEX, button[i].setstate, "BM_SETSTATE/TRUE on a button", TRUE); + ok_sequence(sequences, COMBINED_SEQ_INDEX, button[i].setstate, "BM_SETSTATE/TRUE on a button", FALSE);
state = SendMessageA(hwnd, BM_GETSTATE, 0, 0); ok(state == BST_PUSHED, "expected state 0x0004, got %04x\n", state); @@ -616,7 +633,7 @@ static void test_button_messages(void) SendMessageA(hwnd, BM_SETSTATE, FALSE, 0); SendMessageA(hwnd, WM_APP, 0, 0); /* place a separator mark here */ while (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE)) DispatchMessageA(&msg); - ok_sequence(sequences, COMBINED_SEQ_INDEX, button[i].clearstate, "BM_SETSTATE/FALSE on a button", TRUE); + ok_sequence(sequences, COMBINED_SEQ_INDEX, button[i].clearstate, "BM_SETSTATE/FALSE on a button", FALSE);
state = SendMessageA(hwnd, BM_GETSTATE, 0, 0); ok(state == 0, "expected state 0, got %04x\n", state); @@ -634,17 +651,14 @@ static void test_button_messages(void) button[i].style == BS_AUTORADIOBUTTON) { seq = setcheck_radio_seq; - todo = TRUE; } else - { seq = setcheck_ignored_seq; - todo = FALSE; - } + SendMessageA(hwnd, BM_SETCHECK, BST_UNCHECKED, 0); SendMessageA(hwnd, WM_APP, 0, 0); /* place a separator mark here */ while (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE)) DispatchMessageA(&msg); - ok_sequence(sequences, COMBINED_SEQ_INDEX, seq, "BM_SETCHECK on a button", todo); + ok_sequence(sequences, COMBINED_SEQ_INDEX, seq, "BM_SETCHECK on a button", FALSE);
state = SendMessageA(hwnd, BM_GETCHECK, 0, 0); ok(state == BST_UNCHECKED, "expected BST_UNCHECKED, got %04x\n", state); @@ -658,23 +672,23 @@ static void test_button_messages(void) SendMessageA(hwnd, BM_SETCHECK, BST_CHECKED, 0); SendMessageA(hwnd, WM_APP, 0, 0); /* place a separator mark here */ while (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE)) DispatchMessageA(&msg); + ok_sequence(sequences, COMBINED_SEQ_INDEX, button[i].setcheck, "BM_SETCHECK on a button", FALSE);
+ state = SendMessageA(hwnd, BM_GETCHECK, 0, 0); if (button[i].style == BS_PUSHBUTTON || button[i].style == BS_DEFPUSHBUTTON || button[i].style == BS_GROUPBOX || button[i].style == BS_USERBUTTON || - button[i].style == BS_OWNERDRAW) + button[i].style == BS_OWNERDRAW || + button[i].style == BS_SPLITBUTTON || + button[i].style == BS_DEFSPLITBUTTON || + button[i].style == BS_COMMANDLINK || + button[i].style == BS_DEFCOMMANDLINK) { - ok_sequence(sequences, COMBINED_SEQ_INDEX, button[i].setcheck, "BM_SETCHECK on a button", FALSE); - state = SendMessageA(hwnd, BM_GETCHECK, 0, 0); ok(state == BST_UNCHECKED, "expected check BST_UNCHECKED, got %04x\n", state); } else - { - ok_sequence(sequences, COMBINED_SEQ_INDEX, button[i].setcheck, "BM_SETCHECK on a button", TRUE); - state = SendMessageA(hwnd, BM_GETCHECK, 0, 0); ok(state == BST_CHECKED, "expected check BST_CHECKED, got %04x\n", state); - }
style = GetWindowLongA(hwnd, GWL_STYLE); style &= ~(WS_CHILD | BS_NOTIFY | WS_VISIBLE); @@ -684,9 +698,32 @@ static void test_button_messages(void) else ok(style == button[i].style, "expected style %04x got %04x\n", button[i].style, style);
+ /* Test that original font is not selected back after painting */ + hfont = (HFONT)SendMessageA(hwnd, WM_GETFONT, 0, 0); + ok(hfont == NULL, "Unexpected control font.\n"); + + SendMessageA(hwnd, WM_SETFONT, (WPARAM)GetStockObject(SYSTEM_FONT), 0); + + hdc = CreateCompatibleDC(0); + + prevfont = SelectObject(hdc, hfont2); + SendMessageA(hwnd, WM_PRINTCLIENT, (WPARAM)hdc, 0); + ok(hfont2 != GetCurrentObject(hdc, OBJ_FONT) || broken(hfont2 == GetCurrentObject(hdc, OBJ_FONT)) /* WinXP */, + "button[%u]: unexpected font selected after WM_PRINTCLIENT\n", i); + SelectObject(hdc, prevfont); + + prevfont = SelectObject(hdc, hfont2); + SendMessageA(hwnd, WM_PAINT, (WPARAM)hdc, 0); + ok(hfont2 != GetCurrentObject(hdc, OBJ_FONT) || broken(hfont2 == GetCurrentObject(hdc, OBJ_FONT)) /* WinXP */, + "button[%u]: unexpected font selected after WM_PAINT\n", i); + SelectObject(hdc, prevfont); + + DeleteDC(hdc); + DestroyWindow(hwnd); }
+ DeleteObject(hfont2); DestroyWindow(parent);
hwnd = create_button(BS_PUSHBUTTON, NULL); @@ -726,21 +763,22 @@ static void test_button_class(void)
ret = GetClassInfoExA(NULL, WC_BUTTONA, &exA); ok(ret, "got %d\n", ret); -todo_wine ok(IS_WNDPROC_HANDLE(exA.lpfnWndProc), "got %p\n", exA.lpfnWndProc); + ok(exA.cbClsExtra == 0, "Unexpected class bytes %d.\n", exA.cbClsExtra); + ok(exA.cbWndExtra == sizeof(void *), "Unexpected window bytes %d.\n", exA.cbWndExtra);
ret = GetClassInfoExW(NULL, WC_BUTTONW, &exW); ok(ret, "got %d\n", ret); ok(!IS_WNDPROC_HANDLE(exW.lpfnWndProc), "got %p\n", exW.lpfnWndProc); + ok(exW.cbClsExtra == 0, "Unexpected class bytes %d.\n", exW.cbClsExtra); + ok(exW.cbWndExtra == sizeof(void *), "Unexpected window bytes %d.\n", exW.cbWndExtra);
/* check that versioned class is also accessible */ nameW = get_versioned_classname(WC_BUTTONW); ok(lstrcmpW(nameW, WC_BUTTONW), "got %s\n", wine_dbgstr_w(nameW));
ret = GetClassInfoExW(NULL, nameW, &ex2W); -todo_wine ok(ret, "got %d\n", ret); -if (ret) /* TODO: remove once Wine is fixed */ ok(ex2W.lpfnWndProc == exW.lpfnWndProc, "got %p, %p\n", exW.lpfnWndProc, ex2W.lpfnWndProc);
/* Check reported class name */ @@ -756,10 +794,8 @@ if (ret) /* TODO: remove once Wine is fixed */
/* explicitly create with versioned class name */ hwnd = CreateWindowExW(0, nameW, testW, BS_CHECKBOX, 0, 0, 50, 14, NULL, 0, 0, NULL); -todo_wine ok(hwnd != NULL, "failed to create a window %s\n", wine_dbgstr_w(nameW)); -if (hwnd) -{ + len = GetClassNameA(hwnd, buffA, sizeof(buffA)); ok(len == strlen(buffA), "got %d\n", len); ok(!strcmp(buffA, "Button"), "got %s\n", buffA); @@ -770,7 +806,6 @@ if (hwnd)
DestroyWindow(hwnd); } -}
static void register_parent_class(void) { diff --git a/modules/rostests/winetests/comctl32/combo.c b/modules/rostests/winetests/comctl32/combo.c index ca493c0cea..83b36f212f 100644 --- a/modules/rostests/winetests/comctl32/combo.c +++ b/modules/rostests/winetests/comctl32/combo.c @@ -18,7 +18,14 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include "precomp.h" +#include <limits.h> +#include <stdio.h> +#include <windows.h> +#include <commctrl.h> + +#include "wine/test.h" +#include "v6util.h" +#include "msg.h"
#define EDITBOX_SEQ_INDEX 0 #define NUM_MSG_SEQUENCES 1 @@ -150,7 +157,7 @@ static void test_comboex(void) *out_of_range_item = "Out of Range Item";
/* Allocate space for result */ - textBuffer = HeapAlloc(GetProcessHeap(), 0, MAX_CHARS); + textBuffer = heap_alloc(MAX_CHARS);
/* Basic comboboxex test */ myHwnd = createComboEx(WS_BORDER | WS_VISIBLE | WS_CHILD | CBS_DROPDOWN); @@ -236,7 +243,7 @@ static void test_comboex(void)
/* Cleanup */ - HeapFree(GetProcessHeap(), 0, textBuffer); + heap_free(textBuffer); DestroyWindow(myHwnd); }
@@ -473,25 +480,20 @@ static LRESULT CALLBACK ComboExTestWndProc(HWND hWnd, UINT msg, WPARAM wParam, L return 0L; }
-static BOOL init(void) +static void init_functions(void) { - HMODULE hComctl32; - BOOL (WINAPI *pInitCommonControlsEx)(const INITCOMMONCONTROLSEX*); - WNDCLASSA wc; - INITCOMMONCONTROLSEX iccex; + HMODULE hComCtl32 = LoadLibraryA("comctl32.dll");
- hComctl32 = GetModuleHandleA("comctl32.dll"); - pInitCommonControlsEx = (void*)GetProcAddress(hComctl32, "InitCommonControlsEx"); - if (!pInitCommonControlsEx) - { - win_skip("InitCommonControlsEx() is missing. Skipping the tests\n"); - return FALSE; - } - iccex.dwSize = sizeof(iccex); - iccex.dwICC = ICC_USEREX_CLASSES; - pInitCommonControlsEx(&iccex); +#define X(f) p##f = (void*)GetProcAddress(hComCtl32, #f); +#define X2(f, ord) p##f = (void*)GetProcAddress(hComCtl32, (const char *)ord); + X2(SetWindowSubclass, 410); +#undef X +#undef X2 +}
- pSetWindowSubclass = (void*)GetProcAddress(hComctl32, (LPSTR)410); +static BOOL init(void) +{ + WNDCLASSA wc;
wc.style = CS_HREDRAW | CS_VREDRAW; wc.cbClsExtra = 0; @@ -505,7 +507,7 @@ static BOOL init(void) wc.lpfnWndProc = ComboExTestWndProc; RegisterClassA(&wc);
- hMainWnd = CreateWindowA("static", "Test", WS_OVERLAPPEDWINDOW, 10, 10, 300, 300, NULL, NULL, NULL, 0); + hMainWnd = CreateWindowA(WC_STATICA, "Test", WS_OVERLAPPEDWINDOW, 10, 10, 300, 300, NULL, NULL, NULL, 0); ShowWindow(hMainWnd, SW_SHOW);
hComboExParentWnd = CreateWindowExA(0, ComboExTestClass, "ComboEx test", WS_OVERLAPPEDWINDOW|WS_VISIBLE, @@ -604,7 +606,7 @@ static void test_comboex_get_set_item(void)
static HWND create_combobox(DWORD style) { - return CreateWindowA("ComboBox", "Combo", WS_VISIBLE|WS_CHILD|style, 5, 5, 100, 100, hMainWnd, (HMENU)COMBO_ID, NULL, 0); + return CreateWindowA(WC_COMBOBOXA, "Combo", WS_VISIBLE|WS_CHILD|style, 5, 5, 100, 100, hMainWnd, (HMENU)COMBO_ID, NULL, 0); }
static int font_height(HFONT hFont) @@ -1033,7 +1035,7 @@ static void test_combo_editselection_focus(DWORD style) get_combobox_info(hCombo, &cbInfo); hEdit = cbInfo.hwndItem;
- hButton = CreateWindowA("Button", "OK", WS_VISIBLE|WS_CHILD|BS_DEFPUSHBUTTON, + hButton = CreateWindowA(WC_BUTTONA, "OK", WS_VISIBLE|WS_CHILD|BS_DEFPUSHBUTTON, 5, 50, 100, 20, hMainWnd, NULL, (HINSTANCE)GetWindowLongPtrA(hMainWnd, GWLP_HINSTANCE), NULL);
@@ -1149,11 +1151,121 @@ static void test_combo_WS_VSCROLL(void) DestroyWindow(hCombo); }
+static void test_combo_dropdown_size(DWORD style) +{ + static const char wine_test[] = "Wine Test"; + HWND hCombo, hList; + COMBOBOXINFO cbInfo; + int i, test, ret; + + static const struct list_size_info + { + int num_items; + int height_combo; + int limit; + } info_height[] = { + {33, 50, -1}, + {35, 50, 40}, + {15, 50, 3}, + }; + + for (test = 0; test < sizeof(info_height) / sizeof(info_height[0]); test++) + { + const struct list_size_info *info_test = &info_height[test]; + int height_item; /* Height of a list item */ + int height_list; /* Height of the list we got */ + int expected_height_list; + RECT rect_list_client; + int min_visible_expected; + + hCombo = CreateWindowA(WC_COMBOBOXA, "Combo", CBS_DROPDOWN | WS_VISIBLE | WS_CHILD | style, 5, 5, 100, + 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); + ret = SendMessageA(hCombo, CB_GETCOMBOBOXINFO, 0, (LPARAM)&cbInfo); + ok(ret, "Failed to get combo info, %d\n", ret); + + hList = cbInfo.hwndList; + for (i = 0; i < info_test->num_items; i++) + { + ret = SendMessageA(hCombo, CB_ADDSTRING, 0, (LPARAM) wine_test); + ok(ret == i, "Failed to add string %d, returned %d.\n", i, ret); + } + + if (info_test->limit != -1) + { + int min_visible_actual; + 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); + } + + ret = SendMessageA(hCombo, CB_SHOWDROPDOWN, TRUE,0); + ok(ret, "Failed to show dropdown.\n"); + ret = SendMessageA(hCombo, CB_GETDROPPEDSTATE, 0, 0); + ok(ret, "Unexpected dropped state.\n"); + + GetClientRect(hList, &rect_list_client); + height_list = rect_list_client.bottom - rect_list_client.top; + height_item = (int)SendMessageA(hList, LB_GETITEMHEIGHT, 0, 0); + + if (style & CBS_NOINTEGRALHEIGHT) + { + RECT rect_list_complete; + int list_height_nonclient; + int list_height_calculated; + int edit_padding_size = cbInfo.rcItem.top; /* edit client rect top is the padding it has to its parent + We assume it's the same on the bottom */ + + GetWindowRect(hList, &rect_list_complete); + + list_height_nonclient = (rect_list_complete.bottom - rect_list_complete.top) + - (rect_list_client.bottom - rect_list_client.top); + + /* Calculate the expected client size of the listbox popup from the size of the combobox. */ + list_height_calculated = info_test->height_combo /* Take height we created combobox with */ + - (cbInfo.rcItem.bottom - cbInfo.rcItem.top) /* Subtract size of edit control */ + - list_height_nonclient /* Subtract list nonclient area */ + - edit_padding_size * 2; /* subtract space around the edit control */ + + expected_height_list = min(list_height_calculated, height_item * info_test->num_items); + 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); + } + else + { + 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); + } + + DestroyWindow(hCombo); + } +} + START_TEST(combo) { ULONG_PTR ctx_cookie; HANDLE hCtx;
+ init_functions(); + if (!init()) return;
@@ -1188,6 +1300,8 @@ START_TEST(combo) test_combo_listbox_styles(CBS_SIMPLE); test_combo_listbox_styles(CBS_DROPDOWN); test_combo_listbox_styles(CBS_DROPDOWNLIST); + test_combo_dropdown_size(0); + test_combo_dropdown_size(CBS_NOINTEGRALHEIGHT);
cleanup(); unload_v6_module(ctx_cookie, hCtx); diff --git a/modules/rostests/winetests/comctl32/datetime.c b/modules/rostests/winetests/comctl32/datetime.c index 19ee52ba40..7742dc5d18 100644 --- a/modules/rostests/winetests/comctl32/datetime.c +++ b/modules/rostests/winetests/comctl32/datetime.c @@ -17,7 +17,12 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include "precomp.h" +#include <windows.h> +#include <commctrl.h> + +#include "wine/test.h" +#include "msg.h" +#include "v6util.h"
#define expect(EXPECTED, GOT) ok((GOT)==(EXPECTED), "Expected %d, got %ld\n", (EXPECTED), (GOT))
@@ -26,6 +31,8 @@ #define NUM_MSG_SEQUENCES 1 #define DATETIME_SEQ_INDEX 0
+static BOOL (WINAPI *pInitCommonControlsEx)(const INITCOMMONCONTROLSEX*); + static struct msg_sequence *sequences[NUM_MSG_SEQUENCES];
static const struct message test_dtm_set_format_seq[] = { @@ -773,19 +780,23 @@ static void test_dts_shownone(void) DestroyWindow(hwnd); }
+static void init_functions(void) +{ + HMODULE hComCtl32 = LoadLibraryA("comctl32.dll"); + +#define X(f) p##f = (void*)GetProcAddress(hComCtl32, #f); + X(InitCommonControlsEx); +#undef X +} + START_TEST(datetime) { - HMODULE hComctl32; - BOOL (WINAPI *pInitCommonControlsEx)(const INITCOMMONCONTROLSEX*); INITCOMMONCONTROLSEX iccex; + ULONG_PTR cookie; + HANDLE ctxt; + + init_functions();
- hComctl32 = GetModuleHandleA("comctl32.dll"); - pInitCommonControlsEx = (void*)GetProcAddress(hComctl32, "InitCommonControlsEx"); - if (!pInitCommonControlsEx) - { - win_skip("InitCommonControlsEx() is missing. Skipping the tests\n"); - return; - } iccex.dwSize = sizeof(iccex); iccex.dwICC = ICC_DATE_CLASSES; pInitCommonControlsEx(&iccex); @@ -802,4 +813,16 @@ START_TEST(datetime) test_dtm_set_and_get_systemtime_with_limits(); test_wm_set_get_text(); test_dts_shownone(); + + if (!load_v6_module(&cookie, &ctxt)) + return; + + test_dtm_set_format(); + test_dtm_set_and_get_mccolor(); + test_dtm_set_and_get_mcfont(); + test_dtm_get_monthcal(); + test_wm_set_get_text(); + test_dts_shownone(); + + unload_v6_module(cookie, ctxt); } diff --git a/modules/rostests/winetests/comctl32/dpa.c b/modules/rostests/winetests/comctl32/dpa.c index b72214533b..39f6b460e9 100644 --- a/modules/rostests/winetests/comctl32/dpa.c +++ b/modules/rostests/winetests/comctl32/dpa.c @@ -19,7 +19,18 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include "precomp.h" +#define COBJMACROS + +#include <stdarg.h> + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "commctrl.h" +#include "objidl.h" + +#include "wine/test.h" +#include "v6util.h"
#define expect(expected, got) ok(got == expected, "Expected %d, got %d\n", expected, got)
@@ -49,38 +60,33 @@ static INT (WINAPI *pDPA_Search)(HDPA,PVOID,INT,PFNDPACOMPARE,LPARAM,UINT); static BOOL (WINAPI *pDPA_SetPtr)(HDPA,INT,PVOID); static BOOL (WINAPI *pDPA_Sort)(HDPA,PFNDPACOMPARE,LPARAM);
-#define COMCTL32_GET_PROC(func, ord) \ - ((p ## func = (PVOID)GetProcAddress(hcomctl32,(LPCSTR)ord)) ? 1 \ - : (trace( #func " not exported\n"), 0)) - -static BOOL InitFunctionPtrs(HMODULE hcomctl32) +static void init_functions(void) { - /* 4.00+ */ - if(COMCTL32_GET_PROC(DPA_Clone, 331) && - COMCTL32_GET_PROC(DPA_Create, 328) && - COMCTL32_GET_PROC(DPA_CreateEx, 340) && - COMCTL32_GET_PROC(DPA_DeleteAllPtrs, 337) && - COMCTL32_GET_PROC(DPA_DeletePtr, 336) && - COMCTL32_GET_PROC(DPA_Destroy, 329) && - COMCTL32_GET_PROC(DPA_GetPtr, 332) && - COMCTL32_GET_PROC(DPA_GetPtrIndex, 333) && - COMCTL32_GET_PROC(DPA_Grow, 330) && - COMCTL32_GET_PROC(DPA_InsertPtr, 334) && - COMCTL32_GET_PROC(DPA_Search, 339) && - COMCTL32_GET_PROC(DPA_SetPtr, 335) && - COMCTL32_GET_PROC(DPA_Sort, 338)) - { - /* 4.71+ */ - COMCTL32_GET_PROC(DPA_DestroyCallback, 386) && - COMCTL32_GET_PROC(DPA_EnumCallback, 385) && - COMCTL32_GET_PROC(DPA_LoadStream, 9) && - COMCTL32_GET_PROC(DPA_Merge, 11) && - COMCTL32_GET_PROC(DPA_SaveStream, 10); - - return TRUE; - } + HMODULE hComCtl32 = LoadLibraryA("comctl32.dll");
- return FALSE; +#define X2(f, ord) p##f = (void*)GetProcAddress(hComCtl32, (const char *)ord); + /* 4.00+ */ + X2(DPA_Clone, 331); + X2(DPA_Create, 328); + X2(DPA_CreateEx, 340); + X2(DPA_DeleteAllPtrs, 337); + X2(DPA_DeletePtr, 336); + X2(DPA_Destroy, 329); + X2(DPA_GetPtr, 332); + X2(DPA_GetPtrIndex, 333); + X2(DPA_Grow, 330); + X2(DPA_InsertPtr, 334); + X2(DPA_Search, 339); + X2(DPA_SetPtr, 335); + X2(DPA_Sort, 338); + + /* 4.71+ */ + X2(DPA_DestroyCallback, 386); + X2(DPA_EnumCallback, 385); + X2(DPA_LoadStream, 9); + X2(DPA_Merge, 11); + X2(DPA_SaveStream, 10); +#undef X2 }
/* Callbacks */ @@ -618,7 +624,7 @@ static void test_DPA_LoadStream(void) dpa = NULL; hRes = pDPA_LoadStream(&dpa, CB_Load, pStm, NULL); expect(S_OK, hRes); - DPA_Destroy(dpa); + pDPA_Destroy(dpa);
/* try with altered dwData2 field */ header.dwSize = sizeof(header); @@ -732,15 +738,22 @@ if (0) {
START_TEST(dpa) { - HMODULE hcomctl32; + ULONG_PTR cookie; + HANDLE ctxt;
- hcomctl32 = GetModuleHandleA("comctl32.dll"); + init_functions();
- if(!InitFunctionPtrs(hcomctl32)) - { - win_skip("Needed functions are not available\n"); + test_dpa(); + test_DPA_Merge(); + test_DPA_EnumCallback(); + test_DPA_DestroyCallback(); + test_DPA_LoadStream(); + test_DPA_SaveStream(); + + if (!load_v6_module(&cookie, &ctxt)) return; - } + + init_functions();
test_dpa(); test_DPA_Merge(); @@ -748,4 +761,6 @@ START_TEST(dpa) test_DPA_DestroyCallback(); test_DPA_LoadStream(); test_DPA_SaveStream(); + + unload_v6_module(cookie, ctxt); } diff --git a/modules/rostests/winetests/comctl32/edit.c b/modules/rostests/winetests/comctl32/edit.c index 47196245a4..7e9e7e7634 100644 --- a/modules/rostests/winetests/comctl32/edit.c +++ b/modules/rostests/winetests/comctl32/edit.c @@ -18,7 +18,12 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include "precomp.h" +#include <windows.h> +#include <commctrl.h> + +#include "wine/test.h" +#include "v6util.h" +#include "msg.h"
#ifndef ES_COMBO #define ES_COMBO 0x200 @@ -28,6 +33,20 @@ #define ID_EDITTEST2 99 #define MAXLEN 200
+enum seq_index +{ + COMBINED_SEQ_INDEX = 0, + NUM_MSG_SEQUENCES, +}; + +enum msg_id +{ + PARENT_ID, + EDIT_ID, +}; + +static struct msg_sequence *sequences[NUM_MSG_SEQUENCES]; + struct edit_notify { int en_change, en_maxtext, en_update; }; @@ -540,14 +559,10 @@ static HWND create_editcontrol (DWORD style, DWORD exstyle) { HWND handle;
- handle = CreateWindowExA(exstyle, - "EDIT", - "Test Text", - style, - 10, 10, 300, 300, - NULL, NULL, hinst, NULL); + handle = CreateWindowExA(exstyle, WC_EDITA, "Text Text", style, 10, 10, 300, 300, + NULL, NULL, hinst, NULL); ok (handle != NULL, "CreateWindow EDIT Control failed\n"); - assert (handle); + if (winetest_interactive) ShowWindow (handle, SW_SHOW); return handle; @@ -582,7 +597,6 @@ static HWND create_child_editcontrol (DWORD style, DWORD exstyle) rect.right - rect.left, rect.bottom - rect.top, NULL, NULL, hinst, NULL); ok (parentWnd != NULL, "CreateWindow EDIT Test failed\n"); - assert(parentWnd);
editWnd = CreateWindowExA(exstyle, "EDIT", @@ -591,7 +605,6 @@ static HWND create_child_editcontrol (DWORD style, DWORD exstyle) 0, 0, 300, 300, parentWnd, NULL, hinst, NULL); ok (editWnd != NULL, "CreateWindow EDIT Test Text failed\n"); - assert(editWnd); if (winetest_interactive) ShowWindow (parentWnd, SW_SHOW); return editWnd; @@ -738,15 +751,14 @@ static void test_edit_control_2(void) /* Create main and edit windows. */ hwndMain = CreateWindowA(szEditTest2Class, "ET2", WS_OVERLAPPEDWINDOW, 0, 0, 200, 200, NULL, NULL, hinst, NULL); - assert(hwndMain); + ok(hwndMain != NULL, "Failed to create control parent.\n"); if (winetest_interactive) ShowWindow (hwndMain, SW_SHOW);
- hwndET2 = CreateWindowA("EDIT", NULL, - WS_CHILD|WS_BORDER|ES_LEFT|ES_AUTOHSCROLL, - 0, 0, w, h, /* important this not be 0 size. */ - hwndMain, (HMENU) ID_EDITTEST2, hinst, NULL); - assert(hwndET2); + hwndET2 = CreateWindowA(WC_EDITA, NULL, WS_CHILD|WS_BORDER|ES_LEFT|ES_AUTOHSCROLL, + 0, 0, w, h, /* important this not be 0 size. */ + hwndMain, (HMENU) ID_EDITTEST2, hinst, NULL); + ok(hwndET2 != NULL, "Failed to create Edit control.\n"); if (winetest_interactive) ShowWindow (hwndET2, SW_SHOW);
@@ -868,6 +880,66 @@ static LRESULT CALLBACK edit3_wnd_procA(HWND hWnd, UINT msg, WPARAM wParam, LPAR return DefWindowProcA(hWnd, msg, wParam, lParam); }
+static LRESULT CALLBACK parent_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + static LONG defwndproc_counter = 0; + struct message msg = { 0 }; + LRESULT ret; + + msg.message = message; + msg.flags = sent|wparam|id; + if (defwndproc_counter) msg.flags |= defwinproc; + msg.wParam = wParam; + msg.id = PARENT_ID; + + if (message != WM_IME_SETCONTEXT && + message != WM_IME_NOTIFY && + message != WM_GETICON && + message != WM_DWMNCRENDERINGCHANGED && + message != WM_GETMINMAXINFO && + message != WM_PAINT && + message != WM_CTLCOLOREDIT && + message < 0xc000) + { + add_message(sequences, COMBINED_SEQ_INDEX, &msg); + } + + defwndproc_counter++; + ret = DefWindowProcA(hwnd, message, wParam, lParam); + defwndproc_counter--; + + return ret; +} + +static LRESULT CALLBACK edit_subclass_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + WNDPROC oldproc = (WNDPROC)GetWindowLongPtrA(hwnd, GWLP_USERDATA); + static LONG defwndproc_counter = 0; + struct message msg = { 0 }; + LRESULT ret; + + msg.message = message; + msg.flags = sent|wparam|id; + if (defwndproc_counter) msg.flags |= defwinproc; + msg.wParam = wParam; + msg.id = EDIT_ID; + + if (message != WM_IME_SETCONTEXT && + message != WM_IME_NOTIFY) + { + add_message(sequences, COMBINED_SEQ_INDEX, &msg); + } + + defwndproc_counter++; + if (IsWindowUnicode(hwnd)) + ret = CallWindowProcW(oldproc, hwnd, message, wParam, lParam); + else + ret = CallWindowProcA(oldproc, hwnd, message, wParam, lParam); + defwndproc_counter--; + + return ret; +} + /* Test behaviour of WM_SETTEXT, WM_REPLACESEL and notifications sent in response * to these messages. */ @@ -891,16 +963,11 @@ static void test_edit_control_3(void) 0, CW_USEDEFAULT, CW_USEDEFAULT, 10, 10, NULL, NULL, NULL, NULL); - assert(hParent); + ok(hParent != NULL, "Failed to create control parent.\n");
trace("EDIT: Single line, no ES_AUTOHSCROLL\n"); - hWnd = CreateWindowExA(0, - "EDIT", - NULL, - 0, - 10, 10, 50, 50, - hParent, NULL, NULL, NULL); - assert(hWnd); + hWnd = CreateWindowExA(0, WC_EDITA, NULL, 0, 10, 10, 50, 50, hParent, NULL, NULL, NULL); + ok(hWnd != NULL, "Failed to create Edit control.\n");
zero_notify(); SendMessageA(hWnd, EM_REPLACESEL, 0, (LPARAM)str); @@ -949,13 +1016,8 @@ static void test_edit_control_3(void) DestroyWindow(hWnd);
trace("EDIT: Single line, ES_AUTOHSCROLL\n"); - hWnd = CreateWindowExA(0, - "EDIT", - NULL, - ES_AUTOHSCROLL, - 10, 10, 50, 50, - hParent, NULL, NULL, NULL); - assert(hWnd); + hWnd = CreateWindowExA(0, WC_EDITA, NULL, ES_AUTOHSCROLL, 10, 10, 50, 50, hParent, NULL, NULL, NULL); + ok(hWnd != NULL, "Failed to create Edit control.\n");
zero_notify(); SendMessageA(hWnd, EM_REPLACESEL, 0, (LPARAM)str); @@ -1000,13 +1062,10 @@ static void test_edit_control_3(void) DestroyWindow(hWnd);
trace("EDIT: Multline, no ES_AUTOHSCROLL, no ES_AUTOVSCROLL\n"); - hWnd = CreateWindowExA(0, - "EDIT", - NULL, - ES_MULTILINE, + hWnd = CreateWindowExA(0, WC_EDITA, NULL, ES_MULTILINE, 10, 10, (50 * dpi) / 96, (50 * dpi) / 96, hParent, NULL, NULL, NULL); - assert(hWnd); + ok(hWnd != NULL, "Failed to create Edit control.\n");
zero_notify(); SendMessageA(hWnd, EM_REPLACESEL, 0, (LPARAM)str); @@ -1050,13 +1109,10 @@ static void test_edit_control_3(void) DestroyWindow(hWnd);
trace("EDIT: Multline, ES_AUTOHSCROLL, no ES_AUTOVSCROLL\n"); - hWnd = CreateWindowExA(0, - "EDIT", - NULL, - ES_MULTILINE | ES_AUTOHSCROLL, + hWnd = CreateWindowExA(0, WC_EDITA, NULL, ES_MULTILINE | ES_AUTOHSCROLL, 10, 10, (50 * dpi) / 96, (50 * dpi) / 96, hParent, NULL, NULL, NULL); - assert(hWnd); + ok(hWnd != NULL, "Failed to create Edit control.\n");
zero_notify(); SendMessageA(hWnd, EM_REPLACESEL, 0, (LPARAM)str2); @@ -1095,13 +1151,9 @@ static void test_edit_control_3(void) DestroyWindow(hWnd);
trace("EDIT: Multline, ES_AUTOHSCROLL and ES_AUTOVSCROLL\n"); - hWnd = CreateWindowExA(0, - "EDIT", - NULL, - ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL, - 10, 10, 50, 50, - hParent, NULL, NULL, NULL); - assert(hWnd); + hWnd = CreateWindowExA(0, WC_EDITA, NULL, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL, + 10, 10, 50, 50, hParent, NULL, NULL, NULL); + ok(hWnd != NULL, "Failed to create Edit control.\n");
zero_notify(); SendMessageA(hWnd, EM_REPLACESEL, 0, (LPARAM)str2); @@ -1284,13 +1336,9 @@ static void test_edit_control_5(void) RECT rc;
/* first show that a non-child won't do for this test */ - hWnd = CreateWindowExA(0, - "EDIT", - str, - 0, - 10, 10, 1, 1, - NULL, NULL, NULL, NULL); - assert(hWnd); + hWnd = CreateWindowExA(0, WC_EDITA, str, 0, 10, 10, 1, 1, NULL, NULL, NULL, NULL); + ok(hWnd != NULL, "Failed to create Edit control.\n"); + /* size of non-child edit control is (much) bigger than requested */ GetWindowRect( hWnd, &rc); ok( rc.right - rc.left > 20, "size of the window (%d) is smaller than expected\n", @@ -1304,16 +1352,13 @@ static void test_edit_control_5(void) CW_USEDEFAULT, CW_USEDEFAULT, 250, 250, NULL, NULL, hinst, NULL); - assert(parentWnd); + ok(parentWnd != NULL, "Failed to create control parent.\n"); ShowWindow( parentWnd, SW_SHOW); /* single line */ - hWnd = CreateWindowExA(0, - "EDIT", - str, WS_VISIBLE | WS_BORDER | - WS_CHILD, + hWnd = CreateWindowExA(0, WC_EDITA, str, WS_VISIBLE | WS_BORDER | WS_CHILD, rc1.left, rc1.top, rc1.right - rc1.left, rc1.bottom - rc1.top, parentWnd, NULL, NULL, NULL); - assert(hWnd); + ok(hWnd != NULL, "Failed to create Edit control.\n"); GetClientRect( hWnd, &rc); ok( rc.right == rc1.right - rc1.left && rc.bottom == rc1.bottom - rc1.top, "Client rectangle not the expected size %s\n", wine_dbgstr_rect( &rc )); @@ -1321,13 +1366,10 @@ static void test_edit_control_5(void) ok(lstrlenA(str) == len, "text shouldn't have been truncated\n"); DestroyWindow(hWnd); /* multi line */ - hWnd = CreateWindowExA(0, - "EDIT", - str, - WS_CHILD | ES_MULTILINE, + hWnd = CreateWindowExA(0, WC_EDITA, str, WS_CHILD | ES_MULTILINE, rc1.left, rc1.top, rc1.right - rc1.left, rc1.bottom - rc1.top, parentWnd, NULL, NULL, NULL); - assert(hWnd); + ok(hWnd != NULL, "Failed to create Edit control.\n"); GetClientRect( hWnd, &rc); ok( rc.right == rc1.right - rc1.left && rc.bottom == rc1.bottom - rc1.top, "Client rectangle not the expected size %s\n", wine_dbgstr_rect( &rc )); @@ -1412,14 +1454,9 @@ static void test_edit_control_scroll(void) /* Check the return value when EM_SCROLL doesn't scroll * anything. Should not return true unless any lines were actually * scrolled. */ - hwEdit = CreateWindowA( - "EDIT", - single_line_str, - WS_VSCROLL | ES_MULTILINE, - 1, 1, 100, 100, - NULL, NULL, hinst, NULL); - - assert(hwEdit); + hwEdit = CreateWindowA(WC_EDITA, single_line_str, WS_VSCROLL | ES_MULTILINE, + 1, 1, 100, 100, NULL, NULL, hinst, NULL); + ok(hwEdit != NULL, "Failed to create Edit control.\n");
ret = SendMessageA(hwEdit, EM_SCROLL, SB_PAGEDOWN, 0); ok(!ret, "Returned %x, expected 0.\n", ret); @@ -1438,13 +1475,9 @@ static void test_edit_control_scroll(void) /* SB_PAGEDOWN while at the beginning of a buffer with few lines should not cause EM_SCROLL to return a negative value of scrolled lines that would put us "before" the beginning. */ - hwEdit = CreateWindowA( - "EDIT", - multiline_str, - WS_VSCROLL | ES_MULTILINE, - 0, 0, 100, 100, - NULL, NULL, hinst, NULL); - assert(hwEdit); + hwEdit = CreateWindowA(WC_EDITA, multiline_str, WS_VSCROLL | ES_MULTILINE, + 0, 0, 100, 100, NULL, NULL, hinst, NULL); + ok(hwEdit != NULL, "Failed to create Edit control.\n");
ret = SendMessageA(hwEdit, EM_SCROLL, SB_PAGEDOWN, 0); ok(!ret, "Returned %x, expected 0.\n", ret); @@ -2365,13 +2398,12 @@ static void test_contextmenu(void)
hwndMain = CreateWindowA(szEditTest4Class, "ET4", WS_OVERLAPPEDWINDOW|WS_VISIBLE, 0, 0, 200, 200, NULL, NULL, hinst, NULL); - assert(hwndMain); + ok(hwndMain != NULL, "Failed to create control parent.\n");
- hwndEdit = CreateWindowA("EDIT", NULL, - WS_CHILD|WS_BORDER|WS_VISIBLE|ES_LEFT|ES_AUTOHSCROLL, + hwndEdit = CreateWindowA(WC_EDITA, NULL, WS_CHILD|WS_BORDER|WS_VISIBLE|ES_LEFT|ES_AUTOHSCROLL, 0, 0, 150, 50, /* important this not be 0 size. */ hwndMain, (HMENU) ID_EDITTEST2, hinst, NULL); - assert(hwndEdit); + ok(hwndEdit != NULL, "Failed to create Edit control.\n");
SetFocus(NULL); SetCapture(hwndMain); @@ -2408,6 +2440,7 @@ static BOOL register_classes(void) WNDCLASSA test3; WNDCLASSA test4; WNDCLASSA text_position; + WNDCLASSA wc;
test2.style = 0; test2.lpfnWndProc = ET2_WndProc; @@ -2457,6 +2490,12 @@ static BOOL register_classes(void) text_position.lpfnWndProc = DefWindowProcA; if (!RegisterClassA(&text_position)) return FALSE;
+ memset(&wc, 0, sizeof(wc)); + wc.lpfnWndProc = parent_wnd_proc; + wc.hInstance = GetModuleHandleA(NULL); + wc.lpszClassName = "ParentWnd"; + if (!RegisterClassA(&wc)) return FALSE; + return TRUE; }
@@ -2750,7 +2789,6 @@ static void test_EM_GETHANDLE(void) buffer = LocalLock(hmem); ok(buffer != NULL, "got %p (expected != NULL)\n", buffer); len = lstrlenW(buffer); -todo_wine ok(len == lstrlenW(str1W) && !lstrcmpW(buffer, str1W), "Unexpected buffer contents %s, length %d.\n", wine_dbgstr_w(buffer), len); LocalUnlock(hmem); @@ -2775,7 +2813,6 @@ todo_wine
lstrcpyA(current, str0); r = SendMessageA(hEdit, WM_GETTEXT, sizeof(current), (LPARAM)current); -todo_wine ok(r == lstrlenA(str1_1) && !lstrcmpA(current, str1_1), "Unexpected retval %d and text "%s" (expected %d and "%s")\n", r, current, lstrlenA(str1_1), str1_1);
@@ -2784,7 +2821,6 @@ todo_wine ok(r, "Failed to set text.\n");
buffer = LocalLock(hmem); -todo_wine ok(buffer != NULL && buffer[0] == '1', "Unexpected buffer contents\n"); LocalUnlock(hmem);
@@ -2792,7 +2828,6 @@ todo_wine ok(r, "Failed to replace selection.\n");
buffer = LocalLock(hmem); -todo_wine ok(buffer != NULL && buffer[0] == '2', "Unexpected buffer contents\n"); LocalUnlock(hmem);
@@ -2814,12 +2849,10 @@ todo_wine SendMessageA(hEdit, EM_SETHANDLE, (WPARAM)halloc, 0);
len = SendMessageA(hEdit, WM_GETTEXTLENGTH, 0, 0); -todo_wine ok(len == lstrlenA(str2), "got %d (expected %d)\n", len, lstrlenA(str2));
lstrcpyA(current, str0); r = SendMessageA(hEdit, WM_GETTEXT, sizeof(current), (LPARAM)current); -todo_wine ok(r == lstrlenA(str2) && !lstrcmpA(current, str2), "got %d and "%s" (expected %d and "%s")\n", r, current, lstrlenA(str2), str2);
@@ -2944,7 +2977,6 @@ static void test_EM_GETLINE(void) char buff[16]; int r;
- todo_wine_if(i == 0) ok(IsWindowUnicode(hwnd[i]), "Expected unicode window.\n");
SendMessageA(hwnd[i], WM_SETTEXT, 0, (LPARAM)str); @@ -2977,6 +3009,91 @@ static void test_EM_GETLINE(void) } }
+static int CALLBACK test_wordbreak_procA(char *text, int current, int length, int code) +{ + return -1; +} + +static void test_wordbreak_proc(void) +{ + EDITWORDBREAKPROCA proc; + LRESULT ret; + HWND hwnd; + + hwnd = create_editcontrol(ES_AUTOHSCROLL | ES_AUTOVSCROLL, 0); + + proc = (void *)SendMessageA(hwnd, EM_GETWORDBREAKPROC, 0, 0); + ok(proc == NULL, "Unexpected wordbreak proc %p.\n", proc); + + ret = SendMessageA(hwnd, EM_SETWORDBREAKPROC, 0, (LPARAM)test_wordbreak_procA); + ok(ret == 1, "Unexpected return value %ld.\n", ret); + + proc = (void *)SendMessageA(hwnd, EM_GETWORDBREAKPROC, 0, 0); + ok(proc == test_wordbreak_procA, "Unexpected wordbreak proc %p.\n", proc); + + ret = SendMessageA(hwnd, EM_SETWORDBREAKPROC, 0, 0); + ok(ret == 1, "Unexpected return value %ld.\n", ret); + + proc = (void *)SendMessageA(hwnd, EM_GETWORDBREAKPROC, 0, 0); + ok(proc == NULL, "Unexpected wordbreak proc %p.\n", proc); + + DestroyWindow(hwnd); +} + +static const struct message setfocus_combined_seq[] = +{ + { WM_KILLFOCUS, sent|id, 0, 0, PARENT_ID }, + { WM_SETFOCUS, sent|id, 0, 0, EDIT_ID }, + { WM_COMMAND, sent|wparam|id, MAKEWPARAM(1, EN_SETFOCUS), 0, PARENT_ID }, + { WM_PAINT, sent|id, 0, 0, EDIT_ID }, + { WM_NCPAINT, sent|id|defwinproc|optional, 0, 0, EDIT_ID }, + { WM_ERASEBKGND, sent|id|defwinproc|optional, 0, 0, EDIT_ID }, + { 0 } +}; + +static const struct message killfocus_combined_seq[] = +{ + { WM_KILLFOCUS, sent|id, 0, 0, EDIT_ID }, + { WM_COMMAND, sent|wparam|id, MAKEWPARAM(1, EN_KILLFOCUS), 0, PARENT_ID }, + { WM_SETFOCUS, sent|id, 0, 0, PARENT_ID }, + { WM_PAINT, sent|id, 0, 0, EDIT_ID }, + { WM_NCPAINT, sent|id|defwinproc|optional, 0, 0, EDIT_ID }, + { 0 } +}; + +static void test_change_focus(void) +{ + HWND hwnd, parent_wnd; + WNDPROC oldproc; + MSG msg; + + parent_wnd = CreateWindowA("ParentWnd", "", WS_OVERLAPPEDWINDOW, + 0, 0, 200, 200, NULL, NULL, GetModuleHandleA(NULL), NULL); + ok(parent_wnd != NULL, "Failed to create control parent.\n"); + SetWindowPos(parent_wnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE); + ShowWindow(parent_wnd, SW_SHOW); + + hwnd = CreateWindowExA(0, WC_EDITA, "Test", WS_CHILD | WS_VISIBLE, 0, 0, 100, 100, + parent_wnd, (HMENU)1, GetModuleHandleA(NULL), NULL); + ok(hwnd != NULL, "Failed to create Edit control.\n"); + + oldproc = (WNDPROC)SetWindowLongPtrA(hwnd, GWLP_WNDPROC, (LONG_PTR)edit_subclass_proc); + SetWindowLongPtrA(hwnd, GWLP_USERDATA, (LONG_PTR)oldproc); + + SetFocus(parent_wnd); + flush_sequences(sequences, NUM_MSG_SEQUENCES); + SetFocus(hwnd); + while (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE)) DispatchMessageA(&msg); + ok_sequence(sequences, COMBINED_SEQ_INDEX, setfocus_combined_seq, "Set focus", TRUE); + + flush_sequences(sequences, NUM_MSG_SEQUENCES); + SetFocus(parent_wnd); + while (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE)) DispatchMessageA(&msg); + ok_sequence(sequences, COMBINED_SEQ_INDEX, killfocus_combined_seq, "Kill focus", TRUE); + + DestroyWindow(hwnd); +} + START_TEST(edit) { ULONG_PTR ctx_cookie; @@ -2986,6 +3103,8 @@ START_TEST(edit) if (!load_v6_module(&ctx_cookie, &hCtx)) return;
+ init_msg_sequences(sequences, NUM_MSG_SEQUENCES); + hinst = GetModuleHandleA(NULL); b = register_classes(); ok(b, "Failed to register test classes.\n"); @@ -3017,6 +3136,8 @@ START_TEST(edit) test_EM_GETHANDLE(); test_paste(); test_EM_GETLINE(); + test_wordbreak_proc(); + test_change_focus();
UnregisterWindowClasses();
diff --git a/modules/rostests/winetests/comctl32/header.c b/modules/rostests/winetests/comctl32/header.c index f428349186..7ea80519a6 100644 --- a/modules/rostests/winetests/comctl32/header.c +++ b/modules/rostests/winetests/comctl32/header.c @@ -18,7 +18,16 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include "precomp.h" + +#include <windows.h> +#include <commctrl.h> + +#include "wine/test.h" +#include "v6util.h" +#include "msg.h" + +static HIMAGELIST (WINAPI *pImageList_Create)(int, int, UINT, int, int); +static BOOL (WINAPI *pImageList_Destroy)(HIMAGELIST);
typedef struct tagEXPECTEDNOTIFY { @@ -526,58 +535,79 @@ static HWND create_custom_header_control(HWND hParent, BOOL preloadHeaderItems) return childHandle; }
-static void check_auto_format(void) +static void header_item_getback(HWND hwnd, UINT mask, HDITEMA *item) { - HDITEMA hdiCreate; - HDITEMA hdiRead; - static CHAR text[] = "Test"; - ZeroMemory(&hdiCreate, sizeof(HDITEMA)); + int ret;
- /* Windows implicitly sets some format bits in INSERTITEM */ + ret = SendMessageA(hwnd, HDM_INSERTITEMA, 0, (LPARAM)item); + ok(ret != -1, "Failed to add header item.\n");
- /* HDF_STRING is automatically set and cleared for no text */ - hdiCreate.mask = HDI_TEXT|HDI_WIDTH|HDI_FORMAT; - hdiCreate.pszText = text; - hdiCreate.cxy = 100; - hdiCreate.fmt=HDF_CENTER; - addReadDelItem(hWndHeader, &hdiCreate, HDI_FORMAT, &hdiRead); - ok(hdiRead.fmt == (HDF_STRING|HDF_CENTER), "HDF_STRING not set automatically (fmt=%x)\n", hdiRead.fmt); + memset(item, 0, sizeof(*item)); + item->mask = mask;
- hdiCreate.mask = HDI_WIDTH|HDI_FORMAT; - hdiCreate.pszText = text; - hdiCreate.fmt = HDF_CENTER|HDF_STRING; - addReadDelItem(hWndHeader, &hdiCreate, HDI_FORMAT, &hdiRead); - ok(hdiRead.fmt == (HDF_CENTER), "HDF_STRING should be automatically cleared (fmt=%x)\n", hdiRead.fmt); + ret = SendMessageA(hwnd, HDM_GETITEMA, 0, (LPARAM)item); + ok(ret != 0, "Failed to get item data.\n"); + ret = SendMessageA(hwnd, HDM_DELETEITEM, 0, 0); + ok(ret != 0, "Failed to delete item.\n"); +}
- /* HDF_BITMAP is automatically set and cleared for a NULL bitmap or no bitmap */ - hdiCreate.mask = HDI_BITMAP|HDI_WIDTH|HDI_FORMAT; - hdiCreate.hbm = CreateBitmap(16, 16, 1, 8, NULL); - hdiCreate.fmt = HDF_CENTER; - addReadDelItem(hWndHeader, &hdiCreate, HDI_FORMAT, &hdiRead); - ok(hdiRead.fmt == (HDF_BITMAP|HDF_CENTER), "HDF_BITMAP not set automatically (fmt=%x)\n", hdiRead.fmt); - DeleteObject(hdiCreate.hbm); +static void test_item_auto_format(HWND parent) +{ + static char text[] = "Test"; + HDITEMA item; + HBITMAP hbm; + HWND hwnd;
- hdiCreate.hbm = NULL; - hdiCreate.fmt = HDF_CENTER|HDF_BITMAP; - addReadDelItem(hWndHeader, &hdiCreate, HDI_FORMAT, &hdiRead); - ok(hdiRead.fmt == HDF_CENTER, "HDF_BITMAP not cleared automatically for NULL bitmap (fmt=%x)\n", hdiRead.fmt); + hwnd = create_custom_header_control(parent, FALSE);
- hdiCreate.mask = HDI_WIDTH|HDI_FORMAT; - hdiCreate.fmt = HDF_CENTER|HDF_BITMAP; - addReadDelItem(hWndHeader, &hdiCreate, HDI_FORMAT, &hdiRead); - ok(hdiRead.fmt == HDF_CENTER, "HDF_BITMAP not cleared automatically for no bitmap (fmt=%x)\n", hdiRead.fmt); + /* Windows implicitly sets some format bits in INSERTITEM */ + + /* HDF_STRING is automatically set and cleared for no text */ + item.mask = HDI_TEXT | HDI_WIDTH | HDI_FORMAT; + item.pszText = text; + item.cxy = 100; + item.fmt = HDF_CENTER; + header_item_getback(hwnd, HDI_FORMAT, &item); + ok(item.fmt == (HDF_STRING | HDF_CENTER), "Unexpected item format mask %#x.\n", item.fmt); + + item.mask = HDI_WIDTH | HDI_FORMAT; + item.pszText = text; + item.fmt = HDF_CENTER | HDF_STRING; + header_item_getback(hwnd, HDI_FORMAT, &item); + ok(item.fmt == HDF_CENTER, "Unexpected item format mask %#x.\n", item.fmt); + + /* HDF_BITMAP is automatically set and cleared for a NULL bitmap or no bitmap */ + item.mask = HDI_BITMAP | HDI_WIDTH | HDI_FORMAT; + item.hbm = hbm = CreateBitmap(16, 16, 1, 8, NULL); + item.fmt = HDF_CENTER; + header_item_getback(hwnd, HDI_FORMAT, &item); + ok(item.fmt == (HDF_BITMAP | HDF_CENTER), "Unexpected item format mask %#x.\n", item.fmt); + DeleteObject(hbm); + + item.mask = HDI_BITMAP | HDI_WIDTH | HDI_FORMAT; + item.hbm = NULL; + item.fmt = HDF_CENTER | HDF_BITMAP; + header_item_getback(hwnd, HDI_FORMAT, &item); + ok(item.fmt == HDF_CENTER, "Unexpected item format mask %#x.\n", item.fmt); + + item.mask = HDI_WIDTH | HDI_FORMAT; + item.fmt = HDF_CENTER | HDF_BITMAP; + header_item_getback(hwnd, HDI_FORMAT, &item); + ok(item.fmt == HDF_CENTER, "Unexpected item format mask %#x.\n", item.fmt);
/* HDF_IMAGE is automatically set but not cleared */ - hdiCreate.mask = HDI_IMAGE|HDI_WIDTH|HDI_FORMAT; - hdiCreate.iImage = 17; - addReadDelItem(hWndHeader, &hdiCreate, HDI_FORMAT, &hdiRead); - ok(hdiRead.fmt == (HDF_IMAGE|HDF_CENTER), "HDF_IMAGE not set automatically (fmt=%x)\n", hdiRead.fmt); + item.mask = HDI_IMAGE | HDI_WIDTH | HDI_FORMAT; + item.iImage = 17; + header_item_getback(hwnd, HDI_FORMAT, &item); + ok(item.fmt == (HDF_IMAGE | HDF_CENTER), "Unexpected item format mask %#x.\n", item.fmt);
- hdiCreate.mask = HDI_WIDTH|HDI_FORMAT; - hdiCreate.fmt = HDF_CENTER|HDF_IMAGE; - hdiCreate.iImage = 0; - addReadDelItem(hWndHeader, &hdiCreate, HDI_FORMAT, &hdiRead); - ok(hdiRead.fmt == (HDF_CENTER|HDF_IMAGE), "HDF_IMAGE shouldn't be cleared automatically (fmt=%x)\n", hdiRead.fmt); + item.mask = HDI_WIDTH | HDI_FORMAT; + item.fmt = HDF_CENTER | HDF_IMAGE; + item.iImage = 0; + header_item_getback(hwnd, HDI_FORMAT, &item); + ok(item.fmt == (HDF_CENTER | HDF_IMAGE), "Unexpected item format mask %#x.\n", item.fmt); + + DestroyWindow(hwnd); }
static void check_auto_fields(void) @@ -759,7 +789,6 @@ static void test_header_control (void) /* unexpected notifies cleared by notifies_received in setItem */ delItem(hWndHeader, 0);
- check_auto_format(); TEST_GET_ITEMCOUNT(6); check_auto_fields(); TEST_GET_ITEMCOUNT(6); @@ -947,7 +976,7 @@ static void test_hdm_sethotdivider(HWND hParent)
static void test_hdm_imageMessages(HWND hParent) { - HIMAGELIST hImageList = ImageList_Create (4, 4, 0, 1, 0); + HIMAGELIST hImageList = pImageList_Create (4, 4, 0, 1, 0); HIMAGELIST hIml; BOOL wasValid; HWND hChild; @@ -967,13 +996,13 @@ static void test_hdm_imageMessages(HWND hParent)
hIml = (HIMAGELIST) SendMessageA(hChild, HDM_CREATEDRAGIMAGE, 0, 0); ok(hIml != NULL, "Expected non-NULL handle, got %p\n", hIml); - ImageList_Destroy(hIml); + pImageList_Destroy(hIml);
ok_sequence(sequences, HEADER_SEQ_INDEX, imageMessages_seq, "imageMessages sequence testing", FALSE);
DestroyWindow(hChild);
- wasValid = ImageList_Destroy(hImageList); + wasValid = pImageList_Destroy(hImageList); ok(wasValid, "Header must not free image list at destruction!\n"); }
@@ -1638,28 +1667,23 @@ static LRESULT CALLBACK HeaderTestWndProc(HWND hWnd, UINT msg, WPARAM wParam, LP return 0L; }
+static void init_functions(void) +{ + HMODULE hComCtl32 = LoadLibraryA("comctl32.dll"); + +#define X(f) p##f = (void*)GetProcAddress(hComCtl32, #f); + X(ImageList_Create); + X(ImageList_Destroy); +#undef X +} + static BOOL init(void) { - HMODULE hComctl32; - BOOL (WINAPI *pInitCommonControlsEx)(const INITCOMMONCONTROLSEX*); WNDCLASSA wc; - INITCOMMONCONTROLSEX iccex; TEXTMETRICA tm; HFONT hOldFont; HDC hdc;
- hComctl32 = GetModuleHandleA("comctl32.dll"); - pInitCommonControlsEx = (void*)GetProcAddress(hComctl32, "InitCommonControlsEx"); - if (!pInitCommonControlsEx) - { - win_skip("InitCommonControlsEx() is missing. Skipping the tests\n"); - return FALSE; - } - - iccex.dwSize = sizeof(iccex); - iccex.dwICC = ICC_USEREX_CLASSES; - pInitCommonControlsEx(&iccex); - wc.style = CS_HREDRAW | CS_VREDRAW; wc.cbClsExtra = 0; wc.cbWndExtra = 0; @@ -1815,17 +1839,21 @@ START_TEST(header) ULONG_PTR ctx_cookie; HANDLE hCtx;
+ init_functions(); + init_msg_sequences(sequences, NUM_MSG_SEQUENCES); + if (!init()) return;
test_header_control(); + test_item_auto_format(hHeaderParentWnd); test_header_order(); test_hdm_orderarray(); test_customdraw();
DestroyWindow(hHeaderParentWnd);
- init_msg_sequences(sequences, NUM_MSG_SEQUENCES); + flush_sequences(sequences, NUM_MSG_SEQUENCES); parent_hwnd = create_custom_parent_window(); ok_sequence(sequences, PARENT_SEQ_INDEX, create_parent_wnd_seq, "create parent windows", FALSE);
@@ -1846,9 +1874,12 @@ START_TEST(header) return; }
+ init_functions(); + /* comctl32 version 6 tests start here */ test_hdf_fixedwidth(parent_hwnd); test_hds_nosizing(parent_hwnd); + test_item_auto_format(parent_hwnd);
unload_v6_module(ctx_cookie, hCtx);
diff --git a/modules/rostests/winetests/comctl32/imagelist.c b/modules/rostests/winetests/comctl32/imagelist.c index 55466ac37a..bcd62c9e9c 100644 --- a/modules/rostests/winetests/comctl32/imagelist.c +++ b/modules/rostests/winetests/comctl32/imagelist.c @@ -21,13 +21,29 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include "precomp.h" - +#define COBJMACROS +#define CONST_VTABLE + +#include <stdarg.h> +#include <stdio.h> + +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "winuser.h" +#include "objbase.h" +#include "commctrl.h" /* must be included after objbase.h to get ImageList_Write */ +#include "initguid.h" +#include "commoncontrols.h" +#include "shellapi.h" + +#include "wine/test.h" +#include "v6util.h" +#include "resources.h" + +#ifdef __REACTOS__ #include <ole2.h> -#include <shellapi.h> - -#include <initguid.h> -#include <commoncontrols.h> +#endif
#define IMAGELIST_MAGIC (('L' << 8) | 'I')
@@ -73,6 +89,7 @@ static BOOL (WINAPI *pImageList_Write)(HIMAGELIST, IStream *); static HIMAGELIST (WINAPI *pImageList_Read)(IStream *); static BOOL (WINAPI *pImageList_Copy)(HIMAGELIST, int, HIMAGELIST, int, UINT); static HIMAGELIST (WINAPI *pImageList_LoadImageW)(HINSTANCE, LPCWSTR, int, int, COLORREF, UINT, UINT); +static BOOL (WINAPI *pImageList_Draw)(HIMAGELIST,INT,HDC,INT,INT,UINT);
static HINSTANCE hinst;
@@ -193,7 +210,7 @@ static HDC show_image(HWND hwnd, HIMAGELIST himl, int idx, int size,
SetWindowTextA(hwnd, loc); hdc = GetDC(hwnd); - ImageList_Draw(himl, idx, hdc, 0, 0, ILD_TRANSPARENT); + pImageList_Draw(himl, idx, hdc, 0, 0, ILD_TRANSPARENT);
force_redraw(hwnd);
@@ -492,8 +509,8 @@ static void test_DrawIndirect(void) ok(hbm3 != 0, "no bitmap 3\n");
/* add three */ - ok(0 == ImageList_Add(himl, hbm1, 0),"failed to add bitmap 1\n"); - ok(1 == ImageList_Add(himl, hbm2, 0),"failed to add bitmap 2\n"); + ok(0 == pImageList_Add(himl, hbm1, 0),"failed to add bitmap 1\n"); + ok(1 == pImageList_Add(himl, hbm2, 0),"failed to add bitmap 2\n");
if (pImageList_SetImageCount) { @@ -886,16 +903,30 @@ static BOOL is_v6_header(const ILHEAD *header)
static void check_ilhead_data(const ILHEAD *ilh, INT cx, INT cy, INT cur, INT max, INT grow, INT flags) { + INT grow_aligned; + ok(ilh->usMagic == IMAGELIST_MAGIC, "wrong usMagic %4x (expected %02x)\n", ilh->usMagic, IMAGELIST_MAGIC); ok(ilh->usVersion == 0x101 || ilh->usVersion == 0x600 || /* WinXP/W2k3 */ ilh->usVersion == 0x620, "Unknown usVersion %#x.\n", ilh->usVersion); ok(ilh->cCurImage == cur, "wrong cCurImage %d (expected %d)\n", ilh->cCurImage, cur); - if (!is_v6_header(ilh)) + + grow = max(grow, 1); + grow_aligned = (WORD)(grow + 3) & ~3; + + if (is_v6_header(ilh)) + { + grow = (WORD)(grow + 2 + 3) & ~3; + ok(ilh->cGrow == grow || broken(ilh->cGrow == grow_aligned) /* XP/Vista */, + "Unexpected cGrow %d, expected %d\n", ilh->cGrow, grow); + } + else { + grow = (WORD)(grow + 3) & ~3; ok(ilh->cMaxImage == max, "wrong cMaxImage %d (expected %d)\n", ilh->cMaxImage, max); - ok(ilh->cGrow == grow, "Unexpected cGrow %d (expected %d)\n", ilh->cGrow, grow); + ok(ilh->cGrow == grow_aligned, "Unexpected cGrow %d, expected %d\n", ilh->cGrow, grow_aligned); } + ok(ilh->cx == cx, "wrong cx %d (expected %d)\n", ilh->cx, cx); ok(ilh->cy == cy, "wrong cy %d (expected %d)\n", ilh->cy, cy); ok(ilh->bkcolor == CLR_NONE, "wrong bkcolor %x\n", ilh->bkcolor); @@ -956,6 +987,7 @@ static inline void imagelist_get_bitmap_size(const ILHEAD *header, SIZE *sz) } }
+/* Grow argument matches what was used when imagelist was created. */ static void check_iml_data(HIMAGELIST himl, INT cx, INT cy, INT cur, INT max, INT grow, INT flags, const char *comment) { @@ -1017,103 +1049,106 @@ static void check_iml_data(HIMAGELIST himl, INT cx, INT cy, INT cur, INT max, IN cleanup_memstream(&stream); }
-static void image_list_init(HIMAGELIST himl) +static void image_list_add_bitmap(HIMAGELIST himl, BYTE grey, int i) { - HBITMAP hbm; char comment[16]; - INT n = 1; - DWORD i; + HBITMAP hbm; + int ret; + + sprintf(comment, "%d", i); + hbm = create_bitmap(BMP_CX, BMP_CX, RGB(grey, grey, grey), comment); + ret = pImageList_Add(himl, hbm, NULL); + ok(ret != -1, "Failed to add image to imagelist.\n"); + DeleteObject(hbm); +} + +static void image_list_init(HIMAGELIST himl, INT grow) +{ + unsigned int i; static const struct test_data { BYTE grey; - INT cx, cy, cur, max, grow, bpp; + INT cx, cy, cur, max, bpp; const char *comment; } td[] = { - { 255, BMP_CX, BMP_CX, 1, 2, 4, 24, "total 1" }, - { 170, BMP_CX, BMP_CX, 2, 7, 4, 24, "total 2" }, - { 85, BMP_CX, BMP_CX, 3, 7, 4, 24, "total 3" }, - { 0, BMP_CX, BMP_CX, 4, 7, 4, 24, "total 4" }, - { 0, BMP_CX, BMP_CX, 5, 7, 4, 24, "total 5" }, - { 85, BMP_CX, BMP_CX, 6, 7, 4, 24, "total 6" }, - { 170, BMP_CX, BMP_CX, 7, 12, 4, 24, "total 7" }, - { 255, BMP_CX, BMP_CX, 8, 12, 4, 24, "total 8" }, - { 255, BMP_CX, BMP_CX, 9, 12, 4, 24, "total 9" }, - { 170, BMP_CX, BMP_CX, 10, 12, 4, 24, "total 10" }, - { 85, BMP_CX, BMP_CX, 11, 12, 4, 24, "total 11" }, - { 0, BMP_CX, BMP_CX, 12, 17, 4, 24, "total 12" }, - { 0, BMP_CX, BMP_CX, 13, 17, 4, 24, "total 13" }, - { 85, BMP_CX, BMP_CX, 14, 17, 4, 24, "total 14" }, - { 170, BMP_CX, BMP_CX, 15, 17, 4, 24, "total 15" }, - { 255, BMP_CX, BMP_CX, 16, 17, 4, 24, "total 16" }, - { 255, BMP_CX, BMP_CX, 17, 22, 4, 24, "total 17" }, - { 170, BMP_CX, BMP_CX, 18, 22, 4, 24, "total 18" }, - { 85, BMP_CX, BMP_CX, 19, 22, 4, 24, "total 19" }, - { 0, BMP_CX, BMP_CX, 20, 22, 4, 24, "total 20" }, - { 0, BMP_CX, BMP_CX, 21, 22, 4, 24, "total 21" }, - { 85, BMP_CX, BMP_CX, 22, 27, 4, 24, "total 22" }, - { 170, BMP_CX, BMP_CX, 23, 27, 4, 24, "total 23" }, - { 255, BMP_CX, BMP_CX, 24, 27, 4, 24, "total 24" } + { 255, BMP_CX, BMP_CX, 1, 2, 24, "total 1" }, + { 170, BMP_CX, BMP_CX, 2, 7, 24, "total 2" }, + { 85, BMP_CX, BMP_CX, 3, 7, 24, "total 3" }, + { 0, BMP_CX, BMP_CX, 4, 7, 24, "total 4" }, + { 0, BMP_CX, BMP_CX, 5, 7, 24, "total 5" }, + { 85, BMP_CX, BMP_CX, 6, 7, 24, "total 6" }, + { 170, BMP_CX, BMP_CX, 7, 12, 24, "total 7" }, + { 255, BMP_CX, BMP_CX, 8, 12, 24, "total 8" }, + { 255, BMP_CX, BMP_CX, 9, 12, 24, "total 9" }, + { 170, BMP_CX, BMP_CX, 10, 12, 24, "total 10" }, + { 85, BMP_CX, BMP_CX, 11, 12, 24, "total 11" }, + { 0, BMP_CX, BMP_CX, 12, 17, 24, "total 12" }, + { 0, BMP_CX, BMP_CX, 13, 17, 24, "total 13" }, + { 85, BMP_CX, BMP_CX, 14, 17, 24, "total 14" }, + { 170, BMP_CX, BMP_CX, 15, 17, 24, "total 15" }, + { 255, BMP_CX, BMP_CX, 16, 17, 24, "total 16" }, + { 255, BMP_CX, BMP_CX, 17, 22, 24, "total 17" }, + { 170, BMP_CX, BMP_CX, 18, 22, 24, "total 18" }, + { 85, BMP_CX, BMP_CX, 19, 22, 24, "total 19" }, + { 0, BMP_CX, BMP_CX, 20, 22, 24, "total 20" }, + { 0, BMP_CX, BMP_CX, 21, 22, 24, "total 21" }, + { 85, BMP_CX, BMP_CX, 22, 27, 24, "total 22" }, + { 170, BMP_CX, BMP_CX, 23, 27, 24, "total 23" }, + { 255, BMP_CX, BMP_CX, 24, 27, 24, "total 24" } };
- check_iml_data(himl, BMP_CX, BMP_CX, 0, 2, 4, ILC_COLOR24, "total 0"); - -#define add_bitmap(grey) \ - sprintf(comment, "%d", n++); \ - hbm = create_bitmap(BMP_CX, BMP_CX, RGB((grey),(grey),(grey)), comment); \ - ImageList_Add(himl, hbm, NULL); \ - DeleteObject(hbm); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 2, grow, ILC_COLOR24, "total 0");
for (i = 0; i < sizeof(td)/sizeof(td[0]); i++) { - add_bitmap(td[i].grey); - check_iml_data(himl, td[i].cx, td[i].cy, td[i].cur, td[i].max, td[i].grow, td[i].bpp, td[i].comment); + image_list_add_bitmap(himl, td[i].grey, i + 1); + check_iml_data(himl, td[i].cx, td[i].cy, td[i].cur, td[i].max, grow, td[i].bpp, td[i].comment); } -#undef add_bitmap }
static void test_imagelist_storage(void) { HIMAGELIST himl; + INT ret, grow; HBITMAP hbm; HICON icon; - INT ret;
himl = pImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 1, 1); ok(himl != 0, "ImageList_Create failed\n");
- check_iml_data(himl, BMP_CX, BMP_CX, 0, 2, 4, ILC_COLOR24, "empty"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 2, 1, ILC_COLOR24, "empty");
- image_list_init(himl); - check_iml_data(himl, BMP_CX, BMP_CX, 24, 27, 4, ILC_COLOR24, "orig"); + image_list_init(himl, 1); + check_iml_data(himl, BMP_CX, BMP_CX, 24, 27, 1, ILC_COLOR24, "orig");
ret = pImageList_Remove(himl, 4); ok(ret, "ImageList_Remove failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 23, 27, 4, ILC_COLOR24, "1"); + check_iml_data(himl, BMP_CX, BMP_CX, 23, 27, 1, ILC_COLOR24, "1");
ret = pImageList_Remove(himl, 5); ok(ret, "ImageList_Remove failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 22, 27, 4, ILC_COLOR24, "2"); + check_iml_data(himl, BMP_CX, BMP_CX, 22, 27, 1, ILC_COLOR24, "2");
ret = pImageList_Remove(himl, 6); ok(ret, "ImageList_Remove failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 21, 27, 4, ILC_COLOR24, "3"); + check_iml_data(himl, BMP_CX, BMP_CX, 21, 27, 1, ILC_COLOR24, "3");
ret = pImageList_Remove(himl, 7); ok(ret, "ImageList_Remove failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 20, 27, 4, ILC_COLOR24, "4"); + check_iml_data(himl, BMP_CX, BMP_CX, 20, 27, 1, ILC_COLOR24, "4");
ret = pImageList_Remove(himl, -2); ok(!ret, "ImageList_Remove(-2) should fail\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 20, 27, 4, ILC_COLOR24, "5"); + check_iml_data(himl, BMP_CX, BMP_CX, 20, 27, 1, ILC_COLOR24, "5");
ret = pImageList_Remove(himl, 20); ok(!ret, "ImageList_Remove(20) should fail\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 20, 27, 4, ILC_COLOR24, "6"); + check_iml_data(himl, BMP_CX, BMP_CX, 20, 27, 1, ILC_COLOR24, "6");
ret = pImageList_Remove(himl, -1); ok(ret, "ImageList_Remove(-1) failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 4, 4, ILC_COLOR24, "7"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 4, 1, ILC_COLOR24, "7");
ret = pImageList_Destroy(himl); ok(ret, "ImageList_Destroy failed\n"); @@ -1147,13 +1182,13 @@ static void test_imagelist_storage(void)
himl = pImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 207, 209); ok(himl != 0, "ImageList_Create failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 208, 212, ILC_COLOR24, "init 207 grow 209"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 208, 209, ILC_COLOR24, "init 207 grow 209"); ret = pImageList_Destroy(himl); ok(ret, "ImageList_Destroy failed\n");
himl = pImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 209, 207); ok(himl != 0, "ImageList_Create failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 210, 208, ILC_COLOR24, "init 209 grow 207"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 210, 207, ILC_COLOR24, "init 209 grow 207"); ret = pImageList_Destroy(himl); ok(ret, "ImageList_Destroy failed\n");
@@ -1165,13 +1200,13 @@ static void test_imagelist_storage(void)
himl = pImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 5, 9); ok(himl != 0, "ImageList_Create failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 6, 12, ILC_COLOR24, "init 5 grow 9"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 6, 9, ILC_COLOR24, "init 5 grow 9"); ret = pImageList_Destroy(himl); ok(ret, "ImageList_Destroy failed\n");
himl = pImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 9, 5); ok(himl != 0, "ImageList_Create failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 10, 8, ILC_COLOR24, "init 9 grow 5"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 10, 5, ILC_COLOR24, "init 9 grow 5"); ret = pImageList_Destroy(himl); ok(ret, "ImageList_Destroy failed\n");
@@ -1183,79 +1218,88 @@ static void test_imagelist_storage(void)
himl = pImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 4, 2); ok(himl != 0, "ImageList_Create failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 5, 4, ILC_COLOR24, "init 4 grow 2"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 5, 2, ILC_COLOR24, "init 4 grow 2"); ret = pImageList_Destroy(himl); ok(ret, "ImageList_Destroy failed\n");
himl = pImageList_Create(BMP_CX, BMP_CX, ILC_COLOR8, 4, 2); ok(himl != 0, "ImageList_Create failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 5, 4, ILC_COLOR8, "bpp 8"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 5, 2, ILC_COLOR8, "bpp 8"); ret = pImageList_Destroy(himl); ok(ret, "ImageList_Destroy failed\n");
himl = pImageList_Create(BMP_CX, BMP_CX, ILC_COLOR4, 4, 2); ok(himl != 0, "ImageList_Create failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 5, 4, ILC_COLOR4, "bpp 4"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 5, 2, ILC_COLOR4, "bpp 4"); ret = pImageList_Destroy(himl); ok(ret, "ImageList_Destroy failed\n");
himl = pImageList_Create(BMP_CX, BMP_CX, 0, 4, 2); ok(himl != 0, "ImageList_Create failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 5, 4, ILC_COLOR4, "bpp default"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 5, 2, ILC_COLOR4, "bpp default"); icon = CreateIcon(hinst, 32, 32, 1, 1, icon_bits, icon_bits); ok( pImageList_ReplaceIcon(himl, -1, icon) == 0, "Failed to add icon.\n"); ok( pImageList_ReplaceIcon(himl, -1, icon) == 1, "Failed to add icon.\n"); DestroyIcon( icon ); - check_iml_data(himl, BMP_CX, BMP_CX, 2, 5, 4, ILC_COLOR4, "bpp default"); + check_iml_data(himl, BMP_CX, BMP_CX, 2, 5, 2, ILC_COLOR4, "bpp default"); ret = pImageList_Destroy(himl); ok(ret, "ImageList_Destroy failed\n");
himl = pImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24|ILC_MASK, 4, 2); ok(himl != 0, "ImageList_Create failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 5, 4, ILC_COLOR24|ILC_MASK, "bpp 24 + mask"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 5, 2, ILC_COLOR24|ILC_MASK, "bpp 24 + mask"); icon = CreateIcon(hinst, 32, 32, 1, 1, icon_bits, icon_bits); ok( pImageList_ReplaceIcon(himl, -1, icon) == 0, "Failed to add icon.\n"); ok( pImageList_ReplaceIcon(himl, -1, icon) == 1, "Failed to add icon.\n"); DestroyIcon( icon ); - check_iml_data(himl, BMP_CX, BMP_CX, 2, 5, 4, ILC_COLOR24|ILC_MASK, "bpp 24 + mask"); + check_iml_data(himl, BMP_CX, BMP_CX, 2, 5, 2, ILC_COLOR24|ILC_MASK, "bpp 24 + mask"); ret = pImageList_Destroy(himl); ok(ret, "ImageList_Destroy failed\n");
himl = pImageList_Create(BMP_CX, BMP_CX, ILC_COLOR4|ILC_MASK, 4, 2); ok(himl != 0, "ImageList_Create failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 5, 4, ILC_COLOR4|ILC_MASK, "bpp 4 + mask"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 5, 2, ILC_COLOR4|ILC_MASK, "bpp 4 + mask"); icon = CreateIcon(hinst, 32, 32, 1, 1, icon_bits, icon_bits); ok( pImageList_ReplaceIcon(himl, -1, icon) == 0, "Failed to add icon.\n"); ok( pImageList_ReplaceIcon(himl, -1, icon) == 1, "Failed to add icon.\n"); DestroyIcon( icon ); - check_iml_data(himl, BMP_CX, BMP_CX, 2, 5, 4, ILC_COLOR4|ILC_MASK, "bpp 4 + mask"); + check_iml_data(himl, BMP_CX, BMP_CX, 2, 5, 2, ILC_COLOR4|ILC_MASK, "bpp 4 + mask"); ret = pImageList_Destroy(himl); ok(ret, "ImageList_Destroy failed\n");
himl = pImageList_Create(BMP_CX, BMP_CX, ILC_COLOR4|ILC_MASK, 2, 99); ok(himl != 0, "ImageList_Create failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 3, 100, ILC_COLOR4|ILC_MASK, "init 2 grow 99"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 3, 99, ILC_COLOR4|ILC_MASK, "init 2 grow 99"); icon = CreateIcon(hinst, 32, 32, 1, 1, icon_bits, icon_bits); ok( pImageList_ReplaceIcon(himl, -1, icon) == 0, "Failed to add icon.\n"); ok( pImageList_ReplaceIcon(himl, -1, icon) == 1, "Failed to add icon.\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 2, 3, 100, ILC_COLOR4|ILC_MASK, "init 2 grow 99 2 icons"); + check_iml_data(himl, BMP_CX, BMP_CX, 2, 3, 99, ILC_COLOR4|ILC_MASK, "init 2 grow 99 2 icons"); ok( pImageList_ReplaceIcon(himl, -1, icon) == 2, "Failed to add icon\n"); DestroyIcon( icon ); - check_iml_data(himl, BMP_CX, BMP_CX, 3, 104, 100, ILC_COLOR4|ILC_MASK, "init 2 grow 99 3 icons"); + check_iml_data(himl, BMP_CX, BMP_CX, 3, 104, 99, ILC_COLOR4|ILC_MASK, "init 2 grow 99 3 icons"); ok( pImageList_Remove(himl, -1) == TRUE, "Failed to remove icon.\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 100, 100, ILC_COLOR4|ILC_MASK, "init 2 grow 99 empty"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 100, 99, ILC_COLOR4|ILC_MASK, "init 2 grow 99 empty"); ok( pImageList_SetImageCount(himl, 22) == TRUE, "Failed to set image count.\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 22, 23, 100, ILC_COLOR4|ILC_MASK, "init 2 grow 99 set count 22"); + check_iml_data(himl, BMP_CX, BMP_CX, 22, 23, 99, ILC_COLOR4|ILC_MASK, "init 2 grow 99 set count 22"); ok( pImageList_SetImageCount(himl, 0) == TRUE, "Failed to set image count.\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 1, 100, ILC_COLOR4|ILC_MASK, "init 2 grow 99 set count 0"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 1, 99, ILC_COLOR4|ILC_MASK, "init 2 grow 99 set count 0"); ok( pImageList_SetImageCount(himl, 42) == TRUE, "Failed to set image count.\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 42, 43, 100, ILC_COLOR4|ILC_MASK, "init 2 grow 99 set count 42"); + check_iml_data(himl, BMP_CX, BMP_CX, 42, 43, 99, ILC_COLOR4|ILC_MASK, "init 2 grow 99 set count 42"); ret = pImageList_Destroy(himl); ok(ret, "ImageList_Destroy failed\n");
+ for (grow = 1; grow <= 16; grow++) + { + himl = pImageList_Create(BMP_CX, BMP_CX, ILC_COLOR4|ILC_MASK, 2, grow); + ok(himl != 0, "ImageList_Create failed\n"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 3, grow, ILC_COLOR4|ILC_MASK, "grow test"); + ret = pImageList_Destroy(himl); + ok(ret, "ImageList_Destroy failed\n"); + } + himl = pImageList_Create(BMP_CX, BMP_CX, ILC_COLOR4|ILC_MASK, 2, -20); ok(himl != 0, "ImageList_Create failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 3, 4, ILC_COLOR4|ILC_MASK, "init 2 grow -20"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 3, -20, ILC_COLOR4|ILC_MASK, "init 2 grow -20"); ret = pImageList_Destroy(himl); ok(ret, "ImageList_Destroy failed\n");
@@ -1264,13 +1308,13 @@ static void test_imagelist_storage(void) { himl = pImageList_Create(BMP_CX, BMP_CX, ILC_COLOR4|ILC_MASK, 2, 65536+12); ok(himl != 0, "ImageList_Create failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 3, 12, ILC_COLOR4|ILC_MASK, "init 2 grow 65536+12"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 3, 65536+12, ILC_COLOR4|ILC_MASK, "init 2 grow 65536+12"); ret = pImageList_Destroy(himl); ok(ret, "ImageList_Destroy failed\n");
himl = pImageList_Create(BMP_CX, BMP_CX, ILC_COLOR4|ILC_MASK, 2, 65535); ok(himl != 0, "ImageList_Create failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 3, 0, ILC_COLOR4|ILC_MASK, "init 2 grow 65535"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 3, 65535, ILC_COLOR4|ILC_MASK, "init 2 grow 65535"); ret = pImageList_Destroy(himl); ok(ret, "ImageList_Destroy failed\n"); } @@ -1537,7 +1581,7 @@ cleanup:
if(himl) { - ret = ImageList_Destroy(himl); + ret = pImageList_Destroy(himl); ok(ret, "ImageList_Destroy failed\n"); } } @@ -1560,21 +1604,21 @@ static void test_iimagelist(void) imgl = (IImageList*)createImageList(32, 32); ret = IImageList_AddRef(imgl); ok(ret == 2, "Expected 2, got %d\n", ret); - ret = ImageList_Destroy((HIMAGELIST)imgl); + ret = pImageList_Destroy((HIMAGELIST)imgl); ok(ret == TRUE, "Expected TRUE, got %d\n", ret); - ret = ImageList_Destroy((HIMAGELIST)imgl); + ret = pImageList_Destroy((HIMAGELIST)imgl); ok(ret == TRUE, "Expected TRUE, got %d\n", ret); - ret = ImageList_Destroy((HIMAGELIST)imgl); + ret = pImageList_Destroy((HIMAGELIST)imgl); ok(ret == FALSE, "Expected FALSE, got %d\n", ret);
imgl = (IImageList*)createImageList(32, 32); ret = IImageList_AddRef(imgl); ok(ret == 2, "Expected 2, got %d\n", ret); - ret = ImageList_Destroy((HIMAGELIST)imgl); + ret = pImageList_Destroy((HIMAGELIST)imgl); ok(ret == TRUE, "Expected TRUE, got %d\n", ret); ret = IImageList_Release(imgl); ok(ret == 0, "Expected 0, got %d\n", ret); - ret = ImageList_Destroy((HIMAGELIST)imgl); + ret = pImageList_Destroy((HIMAGELIST)imgl); ok(ret == FALSE, "Expected FALSE, got %d\n", ret);
/* ref counting, HIMAGELIST_QueryInterface adds a reference */ @@ -1635,7 +1679,7 @@ static void test_IImageList_Add_Remove(void) int ret;
/* create an imagelist to play with */ - himl = ImageList_Create(84, 84, ILC_COLOR16, 0, 3); + himl = pImageList_Create(84, 84, ILC_COLOR16, 0, 3); ok(himl != 0,"failed to create imagelist\n");
imgl = (IImageList *) himl; @@ -1689,7 +1733,7 @@ static void test_IImageList_Get_SetImageCount(void) INT ret;
/* create an imagelist to play with */ - himl = ImageList_Create(84, 84, ILC_COLOR16, 0, 3); + himl = pImageList_Create(84, 84, ILC_COLOR16, 0, 3); ok(himl != 0,"failed to create imagelist\n");
imgl = (IImageList *) himl; @@ -1734,7 +1778,7 @@ static void test_IImageList_Draw(void) ok(hdc!=NULL, "couldn't get DC\n");
/* create an imagelist to play with */ - himl = ImageList_Create(48, 48, ILC_COLOR16, 0, 3); + himl = pImageList_Create(48, 48, ILC_COLOR16, 0, 3); ok(himl!=0,"failed to create imagelist\n");
imgl = (IImageList *) himl; @@ -1811,10 +1855,10 @@ static void test_IImageList_Merge(void) HRESULT hr; int ret;
- himl1 = ImageList_Create(32,32,0,0,3); + himl1 = pImageList_Create(32,32,0,0,3); ok(himl1 != NULL,"failed to create himl1\n");
- himl2 = ImageList_Create(32,32,0,0,3); + himl2 = pImageList_Create(32,32,0,0,3); ok(himl2 != NULL,"failed to create himl2\n");
hicon1 = CreateIcon(hinst, 32, 32, 1, 1, icon_bits, icon_bits); @@ -1848,7 +1892,7 @@ if (0)
/* Same happens if himl2 is empty */ IImageList_Release(imgl2); - himl2 = ImageList_Create(32,32,0,0,3); + himl2 = pImageList_Create(32,32,0,0,3); ok(himl2 != NULL,"failed to recreate himl2\n");
imgl2 = (IImageList *) himl2; @@ -2007,9 +2051,9 @@ static void check_color_table(const char *name, HDC hdc, HIMAGELIST himl, UINT i ok((bmi->bmiColors[i].rgbRed == expect[i].rgbRed && bmi->bmiColors[i].rgbGreen == expect[i].rgbGreen && bmi->bmiColors[i].rgbBlue == expect[i].rgbBlue) || - broken(bmi->bmiColors[i].rgbRed == broken_expect[i].rgbRed && + (broken_expect && broken(bmi->bmiColors[i].rgbRed == broken_expect[i].rgbRed && bmi->bmiColors[i].rgbGreen == broken_expect[i].rgbGreen && - bmi->bmiColors[i].rgbBlue == broken_expect[i].rgbBlue), + bmi->bmiColors[i].rgbBlue == broken_expect[i].rgbBlue)), "%d: %s: got color[%d] %02x %02x %02x expect %02x %02x %02x\n", depth, name, i, bmi->bmiColors[i].rgbRed, bmi->bmiColors[i].rgbGreen, bmi->bmiColors[i].rgbBlue, expect[i].rgbRed, expect[i].rgbGreen, expect[i].rgbBlue); @@ -2346,7 +2390,7 @@ static void test_IImageList_GetIconSize(void)
static void init_functions(void) { - HMODULE hComCtl32 = GetModuleHandleA("comctl32.dll"); + HMODULE hComCtl32 = LoadLibraryA("comctl32.dll");
#define X(f) p##f = (void*)GetProcAddress(hComCtl32, #f); #define X2(f, ord) p##f = (void*)GetProcAddress(hComCtl32, (const char *)ord); @@ -2375,6 +2419,7 @@ static void init_functions(void) X(ImageList_LoadImageW); X(ImageList_CoCreateInstance); X(HIMAGELIST_QueryInterface); + X(ImageList_Draw); #undef X #undef X2 } @@ -2388,8 +2433,6 @@ START_TEST(imagelist)
hinst = GetModuleHandleA(NULL);
- InitCommonControls(); - test_create_destroy(); test_begindrag(); test_hotspot(); diff --git a/modules/rostests/winetests/comctl32/ipaddress.c b/modules/rostests/winetests/comctl32/ipaddress.c index f5075662dd..52581899a7 100644 --- a/modules/rostests/winetests/comctl32/ipaddress.c +++ b/modules/rostests/winetests/comctl32/ipaddress.c @@ -17,7 +17,12 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include "precomp.h" + +#include <windows.h> +#include <commctrl.h> + +#include "wine/test.h" +#include "v6util.h"
#define expect(expected, got) ok(expected == got, "expected %d, got %d\n", expected,got)
@@ -57,32 +62,17 @@ static void test_get_set_text(void) DestroyWindow(hwnd); }
-static BOOL init(void) +START_TEST(ipaddress) { - HMODULE hComctl32; - BOOL (WINAPI *pInitCommonControlsEx)(const INITCOMMONCONTROLSEX*); - INITCOMMONCONTROLSEX iccex; - - hComctl32 = GetModuleHandleA("comctl32.dll"); - pInitCommonControlsEx = (void*)GetProcAddress(hComctl32, "InitCommonControlsEx"); - if (!pInitCommonControlsEx) - { - win_skip("InitCommonControlsEx() is missing.\n"); - return FALSE; - } + ULONG_PTR cookie; + HANDLE ctxt;
- iccex.dwSize = sizeof(iccex); - /* W2K and below need ICC_INTERNET_CLASSES for the IP Address Control */ - iccex.dwICC = ICC_INTERNET_CLASSES; - pInitCommonControlsEx(&iccex); - - return TRUE; -} + test_get_set_text();
-START_TEST(ipaddress) -{ - if (!init()) + if (!load_v6_module(&cookie, &ctxt)) return;
test_get_set_text(); + + unload_v6_module(cookie, ctxt); } diff --git a/modules/rostests/winetests/comctl32/listbox.c b/modules/rostests/winetests/comctl32/listbox.c index d24aaa2216..1513bea7f5 100644 --- a/modules/rostests/winetests/comctl32/listbox.c +++ b/modules/rostests/winetests/comctl32/listbox.c @@ -17,7 +17,19 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include "precomp.h" +#include <stdarg.h> +#include <stdio.h> + +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "winuser.h" +#include "winnls.h" +#include "commctrl.h" + +#include "wine/heap.h" +#include "wine/test.h" +#include "v6util.h"
static const char * const strings[4] = { "First added", @@ -31,6 +43,15 @@ static const char * const strings[4] = {
static const char BAD_EXTENSION[] = "*.badtxt";
+static int strcmp_aw(LPCWSTR strw, const char *stra) +{ + WCHAR buf[1024]; + + if (!stra) return 1; + MultiByteToWideChar(CP_ACP, 0, stra, -1, buf, sizeof(buf)/sizeof(WCHAR)); + return lstrcmpW(strw, buf); +} + static HWND create_listbox(DWORD add_style, HWND parent) { INT_PTR ctl_id = 0; @@ -39,7 +60,7 @@ static HWND create_listbox(DWORD add_style, HWND parent) if (parent) ctl_id=1;
- handle = CreateWindowA("LISTBOX", "TestList", (LBS_STANDARD & ~LBS_SORT) | add_style, 0, 0, 100, 100, + handle = CreateWindowA(WC_LISTBOXA, "TestList", (LBS_STANDARD & ~LBS_SORT) | add_style, 0, 0, 100, 100, parent, (HMENU)ctl_id, NULL, 0); ok(handle != NULL, "Failed to create listbox window.\n");
@@ -144,11 +165,11 @@ static void run_test(const struct listbox_test test) WCHAR *txtw; CHAR *txt;
- txt = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size + 1); + txt = heap_alloc_zero(size + 1); resA = SendMessageA(hLB, LB_GETTEXT, i, (LPARAM)txt); ok(!strcmp(txt, strings[i]), "returned string for item %d does not match %s vs %s\n", i, txt, strings[i]);
- txtw = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (size + 1) * sizeof(*txtw)); + txtw = heap_alloc_zero((size + 1) * sizeof(*txtw)); resW = SendMessageW(hLB, LB_GETTEXT, i, (LPARAM)txtw); if (resA != resW) trace("SendMessageW(LB_GETTEXT) not supported on this platform (resA=%d resW=%d), skipping...\n", resA, resW); @@ -158,8 +179,8 @@ static void run_test(const struct listbox_test test) ok(!strcmp (txt, strings[i]), "returned string for item %d does not match %s vs %s\n", i, txt, strings[i]); }
- HeapFree(GetProcessHeap(), 0, txtw); - HeapFree(GetProcessHeap(), 0, txt); + heap_free(txtw); + heap_free(txt); }
/* Confirm the count of items, and that an invalid delete does not remove anything */ @@ -196,7 +217,7 @@ static void test_item_height(void)
DestroyWindow (hLB);
- hLB = CreateWindowA("LISTBOX", "TestList", LBS_OWNERDRAWVARIABLE, 0, 0, 100, 100, NULL, NULL, NULL, 0); + hLB = CreateWindowA(WC_LISTBOXA, "TestList", LBS_OWNERDRAWVARIABLE, 0, 0, 100, 100, NULL, NULL, NULL, 0);
itemHeight = SendMessageA(hLB, LB_GETITEMHEIGHT, 0, 0); ok(itemHeight > 0 && itemHeight <= tm.tmHeight, "Unexpected item height %d, expected %d.\n", @@ -217,6 +238,31 @@ static LRESULT WINAPI main_window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARA { switch (msg) { + case WM_MEASUREITEM: + { + DWORD style = GetWindowLongA(GetWindow(hwnd, GW_CHILD), GWL_STYLE); + MEASUREITEMSTRUCT *mi = (void*)lparam; + + ok(wparam == mi->CtlID, "got wParam=%08lx, expected %08x\n", wparam, mi->CtlID); + ok(mi->CtlType == ODT_LISTBOX, "mi->CtlType = %u\n", mi->CtlType); + ok(mi->CtlID == 1, "mi->CtlID = %u\n", mi->CtlID); + ok(mi->itemHeight, "mi->itemHeight = 0\n"); + + if (mi->itemID > 4 || style & LBS_OWNERDRAWFIXED) + break; + + if (style & LBS_HASSTRINGS) + { + ok(!strcmp_aw((WCHAR*)mi->itemData, strings[mi->itemID]), + "mi->itemData = %s (%d)\n", wine_dbgstr_w((WCHAR*)mi->itemData), mi->itemID); + } + else + { + ok((void*)mi->itemData == strings[mi->itemID], + "mi->itemData = %08lx, expected %p\n", mi->itemData, strings[mi->itemID]); + } + break; + } case WM_DRAWITEM: { RECT rc_item, rc_client, rc_clip; @@ -279,10 +325,10 @@ static void test_ownerdraw(void) RECT rc;
parent = create_parent(); - assert(parent); + ok(parent != NULL, "Failed to create parent window.\n");
hLB = create_listbox(LBS_OWNERDRAWFIXED | WS_CHILD | WS_VISIBLE, parent); - assert(hLB); + ok(hLB != NULL, "Failed to create listbox window.\n");
SetForegroundWindow(hLB); UpdateWindow(hLB); @@ -321,7 +367,7 @@ static void test_LB_SELITEMRANGE(void) INT ret;
hLB = create_listbox(LBS_EXTENDEDSEL, 0); - assert(hLB); + ok(hLB != NULL, "Failed to create listbox window.\n");
listbox_query(hLB, &answer); listbox_test_query(test_nosel, answer); @@ -419,7 +465,7 @@ static void test_listbox_height(void) HWND hList; int r, id;
- hList = CreateWindowA( "ListBox", "list test", 0, + hList = CreateWindowA( WC_LISTBOXA, "list test", 0, 1, 1, 600, 100, NULL, NULL, NULL, NULL ); ok( hList != NULL, "failed to create listbox\n");
@@ -459,21 +505,20 @@ static void test_itemfrompoint(void) without caption). LBS_NOINTEGRALHEIGHT is required in order to test behavior of partially-displayed item. */ - HWND hList = CreateWindowA( "ListBox", "list test", + HWND hList = CreateWindowA( WC_LISTBOXA, "list test", WS_VISIBLE|WS_POPUP|LBS_NOINTEGRALHEIGHT, 1, 1, 600, 100, NULL, NULL, NULL, NULL ); ULONG r, id; RECT rc;
- /* For an empty listbox win2k returns 0x1ffff, win98 returns 0x10000, nt4 returns 0xffffffff */ r = SendMessageA(hList, LB_ITEMFROMPOINT, 0, MAKELPARAM( /* x */ 30, /* y */ 30 )); - ok( r == 0x1ffff || r == 0x10000 || r == 0xffffffff, "ret %x\n", r ); + ok( r == MAKELPARAM(0xffff, 1), "Unexpected ret value %#x.\n", r );
r = SendMessageA(hList, LB_ITEMFROMPOINT, 0, MAKELPARAM( 700, 30 )); - ok( r == 0x1ffff || r == 0x10000 || r == 0xffffffff, "ret %x\n", r ); + ok( r == MAKELPARAM(0xffff, 1), "Unexpected ret value %#x.\n", r );
r = SendMessageA(hList, LB_ITEMFROMPOINT, 0, MAKELPARAM( 30, 300 )); - ok( r == 0x1ffff || r == 0x10000 || r == 0xffffffff, "ret %x\n", r ); + ok( r == MAKELPARAM(0xffff, 1), "Unexpected ret value %#x.\n", r );
id = SendMessageA( hList, LB_ADDSTRING, 0, (LPARAM) "hi"); ok( id == 0, "item id wrong\n"); @@ -484,7 +529,7 @@ static void test_itemfrompoint(void) ok( r == 0x1, "ret %x\n", r );
r = SendMessageA(hList, LB_ITEMFROMPOINT, 0, MAKELPARAM( /* x */ 30, /* y */ 601 )); - ok( r == 0x10001, "ret %x\n", r ); + ok( r == MAKELPARAM(1, 1), "Unexpected ret value %#x.\n", r );
/* Resize control so that below assertions about sizes are valid */ r = SendMessageA( hList, LB_GETITEMRECT, 0, (LPARAM)&rc); @@ -540,7 +585,7 @@ static void test_listbox_item_data(void) HWND hList; int r, id;
- hList = CreateWindowA( "ListBox", "list test", 0, + hList = CreateWindowA( WC_LISTBOXA, "list test", 0, 1, 1, 600, 100, NULL, NULL, NULL, NULL ); ok( hList != NULL, "failed to create listbox\n");
@@ -580,9 +625,9 @@ static void test_listbox_LB_DIR(void) one file that fits the wildcard w*.c . Normally, the test directory itself satisfies both conditions. */ - hList = CreateWindowA( "ListBox", "list test", WS_VISIBLE|WS_POPUP, + hList = CreateWindowA( WC_LISTBOXA, "list test", WS_VISIBLE|WS_POPUP, 1, 1, 600, 100, NULL, NULL, NULL, NULL ); - assert(hList); + ok(hList != NULL, "Failed to create listbox window.\n");
/* Test for standard usage */
@@ -891,7 +936,7 @@ static void test_listbox_LB_DIR(void) strcpy(pathBuffer, wildcard); SendMessageA(hList, LB_RESETCONTENT, 0, 0); res = SendMessageA(hList, LB_DIR, DDL_DIRECTORY|DDL_EXCLUSIVE, (LPARAM)pathBuffer); - ok (res != -1 || broken(res == -1), "SendMessage(LB_DIR, DDL_DIRECTORY|DDL_EXCLUSIVE, *) failed err %u\n", + ok (res != -1, "SendMessage(LB_DIR, DDL_DIRECTORY|DDL_EXCLUSIVE, *) failed err %u\n", GetLastError());
itemCount = SendMessageA(hList, LB_GETCOUNT, 0, 0); @@ -999,11 +1044,11 @@ static HWND g_label;
static BOOL on_listbox_container_create(HWND hwnd, CREATESTRUCTA *lpcs) { - g_label = CreateWindowA("Static", "Contents of static control before DlgDirList.", + g_label = CreateWindowA(WC_STATICA, "Contents of static control before DlgDirList.", WS_CHILD | WS_VISIBLE, 10, 10, 512, 32, hwnd, (HMENU)ID_TEST_LABEL, NULL, 0); if (!g_label) return FALSE;
- g_listBox = CreateWindowA("ListBox", "DlgDirList test", + g_listBox = CreateWindowA(WC_LISTBOXA, "DlgDirList test", WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | WS_VSCROLL, 10, 60, 256, 256, hwnd, (HMENU)ID_TEST_LISTBOX, NULL, 0); if (!g_listBox) return FALSE; @@ -1064,6 +1109,7 @@ static void test_listbox_dlgdir(void) char * p; char driveletter; HANDLE file; + BOOL ret;
file = CreateFileA( "wtest1.tmp.c", GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL ); ok(file != INVALID_HANDLE_VALUE, "Error creating the test file: %d\n", GetLastError()); @@ -1076,7 +1122,8 @@ static void test_listbox_dlgdir(void) */
hInst = GetModuleHandleA(0); - if (!RegisterListboxWindowClass(hInst)) assert(0); + ret = RegisterListboxWindowClass(hInst); + ok(ret, "Failed to register test class.\n");
hWnd = CreateWindowA("ListboxContainerClass", "ListboxContainerClass", WS_OVERLAPPEDWINDOW | WS_VISIBLE, @@ -1824,6 +1871,26 @@ static void test_listbox(void) run_test(EMS_NS); }
+static void test_WM_MEASUREITEM(void) +{ + HWND parent, listbox; + LRESULT data; + + parent = create_parent(); + listbox = create_listbox(WS_CHILD | LBS_OWNERDRAWVARIABLE, parent); + + data = SendMessageA(listbox, LB_GETITEMDATA, 0, 0); + ok(data == (LRESULT)strings[0], "data = %08lx, expected %p\n", data, strings[0]); + DestroyWindow(parent); + + parent = create_parent(); + listbox = create_listbox(WS_CHILD | LBS_OWNERDRAWVARIABLE | LBS_HASSTRINGS, parent); + + data = SendMessageA(listbox, LB_GETITEMDATA, 0, 0); + ok(!data, "data = %08lx\n", data); + DestroyWindow(parent); +} + START_TEST(listbox) { ULONG_PTR ctx_cookie; @@ -1846,6 +1913,7 @@ START_TEST(listbox) test_GetListBoxInfo(); test_missing_lbuttonup(); test_extents(); + test_WM_MEASUREITEM();
unload_v6_module(ctx_cookie, hCtx); } diff --git a/modules/rostests/winetests/comctl32/listview.c b/modules/rostests/winetests/comctl32/listview.c index 90fce7439f..ddeb991c81 100644 --- a/modules/rostests/winetests/comctl32/listview.c +++ b/modules/rostests/winetests/comctl32/listview.c @@ -20,7 +20,18 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include "precomp.h" +#include <stdio.h> +#include <windows.h> +#include <commctrl.h> + +#include "wine/test.h" +#include "v6util.h" +#include "msg.h" + +static HIMAGELIST (WINAPI *pImageList_Create)(int, int, UINT, int, int); +static BOOL (WINAPI *pImageList_Destroy)(HIMAGELIST); +static int (WINAPI *pImageList_Add)(HIMAGELIST, HBITMAP, HBITMAP); +static BOOL (WINAPI *p_TrackMouseEvent)(TRACKMOUSEEVENT *);
enum seq_index { PARENT_SEQ_INDEX, @@ -67,6 +78,18 @@ static BOOL g_focus_test_LVN_DELETEITEM;
static HWND subclass_editbox(HWND hwndListview);
+static void init_functions(void) +{ + HMODULE hComCtl32 = LoadLibraryA("comctl32.dll"); + +#define X(f) p##f = (void*)GetProcAddress(hComCtl32, #f); + X(ImageList_Create); + X(ImageList_Destroy); + X(ImageList_Add); + X(_TrackMouseEvent); +#undef X +} + static struct msg_sequence *sequences[NUM_MSG_SEQUENCES];
static const struct message create_ownerdrawfixed_parent_seq[] = { @@ -695,6 +718,21 @@ static HWND create_listview_controlW(DWORD style, HWND parent) return hwnd; }
+static BOOL is_win_xp(void) +{ + HWND hwnd, header; + BOOL ret; + + hwnd = create_listview_control(LVS_ICON); + SendMessageA(hwnd, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_HEADERINALLVIEWS, LVS_EX_HEADERINALLVIEWS); + header = (HWND)SendMessageA(hwnd, LVM_GETHEADER, 0, 0); + ret = !IsWindow(header); + + DestroyWindow(hwnd); + + return ret; +} + static LRESULT WINAPI header_subclass_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { WNDPROC oldproc = (WNDPROC)GetWindowLongPtrA(hwnd, GWLP_USERDATA); @@ -842,16 +880,16 @@ static void test_images(void) RECT r1, r2; static CHAR hello[] = "hello";
- himl = ImageList_Create(40, 40, 0, 4, 4); + himl = pImageList_Create(40, 40, 0, 4, 4); ok(himl != NULL, "failed to create imagelist\n");
hbmp = CreateBitmap(40, 40, 1, 1, NULL); ok(hbmp != NULL, "failed to create bitmap\n");
- r = ImageList_Add(himl, hbmp, 0); + r = pImageList_Add(himl, hbmp, 0); ok(r == 0, "should be zero\n");
- hwnd = CreateWindowExA(0, "SysListView32", "foo", LVS_OWNERDRAWFIXED, + hwnd = CreateWindowExA(0, WC_LISTVIEWA, "foo", LVS_OWNERDRAWFIXED, 10, 10, 100, 200, hwndparent, NULL, NULL, NULL); ok(hwnd != NULL, "failed to create listview window\n");
@@ -914,7 +952,7 @@ static void test_checkboxes(void) text2[] = "Text2", text3[] = "Text3";
- hwnd = CreateWindowExA(0, "SysListView32", "foo", LVS_REPORT, + hwnd = CreateWindowExA(0, WC_LISTVIEWA, "foo", LVS_REPORT, 10, 10, 100, 200, hwndparent, NULL, NULL, NULL); ok(hwnd != NULL, "failed to create listview window\n");
@@ -1141,7 +1179,7 @@ static void test_items(void) LVITEMA item; DWORD r;
- hwnd = CreateWindowExA(0, "SysListView32", "foo", LVS_REPORT, + hwnd = CreateWindowExA(0, WC_LISTVIEWA, "foo", LVS_REPORT, 10, 10, 100, 200, hwndparent, NULL, NULL, NULL); ok(hwnd != NULL, "failed to create listview window\n");
@@ -1398,7 +1436,7 @@ static void test_columns(void) CHAR buff[5]; DWORD rc;
- hwnd = CreateWindowExA(0, "SysListView32", "foo", LVS_LIST, + hwnd = CreateWindowExA(0, WC_LISTVIEWA, "foo", LVS_LIST, 10, 10, 100, 200, hwndparent, NULL, NULL, NULL); ok(hwnd != NULL, "failed to create listview window\n");
@@ -1413,7 +1451,7 @@ static void test_columns(void)
DestroyWindow(hwnd);
- hwnd = CreateWindowExA(0, "SysListView32", "foo", LVS_REPORT, + hwnd = CreateWindowExA(0, WC_LISTVIEWA, "foo", LVS_REPORT, 10, 10, 100, 200, hwndparent, NULL, NULL, NULL); ok(hwnd != NULL, "failed to create listview window\n");
@@ -1513,7 +1551,28 @@ static LRESULT CALLBACK create_test_wndproc(HWND hwnd, UINT uMsg, WPARAM wParam, return ret; }
-static void test_create(void) +/* Header creation is delayed in classic implementation. */ +#define TEST_NO_HEADER(a) test_header_presence_(a, FALSE, __LINE__) +#define TEST_HEADER_EXPECTED(a) test_header_presence_(a, TRUE, __LINE__) +#define TEST_NO_HEADER2(a, b) test_header_presence_(a, b, __LINE__) +static void test_header_presence_(HWND hwnd, BOOL present, int line) +{ + HWND header = (HWND)SendMessageA(hwnd, LVM_GETHEADER, 0, 0); + + if (present) + { + ok_(__FILE__, line)(IsWindow(header), "Header should have been created.\n"); + if (header) /* FIXME: remove when todo's are fixed */ + ok_(__FILE__, line)(header == GetDlgItem(hwnd, 0), "Dialog item expected.\n"); + } + else + { + ok_(__FILE__, line)(!IsWindow(header), "Header shouldn't be created.\n"); + ok_(__FILE__, line)(NULL == GetDlgItem(hwnd, 0), "NULL dialog item expected.\n"); + } +} + +static void test_create(BOOL is_version_6) { static const WCHAR testtextW[] = {'t','e','s','t',' ','t','e','x','t',0}; char buff[16]; @@ -1525,15 +1584,24 @@ static void test_create(void) RECT rect; WNDCLASSEXA cls; DWORD style; + ATOM class; + + if (is_win_xp() && is_version_6) + { + win_skip("Skipping some tests on XP.\n"); + return; + }
cls.cbSize = sizeof(WNDCLASSEXA); - ok(GetClassInfoExA(GetModuleHandleA(NULL), "SysListView32", &cls), "GetClassInfoEx failed\n"); + r = GetClassInfoExA(GetModuleHandleA(NULL), WC_LISTVIEWA, &cls); + ok(r, "Failed to get class info.\n"); listviewWndProc = cls.lpfnWndProc; cls.lpfnWndProc = create_test_wndproc; cls.lpszClassName = "MyListView32"; - ok(RegisterClassExA(&cls), "RegisterClassEx failed\n"); + class = RegisterClassExA(&cls); + ok(class, "Failed to register class.\n");
- test_create_imagelist = ImageList_Create(16, 16, 0, 5, 10); + test_create_imagelist = pImageList_Create(16, 16, 0, 5, 10); hList = CreateWindowA("MyListView32", "Test", WS_VISIBLE, 0, 0, 100, 100, NULL, NULL, GetModuleHandleA(NULL), 0); ok((HIMAGELIST)SendMessageA(hList, LVM_GETIMAGELIST, 0, 0) == test_create_imagelist, "Image list not obtained\n"); hHeader = (HWND)SendMessageA(hList, LVM_GETHEADER, 0, 0); @@ -1542,150 +1610,118 @@ static void test_create(void) DestroyWindow(hList);
/* header isn't created on LVS_ICON and LVS_LIST styles */ - hList = CreateWindowA("SysListView32", "Test", WS_VISIBLE, 0, 0, 100, 100, NULL, NULL, - GetModuleHandleA(NULL), 0); - hHeader = (HWND)SendMessageA(hList, LVM_GETHEADER, 0, 0); - ok(!IsWindow(hHeader), "Header shouldn't be created\n"); - ok(NULL == GetDlgItem(hList, 0), "NULL dialog item expected\n"); + hList = CreateWindowA(WC_LISTVIEWA, "Test", WS_VISIBLE, 0, 0, 100, 100, NULL, NULL, GetModuleHandleA(NULL), 0); + TEST_NO_HEADER(hList); + /* insert column */ memset(&col, 0, sizeof(LVCOLUMNA)); col.mask = LVCF_WIDTH; col.cx = 100; r = SendMessageA(hList, LVM_INSERTCOLUMNA, 0, (LPARAM)&col); expect(0, r); + TEST_HEADER_EXPECTED(hList); hHeader = (HWND)SendMessageA(hList, LVM_GETHEADER, 0, 0); - ok(IsWindow(hHeader), "Header should be created\n"); - ok(hHeader == GetDlgItem(hList, 0), "Expected header as dialog item\n"); style = GetWindowLongA(hHeader, GWL_STYLE); ok(!(style & HDS_HIDDEN), "Not expected HDS_HIDDEN\n"); DestroyWindow(hList);
- hList = CreateWindowA("SysListView32", "Test", WS_VISIBLE|LVS_LIST, 0, 0, 100, 100, NULL, NULL, + hList = CreateWindowA(WC_LISTVIEWA, "Test", WS_VISIBLE|LVS_LIST, 0, 0, 100, 100, NULL, NULL, GetModuleHandleA(NULL), 0); - hHeader = (HWND)SendMessageA(hList, LVM_GETHEADER, 0, 0); - ok(!IsWindow(hHeader), "Header shouldn't be created\n"); - ok(NULL == GetDlgItem(hList, 0), "NULL dialog item expected\n"); + TEST_NO_HEADER(hList); /* insert column */ memset(&col, 0, sizeof(LVCOLUMNA)); col.mask = LVCF_WIDTH; col.cx = 100; r = SendMessageA(hList, LVM_INSERTCOLUMNA, 0, (LPARAM)&col); expect(0, r); - hHeader = (HWND)SendMessageA(hList, LVM_GETHEADER, 0, 0); - ok(IsWindow(hHeader), "Header should be created\n"); - ok(hHeader == GetDlgItem(hList, 0), "Expected header as dialog item\n"); + TEST_HEADER_EXPECTED(hList); DestroyWindow(hList);
/* try to switch LVS_ICON -> LVS_REPORT and back LVS_ICON -> LVS_REPORT */ - hList = CreateWindowA("SysListView32", "Test", WS_VISIBLE, 0, 0, 100, 100, NULL, NULL, + hList = CreateWindowA(WC_LISTVIEWA, "Test", WS_VISIBLE, 0, 0, 100, 100, NULL, NULL, GetModuleHandleA(NULL), 0); ret = SetWindowLongPtrA(hList, GWL_STYLE, GetWindowLongPtrA(hList, GWL_STYLE) | LVS_REPORT); ok(ret & WS_VISIBLE, "Style wrong, should have WS_VISIBLE\n"); - hHeader = (HWND)SendMessageA(hList, LVM_GETHEADER, 0, 0); - ok(IsWindow(hHeader), "Header should be created\n"); + TEST_HEADER_EXPECTED(hList); ret = SetWindowLongPtrA(hList, GWL_STYLE, GetWindowLongA(hList, GWL_STYLE) & ~LVS_REPORT); ok((ret & WS_VISIBLE) && (ret & LVS_REPORT), "Style wrong, should have WS_VISIBLE|LVS_REPORT\n"); - hHeader = (HWND)SendMessageA(hList, LVM_GETHEADER, 0, 0); - ok(IsWindow(hHeader), "Header should be created\n"); - ok(hHeader == GetDlgItem(hList, 0), "Expected header as dialog item\n"); + TEST_HEADER_EXPECTED(hList); DestroyWindow(hList);
/* try to switch LVS_LIST -> LVS_REPORT and back LVS_LIST -> LVS_REPORT */ - hList = CreateWindowA("SysListView32", "Test", WS_VISIBLE|LVS_LIST, 0, 0, 100, 100, NULL, NULL, + hList = CreateWindowA(WC_LISTVIEWA, "Test", WS_VISIBLE|LVS_LIST, 0, 0, 100, 100, NULL, NULL, GetModuleHandleA(NULL), 0); ret = SetWindowLongPtrA(hList, GWL_STYLE, (GetWindowLongPtrA(hList, GWL_STYLE) & ~LVS_LIST) | LVS_REPORT); ok(((ret & WS_VISIBLE) && (ret & LVS_LIST)), "Style wrong, should have WS_VISIBLE|LVS_LIST\n"); - hHeader = (HWND)SendMessageA(hList, LVM_GETHEADER, 0, 0); - ok(IsWindow(hHeader), "Header should be created\n"); - ok(hHeader == GetDlgItem(hList, 0), "Expected header as dialog item\n"); - ret = SetWindowLongPtrA(hList, GWL_STYLE, - (GetWindowLongPtrA(hList, GWL_STYLE) & ~LVS_REPORT) | LVS_LIST); + TEST_HEADER_EXPECTED(hList); + ret = SetWindowLongPtrA(hList, GWL_STYLE, (GetWindowLongPtrA(hList, GWL_STYLE) & ~LVS_REPORT) | LVS_LIST); ok(((ret & WS_VISIBLE) && (ret & LVS_REPORT)), "Style wrong, should have WS_VISIBLE|LVS_REPORT\n"); - hHeader = (HWND)SendMessageA(hList, LVM_GETHEADER, 0, 0); - ok(IsWindow(hHeader), "Header should be created\n"); - ok(hHeader == GetDlgItem(hList, 0), "Expected header as dialog item\n"); + TEST_HEADER_EXPECTED(hList); DestroyWindow(hList);
/* LVS_REPORT without WS_VISIBLE */ - hList = CreateWindowA("SysListView32", "Test", LVS_REPORT, 0, 0, 100, 100, NULL, NULL, + hList = CreateWindowA(WC_LISTVIEWA, "Test", LVS_REPORT, 0, 0, 100, 100, NULL, NULL, GetModuleHandleA(NULL), 0); hHeader = (HWND)SendMessageA(hList, LVM_GETHEADER, 0, 0); - ok(!IsWindow(hHeader), "Header shouldn't be created\n"); - ok(NULL == GetDlgItem(hList, 0), "NULL dialog item expected\n"); +todo_wine_if(is_version_6) + TEST_NO_HEADER2(hList, is_version_6); + /* insert column */ memset(&col, 0, sizeof(LVCOLUMNA)); col.mask = LVCF_WIDTH; col.cx = 100; r = SendMessageA(hList, LVM_INSERTCOLUMNA, 0, (LPARAM)&col); expect(0, r); - hHeader = (HWND)SendMessageA(hList, LVM_GETHEADER, 0, 0); - ok(IsWindow(hHeader), "Header should be created\n"); - ok(hHeader == GetDlgItem(hList, 0), "Expected header as dialog item\n"); + TEST_HEADER_EXPECTED(hList); DestroyWindow(hList);
/* LVS_REPORT without WS_VISIBLE, try to show it */ - hList = CreateWindowA("SysListView32", "Test", LVS_REPORT, 0, 0, 100, 100, NULL, NULL, + hList = CreateWindowA(WC_LISTVIEWA, "Test", LVS_REPORT, 0, 0, 100, 100, NULL, NULL, GetModuleHandleA(NULL), 0); - hHeader = (HWND)SendMessageA(hList, LVM_GETHEADER, 0, 0); - ok(!IsWindow(hHeader), "Header shouldn't be created\n"); - ok(NULL == GetDlgItem(hList, 0), "NULL dialog item expected\n"); +todo_wine_if(is_version_6) + TEST_NO_HEADER2(hList, is_version_6); + ShowWindow(hList, SW_SHOW); - hHeader = (HWND)SendMessageA(hList, LVM_GETHEADER, 0, 0); - ok(IsWindow(hHeader), "Header should be created\n"); - ok(hHeader == GetDlgItem(hList, 0), "Expected header as dialog item\n"); + TEST_HEADER_EXPECTED(hList); DestroyWindow(hList);
/* LVS_REPORT with LVS_NOCOLUMNHEADER */ - hList = CreateWindowA("SysListView32", "Test", LVS_REPORT|LVS_NOCOLUMNHEADER|WS_VISIBLE, + hList = CreateWindowA(WC_LISTVIEWA, "Test", LVS_REPORT|LVS_NOCOLUMNHEADER|WS_VISIBLE, 0, 0, 100, 100, NULL, NULL, GetModuleHandleA(NULL), 0); + TEST_HEADER_EXPECTED(hList); hHeader = (HWND)SendMessageA(hList, LVM_GETHEADER, 0, 0); - ok(IsWindow(hHeader), "Header should be created\n"); - ok(hHeader == GetDlgItem(hList, 0), "Expected header as dialog item\n"); /* HDS_DRAGDROP set by default */ ok(GetWindowLongPtrA(hHeader, GWL_STYLE) & HDS_DRAGDROP, "Expected header to have HDS_DRAGDROP\n"); DestroyWindow(hList);
/* setting LVS_EX_HEADERDRAGDROP creates header */ - hList = CreateWindowA("SysListView32", "Test", LVS_REPORT, 0, 0, 100, 100, NULL, NULL, + hList = CreateWindowA(WC_LISTVIEWA, "Test", LVS_REPORT, 0, 0, 100, 100, NULL, NULL, GetModuleHandleA(NULL), 0); - hHeader = (HWND)SendMessageA(hList, LVM_GETHEADER, 0, 0); - ok(!IsWindow(hHeader), "Header shouldn't be created\n"); - ok(NULL == GetDlgItem(hList, 0), "NULL dialog item expected\n"); +todo_wine_if(is_version_6) + TEST_NO_HEADER2(hList, is_version_6); + SendMessageA(hList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_HEADERDRAGDROP); - hHeader = (HWND)SendMessageA(hList, LVM_GETHEADER, 0, 0); - ok(IsWindow(hHeader) || - broken(!IsWindow(hHeader)), /* 4.7x common controls */ - "Header should be created\n"); - ok(hHeader == GetDlgItem(hList, 0), "Expected header as dialog item\n"); + TEST_HEADER_EXPECTED(hList); DestroyWindow(hList);
/* setting LVS_EX_GRIDLINES creates header */ - hList = CreateWindowA("SysListView32", "Test", LVS_REPORT, 0, 0, 100, 100, NULL, NULL, + hList = CreateWindowA(WC_LISTVIEWA, "Test", LVS_REPORT, 0, 0, 100, 100, NULL, NULL, GetModuleHandleA(NULL), 0); - hHeader = (HWND)SendMessageA(hList, LVM_GETHEADER, 0, 0); - ok(!IsWindow(hHeader), "Header shouldn't be created\n"); - ok(NULL == GetDlgItem(hList, 0), "NULL dialog item expected\n"); +todo_wine_if(is_version_6) + TEST_NO_HEADER2(hList, is_version_6); + SendMessageA(hList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_GRIDLINES); - hHeader = (HWND)SendMessageA(hList, LVM_GETHEADER, 0, 0); - ok(IsWindow(hHeader) || - broken(!IsWindow(hHeader)), /* 4.7x common controls */ - "Header should be created\n"); - ok(hHeader == GetDlgItem(hList, 0), "Expected header as dialog item\n"); + TEST_HEADER_EXPECTED(hList); DestroyWindow(hList);
/* setting LVS_EX_FULLROWSELECT creates header */ - hList = CreateWindowA("SysListView32", "Test", LVS_REPORT, 0, 0, 100, 100, NULL, NULL, + hList = CreateWindowA(WC_LISTVIEWA, "Test", LVS_REPORT, 0, 0, 100, 100, NULL, NULL, GetModuleHandleA(NULL), 0); - hHeader = (HWND)SendMessageA(hList, LVM_GETHEADER, 0, 0); - ok(!IsWindow(hHeader), "Header shouldn't be created\n"); - ok(NULL == GetDlgItem(hList, 0), "NULL dialog item expected\n"); +todo_wine_if(is_version_6) + TEST_NO_HEADER2(hList, is_version_6); SendMessageA(hList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT); - hHeader = (HWND)SendMessageA(hList, LVM_GETHEADER, 0, 0); - ok(IsWindow(hHeader) || - broken(!IsWindow(hHeader)), /* 4.7x common controls */ - "Header should be created\n"); - ok(hHeader == GetDlgItem(hList, 0), "Expected header as dialog item\n"); + TEST_HEADER_EXPECTED(hList); DestroyWindow(hList);
/* not report style accepts LVS_EX_HEADERDRAGDROP too */ @@ -1696,21 +1732,19 @@ static void test_create(void) DestroyWindow(hList);
/* requesting header info with LVM_GETSUBITEMRECT doesn't create it */ - hList = CreateWindowA("SysListView32", "Test", LVS_REPORT, 0, 0, 100, 100, NULL, NULL, + hList = CreateWindowA(WC_LISTVIEWA, "Test", LVS_REPORT, 0, 0, 100, 100, NULL, NULL, GetModuleHandleA(NULL), 0); - ok(!IsWindow(hHeader), "Header shouldn't be created\n"); - ok(NULL == GetDlgItem(hList, 0), "NULL dialog item expected\n"); +todo_wine_if(is_version_6) + TEST_NO_HEADER2(hList, is_version_6);
SetRect(&rect, LVIR_BOUNDS, 1, -10, -10); r = SendMessageA(hList, LVM_GETSUBITEMRECT, -1, (LPARAM)&rect); + ok(r == 1, "Unexpected ret value %d.\n", r); /* right value contains garbage, probably because header columns are not set up */ - expect(0, rect.bottom); - expect(1, r); - - hHeader = (HWND)SendMessageA(hList, LVM_GETHEADER, 0, 0); - ok(!IsWindow(hHeader), "Header shouldn't be created\n"); - ok(GetDlgItem(hList, 0) == NULL, "NULL dialog item expected\n"); + ok(rect.bottom >= 0, "Unexpected rectangle.\n");
+todo_wine_if(is_version_6) + TEST_NO_HEADER2(hList, is_version_6); DestroyWindow(hList);
/* WM_MEASUREITEM should be sent when created with LVS_OWNERDRAWFIXED */ @@ -1736,6 +1770,9 @@ static void test_create(void) GetWindowTextA(hList, buff, sizeof(buff)); ok(!strcmp(buff, "test text"), "Unexpected window text %s.\n", buff); DestroyWindow(hList); + + r = UnregisterClassA("MyListView32", NULL); + ok(r, "Failed to unregister test class.\n"); }
static void test_redraw(void) @@ -1834,12 +1871,16 @@ static LRESULT WINAPI cd_wndproc(HWND hwnd, UINT message, WPARAM wParam, LPARAM clr = GetBkColor(nmlvcd->nmcd.hdc); ok(nmlvcd->clrTextBk == CLR_DEFAULT, "got 0x%x\n", nmlvcd->clrTextBk); ok(nmlvcd->clrText == RGB(0, 255, 0), "got 0x%x\n", nmlvcd->clrText); - todo_wine_if(nmlvcd->iSubItem) - ok(clr == c0ffee, "clr=%.8x\n", clr); + if (!(GetWindowLongW(nmhdr->hwndFrom, GWL_STYLE) & LVS_SHOWSELALWAYS)) + { + todo_wine_if(nmlvcd->iSubItem) + ok(clr == c0ffee, "clr=%.8x\n", clr); + } return CDRF_NOTIFYPOSTPAINT; case CDDS_ITEMPOSTPAINT | CDDS_SUBITEM: clr = GetBkColor(nmlvcd->nmcd.hdc); - todo_wine ok(clr == c0ffee, "clr=%.8x\n", clr); + if (!(GetWindowLongW(nmhdr->hwndFrom, GWL_STYLE) & LVS_SHOWSELALWAYS)) + todo_wine ok(clr == c0ffee, "clr=%.8x\n", clr); ok(nmlvcd->clrTextBk == CLR_DEFAULT, "got 0x%x\n", nmlvcd->clrTextBk); ok(nmlvcd->clrText == RGB(0, 255, 0), "got 0x%x\n", nmlvcd->clrText); return CDRF_DODEFAULT; @@ -1855,6 +1896,7 @@ static void test_customdraw(void) { HWND hwnd; WNDPROC oldwndproc; + LVITEMA item;
hwnd = create_listview_control(LVS_REPORT);
@@ -1874,6 +1916,18 @@ static void test_customdraw(void) UpdateWindow(hwnd); ok_sequence(sequences, PARENT_CD_SEQ_INDEX, parent_report_cd_seq, "parent customdraw, LVS_REPORT", FALSE);
+ /* check colors when item is selected */ + SetWindowLongW(hwnd, GWL_STYLE, GetWindowLongW(hwnd, GWL_STYLE) | LVS_SHOWSELALWAYS); + item.mask = LVIF_STATE; + item.stateMask = LVIS_SELECTED; + item.state = LVIS_SELECTED; + SendMessageA(hwnd, LVM_SETITEMSTATE, 0, (LPARAM)&item); + + flush_sequences(sequences, NUM_MSG_SEQUENCES); + InvalidateRect(hwnd, NULL, TRUE); + UpdateWindow(hwnd); + ok_sequence(sequences, PARENT_CD_SEQ_INDEX, parent_report_cd_seq, "parent customdraw, LVS_REPORT, selection", FALSE); + DestroyWindow(hwnd);
hwnd = create_listview_control(LVS_LIST); @@ -2797,7 +2851,7 @@ static void test_subitem_rect(void) DestroyWindow(hwnd);
/* try it for non LVS_REPORT style */ - hwnd = CreateWindowA("SysListView32", "Test", LVS_ICON, 0, 0, 100, 100, NULL, NULL, + hwnd = CreateWindowA(WC_LISTVIEWA, "Test", LVS_ICON, 0, 0, 100, 100, NULL, NULL, GetModuleHandleA(NULL), 0); SetRect(&rect, LVIR_BOUNDS, 1, -10, -10); r = SendMessageA(hwnd, LVM_GETSUBITEMRECT, -1, (LPARAM)&rect); @@ -3726,15 +3780,15 @@ static void test_hittest(void) test_lvm_hittest(hwnd, x, y, -1, LVHT_TORIGHT, 0, FALSE, TRUE); test_lvm_subitemhittest(hwnd, x, y, -1, -1, LVHT_NOWHERE, FALSE, FALSE, FALSE); /* try with icons, state icons index is 1 based so at least 2 bitmaps needed */ - himl = ImageList_Create(16, 16, 0, 4, 4); + himl = pImageList_Create(16, 16, 0, 4, 4); ok(himl != NULL, "failed to create imagelist\n"); hbmp = CreateBitmap(16, 16, 1, 1, NULL); ok(hbmp != NULL, "failed to create bitmap\n"); - r = ImageList_Add(himl, hbmp, 0); + r = pImageList_Add(himl, hbmp, 0); ok(r == 0, "should be zero\n"); hbmp = CreateBitmap(16, 16, 1, 1, NULL); ok(hbmp != NULL, "failed to create bitmap\n"); - r = ImageList_Add(himl, hbmp, 0); + r = pImageList_Add(himl, hbmp, 0); ok(r == 1, "should be one\n");
r = SendMessageA(hwnd, LVM_SETIMAGELIST, LVSIL_STATE, (LPARAM)himl); @@ -4016,15 +4070,15 @@ todo_wine expect(TRUE, r);
/* state icons */ - himl = ImageList_Create(16, 16, 0, 2, 2); + himl = pImageList_Create(16, 16, 0, 2, 2); ok(himl != NULL, "failed to create imagelist\n"); hbm = CreateBitmap(16, 16, 1, 1, NULL); ok(hbm != NULL, "failed to create bitmap\n"); - r = ImageList_Add(himl, hbm, 0); + r = pImageList_Add(himl, hbm, 0); expect(0, r); hbm = CreateBitmap(16, 16, 1, 1, NULL); ok(hbm != NULL, "failed to create bitmap\n"); - r = ImageList_Add(himl, hbm, 0); + r = pImageList_Add(himl, hbm, 0); expect(1, r);
r = SendMessageA(hwnd, LVM_SETIMAGELIST, LVSIL_STATE, (LPARAM)himl); @@ -4164,7 +4218,7 @@ static void test_editbox(void) ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq, "edit box WM_COMMAND (EN_SETFOCUS), no edit created", FALSE); /* same thing but with valid window */ - hwndedit = CreateWindowA("Edit", "Test edit", WS_VISIBLE | WS_CHILD, 0, 0, 20, + hwndedit = CreateWindowA(WC_EDITA, "Test edit", WS_VISIBLE | WS_CHILD, 0, 0, 20, 10, hwnd, (HMENU)1, (HINSTANCE)GetWindowLongPtrA(hwnd, GWLP_HINSTANCE), 0); flush_sequences(sequences, NUM_MSG_SEQUENCES); r = SendMessageA(hwnd, WM_COMMAND, MAKEWPARAM(0, EN_SETFOCUS), (LPARAM)hwndedit); @@ -4696,9 +4750,9 @@ static void test_getitemspacing(void) expect(cy, HIWORD(ret));
/* now try with icons */ - himl40 = ImageList_Create(40, 40, 0, 4, 4); + himl40 = pImageList_Create(40, 40, 0, 4, 4); ok(himl40 != NULL, "failed to create imagelist\n"); - himl80 = ImageList_Create(80, 80, 0, 4, 4); + himl80 = pImageList_Create(80, 80, 0, 4, 4); ok(himl80 != NULL, "failed to create imagelist\n"); ret = SendMessageA(hwnd, LVM_SETIMAGELIST, LVSIL_NORMAL, (LPARAM)himl40); expect(0, ret); @@ -4766,7 +4820,7 @@ static void test_getitemspacing(void) expect(cy + 40, HIWORD(ret));
SendMessageA(hwnd, LVM_SETIMAGELIST, LVSIL_NORMAL, 0); - ImageList_Destroy(himl80); + pImageList_Destroy(himl80); DestroyWindow(hwnd); /* LVS_SMALLICON */ hwnd = create_listview_control(LVS_SMALLICON); @@ -4784,7 +4838,7 @@ static void test_getitemspacing(void) expect(cy + 40, HIWORD(ret));
SendMessageA(hwnd, LVM_SETIMAGELIST, LVSIL_NORMAL, 0); - ImageList_Destroy(himl40); + pImageList_Destroy(himl40); DestroyWindow(hwnd); /* LVS_REPORT */ hwnd = create_listview_control(LVS_REPORT); @@ -4967,11 +5021,11 @@ static void test_approximate_viewrect(void)
/* LVS_ICON */ hwnd = create_listview_control(LVS_ICON); - himl = ImageList_Create(40, 40, 0, 4, 4); + himl = pImageList_Create(40, 40, 0, 4, 4); ok(himl != NULL, "failed to create imagelist\n"); hbmp = CreateBitmap(40, 40, 1, 1, NULL); ok(hbmp != NULL, "failed to create bitmap\n"); - ret = ImageList_Add(himl, hbmp, 0); + ret = pImageList_Add(himl, hbmp, 0); expect(0, ret); ret = SendMessageA(hwnd, LVM_SETIMAGELIST, 0, (LPARAM)himl); expect(0, ret); @@ -5588,7 +5642,7 @@ static void test_createdragimage(void)
himl = (HIMAGELIST)SendMessageA(list, LVM_CREATEDRAGIMAGE, 0, (LPARAM)&pt); ok(himl != NULL, "got %p\n", himl); - ImageList_Destroy(himl); + pImageList_Destroy(himl);
DestroyWindow(list); } @@ -5703,9 +5757,9 @@ static void test_imagelists(void) HIMAGELIST himl1, himl2, himl3; LRESULT ret;
- himl1 = ImageList_Create(40, 40, 0, 4, 4); - himl2 = ImageList_Create(40, 40, 0, 4, 4); - himl3 = ImageList_Create(40, 40, 0, 4, 4); + himl1 = pImageList_Create(40, 40, 0, 4, 4); + himl2 = pImageList_Create(40, 40, 0, 4, 4); + himl3 = pImageList_Create(40, 40, 0, 4, 4); ok(himl1 != NULL, "Failed to create imagelist\n"); ok(himl2 != NULL, "Failed to create imagelist\n"); ok(himl3 != NULL, "Failed to create imagelist\n"); @@ -5938,7 +5992,7 @@ static void test_oneclickactivate(void) INT r; POINT orig_pos;
- hwnd = CreateWindowExA(0, "SysListView32", "foo", WS_VISIBLE|WS_CHILD|LVS_LIST, + hwnd = CreateWindowExA(0, WC_LISTVIEWA, "foo", WS_VISIBLE|WS_CHILD|LVS_LIST, 10, 10, 100, 200, hwndparent, NULL, NULL, NULL); ok(hwnd != NULL, "failed to create listview window\n"); r = SendMessageA(hwnd, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_ONECLICKACTIVATE); @@ -5971,7 +6025,7 @@ static void test_oneclickactivate(void)
track.cbSize = sizeof(track); track.dwFlags = TME_QUERY; - _TrackMouseEvent(&track); + p_TrackMouseEvent(&track); ok(track.hwndTrack == hwnd, "hwndTrack != hwnd\n"); ok(track.dwFlags == TME_LEAVE, "dwFlags = %x\n", track.dwFlags);
@@ -6146,16 +6200,17 @@ static void test_state_image(void) insert_column(hwnd, 0); insert_column(hwnd, 1);
- item.mask = LVIF_TEXT; + item.mask = LVIF_TEXT | LVIF_PARAM; item.iItem = 0; item.iSubItem = 0; item.pszText = text; + item.lParam = 123456; r = SendMessageA(hwnd, LVM_INSERTITEMA, 0, (LPARAM)&item); ok(r == 0, "Failed to insert an item.\n");
item.mask = LVIF_STATE; - item.state = INDEXTOSTATEIMAGEMASK(1) | LVIS_SELECTED; - item.stateMask = LVIS_STATEIMAGEMASK | LVIS_SELECTED; + item.state = INDEXTOSTATEIMAGEMASK(1) | LVIS_SELECTED | LVIS_FOCUSED; + item.stateMask = LVIS_STATEIMAGEMASK | LVIS_SELECTED | LVIS_FOCUSED; item.iItem = 0; item.iSubItem = 0; r = SendMessageA(hwnd, LVM_SETITEMA, 0, (LPARAM)&item); @@ -6168,27 +6223,49 @@ static void test_state_image(void) r = SendMessageA(hwnd, LVM_SETITEMA, 0, (LPARAM)&item); ok(r, "Failed to set subitem text.\n");
- item.mask = LVIF_STATE; - item.stateMask = LVIS_STATEIMAGEMASK | LVIS_SELECTED; + item.mask = LVIF_STATE | LVIF_PARAM; + item.stateMask = ~0u; item.state = 0; item.iItem = 0; item.iSubItem = 0; + item.lParam = 0; r = SendMessageA(hwnd, LVM_GETITEMA, 0, (LPARAM)&item); ok(r, "Failed to get item state.\n"); - ok(item.state == (INDEXTOSTATEIMAGEMASK(1) | LVIS_SELECTED), "Unexpected item state %#x.\n", item.state); + ok(item.state == (INDEXTOSTATEIMAGEMASK(1) | LVIS_SELECTED | LVIS_FOCUSED), + "Unexpected item state %#x.\n", item.state); + ok(item.lParam == 123456, "Unexpected lParam %ld.\n", item.lParam);
- item.mask = LVIF_STATE; - item.stateMask = LVIS_STATEIMAGEMASK | LVIS_SELECTED; + item.mask = 0; + item.stateMask = ~0u; item.state = INDEXTOSTATEIMAGEMASK(2); item.iItem = 0; item.iSubItem = 1; r = SendMessageA(hwnd, LVM_GETITEMA, 0, (LPARAM)&item); ok(r, "Failed to get subitem state.\n"); - todo_wine + ok(item.state == INDEXTOSTATEIMAGEMASK(2), "Unexpected state %#x.\n", item.state); + + item.mask = LVIF_STATE | LVIF_PARAM; + item.stateMask = ~0u; + item.state = INDEXTOSTATEIMAGEMASK(2); + item.iItem = 0; + item.iSubItem = 1; + item.lParam = 0; + r = SendMessageA(hwnd, LVM_GETITEMA, 0, (LPARAM)&item); + ok(r, "Failed to get subitem state.\n"); ok(item.state == 0, "Unexpected state %#x.\n", item.state); + ok(item.lParam == 123456, "Unexpected lParam %ld.\n", item.lParam);
item.mask = LVIF_STATE; - item.stateMask = LVIS_STATEIMAGEMASK | LVIS_SELECTED; + item.stateMask = LVIS_FOCUSED; + item.state = 0; + item.iItem = 0; + item.iSubItem = 1; + r = SendMessageA(hwnd, LVM_GETITEMA, 0, (LPARAM)&item); + ok(r, "Failed to get subitem state.\n"); + ok(item.state == 0, "Unexpected state %#x.\n", item.state); + + item.mask = LVIF_STATE; + item.stateMask = ~0u; item.state = INDEXTOSTATEIMAGEMASK(2); item.iItem = 0; item.iSubItem = 2; @@ -6210,25 +6287,56 @@ static void test_state_image(void) } }
-START_TEST(listview) +static void test_LVSCW_AUTOSIZE(void) { - HMODULE hComctl32; - BOOL (WINAPI *pInitCommonControlsEx)(const INITCOMMONCONTROLSEX*); + int width, width2; + HWND hwnd; + BOOL ret; + + hwnd = create_listview_control(LVS_REPORT); + ok(hwnd != NULL, "failed to create a listview window\n"); + + insert_column(hwnd, 0); + insert_column(hwnd, 1); + insert_item(hwnd, 0); + + ret = SendMessageA(hwnd, LVM_SETCOLUMNWIDTH, 0, LVSCW_AUTOSIZE); + ok(ret, "Failed to set column width.\n"); + + width = SendMessageA(hwnd, LVM_GETCOLUMNWIDTH, 0, 0); + ok(width > 0, "Unexpected column width %d.\n", width);
+ /* Turn on checkboxes. */ + ret = SendMessageA(hwnd, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_CHECKBOXES, LVS_EX_CHECKBOXES); + ok(ret == 0, "Unexpected previous extended style.\n"); + + ret = SendMessageA(hwnd, LVM_SETCOLUMNWIDTH, 0, LVSCW_AUTOSIZE); + ok(ret, "Failed to set column width.\n"); + + width2 = SendMessageA(hwnd, LVM_GETCOLUMNWIDTH, 0, 0); + ok(width2 > 0, "Unexpected column width %d.\n", width2); + ok(width2 > width, "Expected increased column width.\n"); + + /* Turn off checkboxes. */ + ret = SendMessageA(hwnd, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_CHECKBOXES, 0); + ok(ret == LVS_EX_CHECKBOXES, "Unexpected previous extended style.\n"); + + ret = SendMessageA(hwnd, LVM_SETCOLUMNWIDTH, 0, LVSCW_AUTOSIZE); + ok(ret, "Failed to set column width.\n"); + + width = SendMessageA(hwnd, LVM_GETCOLUMNWIDTH, 0, 0); + ok(width > 0, "Unexpected column width %d.\n", width2); + ok(width2 > width, "Expected reduced column width.\n"); + + DestroyWindow(hwnd); +} + +START_TEST(listview) +{ ULONG_PTR ctx_cookie; HANDLE hCtx;
- hComctl32 = GetModuleHandleA("comctl32.dll"); - pInitCommonControlsEx = (void*)GetProcAddress(hComctl32, "InitCommonControlsEx"); - if (pInitCommonControlsEx) - { - INITCOMMONCONTROLSEX iccex; - iccex.dwSize = sizeof(iccex); - iccex.dwICC = ICC_LISTVIEW_CLASSES; - pInitCommonControlsEx(&iccex); - } - else - InitCommonControls(); + init_functions();
init_msg_sequences(sequences, NUM_MSG_SEQUENCES);
@@ -6242,7 +6350,7 @@ START_TEST(listview) test_images(); test_checkboxes(); test_items(); - test_create(); + test_create(FALSE); test_redraw(); test_customdraw(); test_icon_spacing(); @@ -6283,6 +6391,7 @@ START_TEST(listview) test_oneclickactivate(); test_callback_mask(); test_state_image(); + test_LVSCW_AUTOSIZE();
if (!load_v6_module(&ctx_cookie, &hCtx)) { @@ -6290,6 +6399,8 @@ START_TEST(listview) return; }
+ init_functions(); + /* comctl32 version 6 tests start here */ test_get_set_view(); test_canceleditlabel(); @@ -6304,6 +6415,7 @@ START_TEST(listview) test_images(); test_checkboxes(); test_items(); + test_create(TRUE); test_color(); test_columns(); test_sorting(); @@ -6321,6 +6433,7 @@ START_TEST(listview) test_LVM_REDRAWITEMS(); test_oneclickactivate(); test_state_image(); + test_LVSCW_AUTOSIZE();
unload_v6_module(ctx_cookie, hCtx);
diff --git a/modules/rostests/winetests/comctl32/misc.c b/modules/rostests/winetests/comctl32/misc.c index 2ce3536859..e18ca39453 100644 --- a/modules/rostests/winetests/comctl32/misc.c +++ b/modules/rostests/winetests/comctl32/misc.c @@ -18,7 +18,12 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include "precomp.h" +#include <stdio.h> +#include <windows.h> +#include <commctrl.h> + +#include "wine/test.h" +#include "v6util.h"
static PVOID (WINAPI * pAlloc)(LONG); static PVOID (WINAPI * pReAlloc)(PVOID, LONG); @@ -344,7 +349,12 @@ static void check_class( const char *name, int must_exist, UINT style, UINT igno
if (GetClassInfoA( 0, name, &wc )) { -todo_wine +todo_wine_if(strcmp(name, "Button") && + strcmp(name, "ComboBox") && + strcmp(name, "Edit") && + strcmp(name, "Static") && + strcmp(name, "ListBox") && + strcmp(name, "ComboLBox")) ok( !(~wc.style & style & ~ignore), "System class %s is missing bits %x (%08x/%08x)\n", name, ~wc.style & style, wc.style, style ); ok( !(wc.style & ~style), "System class %s has extra bits %x (%08x/%08x)\n", diff --git a/modules/rostests/winetests/comctl32/monthcal.c b/modules/rostests/winetests/comctl32/monthcal.c index 84ba54acfa..85822a320c 100644 --- a/modules/rostests/winetests/comctl32/monthcal.c +++ b/modules/rostests/winetests/comctl32/monthcal.c @@ -19,7 +19,18 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include "precomp.h" +#include <stdarg.h> + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" + +#include "commctrl.h" + +#include "wine/test.h" +#include "v6util.h" +#include <windows.h> +#include "msg.h"
#define expect(expected, got) ok(expected == got, "Expected %d, got %d\n", expected, got); #define expect_hex(expected, got) ok(expected == got, "Expected %x, got %x\n", expected, got); @@ -31,6 +42,8 @@
#define SEL_NOTIFY_TEST_ID 100
+static BOOL (WINAPI *pInitCommonControlsEx)(const INITCOMMONCONTROLSEX*); + static struct msg_sequence *sequences[NUM_MSG_SEQUENCES];
static HWND parent_wnd; @@ -587,8 +600,6 @@ static HWND create_parent_window(void) { HWND hwnd;
- InitCommonControls(); - /* flush message sequences, so we can check the new sequence by the end of function */ flush_sequences(sequences, NUM_MSG_SEQUENCES);
@@ -2028,22 +2039,23 @@ static void test_sel_notify(void) } }
+static void init_functions(void) +{ + HMODULE hComCtl32 = LoadLibraryA("comctl32.dll"); + +#define X(f) p##f = (void*)GetProcAddress(hComCtl32, #f); + X(InitCommonControlsEx); +#undef X +} + START_TEST(monthcal) { - BOOL (WINAPI *pInitCommonControlsEx)(const INITCOMMONCONTROLSEX*); INITCOMMONCONTROLSEX iccex; - HMODULE hComctl32; - ULONG_PTR ctx_cookie; HANDLE hCtx;
- hComctl32 = GetModuleHandleA("comctl32.dll"); - pInitCommonControlsEx = (void*)GetProcAddress(hComctl32, "InitCommonControlsEx"); - if (!pInitCommonControlsEx) - { - win_skip("InitCommonControlsEx() is missing. Skipping the tests\n"); - return; - } + init_functions(); + iccex.dwSize = sizeof(iccex); iccex.dwICC = ICC_DATE_CLASSES; pInitCommonControlsEx(&iccex); diff --git a/modules/rostests/winetests/comctl32/mru.c b/modules/rostests/winetests/comctl32/mru.c index 1cb9a99c60..dfad6f859d 100644 --- a/modules/rostests/winetests/comctl32/mru.c +++ b/modules/rostests/winetests/comctl32/mru.c @@ -17,8 +17,19 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include <stdarg.h>
-#include "precomp.h" +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "winuser.h" +#include "winnls.h" +#include "winreg.h" +#include "commctrl.h" +#include "shlwapi.h" + +#include "wine/heap.h" +#include "wine/test.h"
/* Keys for testing MRU functions */ #define REG_TEST_BASEKEYA "Software\Wine" @@ -66,18 +77,22 @@ static INT (WINAPI *pFindMRUData)(HANDLE, LPCVOID, DWORD, LPINT); static INT (WINAPI *pAddMRUData)(HANDLE, LPCVOID, DWORD); static HANDLE (WINAPI *pCreateMRUListW)(MRUINFOW*);
-static void InitPointers(void) +static void init_functions(void) { - pCreateMRUListA = (void*)GetProcAddress(hComctl32,(LPCSTR)151); - pFreeMRUList = (void*)GetProcAddress(hComctl32,(LPCSTR)152); - pAddMRUStringA = (void*)GetProcAddress(hComctl32,(LPCSTR)153); - pEnumMRUListA = (void*)GetProcAddress(hComctl32,(LPCSTR)154); - pCreateMRUListLazyA = (void*)GetProcAddress(hComctl32,(LPCSTR)157); - pAddMRUData = (void*)GetProcAddress(hComctl32,(LPCSTR)167); - pFindMRUData = (void*)GetProcAddress(hComctl32,(LPCSTR)169); - pCreateMRUListW = (void*)GetProcAddress(hComctl32,(LPCSTR)400); - pEnumMRUListW = (void*)GetProcAddress(hComctl32,(LPCSTR)403); - pCreateMRUListLazyW = (void*)GetProcAddress(hComctl32,(LPCSTR)404); + hComctl32 = LoadLibraryA("comctl32.dll"); + +#define X2(f, ord) p##f = (void*)GetProcAddress(hComctl32, (const char *)ord); + X2(CreateMRUListA, 151); + X2(FreeMRUList, 152); + X2(AddMRUStringA, 153); + X2(EnumMRUListA, 154); + X2(CreateMRUListLazyA, 157); + X2(AddMRUData, 167); + X2(FindMRUData, 169); + X2(CreateMRUListW, 400); + X2(EnumMRUListW, 403); + X2(CreateMRUListLazyW, 404); +#undef X2 }
/* Based on RegDeleteTreeW from dlls/advapi32/registry.c */ @@ -106,7 +121,7 @@ static LSTATUS mru_RegDeleteTreeA(HKEY hKey, LPCSTR lpszSubKey) if (dwMaxLen > sizeof(szNameBuf)/sizeof(CHAR)) { /* Name too big: alloc a buffer for it */ - if (!(lpszName = HeapAlloc( GetProcessHeap(), 0, dwMaxLen*sizeof(CHAR)))) + if (!(lpszName = heap_alloc(dwMaxLen * sizeof(CHAR)))) { ret = ERROR_NOT_ENOUGH_MEMORY; goto cleanup; @@ -141,7 +156,7 @@ static LSTATUS mru_RegDeleteTreeA(HKEY hKey, LPCSTR lpszSubKey) cleanup: /* Free buffer if allocated */ if (lpszName != szNameBuf) - HeapFree( GetProcessHeap(), 0, lpszName); + heap_free(lpszName); if(lpszSubKey) RegCloseKey(hSubKey); return ret; @@ -695,13 +710,11 @@ static void test_CreateMRUListLazyW(void)
START_TEST(mru) { - hComctl32 = GetModuleHandleA("comctl32.dll"); - delete_reg_entries(); if (!create_reg_entries()) return;
- InitPointers(); + init_functions();
test_MRUListA(); test_CreateMRUListLazyA(); diff --git a/modules/rostests/winetests/comctl32/msg.h b/modules/rostests/winetests/comctl32/msg.h index 74b4477867..17e74a36bf 100644 --- a/modules/rostests/winetests/comctl32/msg.h +++ b/modules/rostests/winetests/comctl32/msg.h @@ -20,6 +20,11 @@
#pragma once
+#include <assert.h> +#include <windows.h> +#include "wine/heap.h" +#include "wine/test.h" + /* undocumented SWP flags - from SDK 3.1 */ #define SWP_NOCLIENTSIZE 0x0800 #define SWP_NOCLIENTMOVE 0x1000 @@ -66,16 +71,13 @@ static void add_message(struct msg_sequence **seq, int sequence_index, if (!msg_seq->sequence) { msg_seq->size = 10; - msg_seq->sequence = HeapAlloc(GetProcessHeap(), 0, - msg_seq->size * sizeof (struct message)); + msg_seq->sequence = heap_alloc(msg_seq->size * sizeof (*msg_seq->sequence)); }
if (msg_seq->count == msg_seq->size) { msg_seq->size *= 2; - msg_seq->sequence = HeapReAlloc(GetProcessHeap(), 0, - msg_seq->sequence, - msg_seq->size * sizeof (struct message)); + msg_seq->sequence = heap_realloc(msg_seq->sequence, msg_seq->size * sizeof (*msg_seq->sequence)); }
assert(msg_seq->sequence); @@ -87,7 +89,7 @@ static void add_message(struct msg_sequence **seq, int sequence_index, static inline void flush_sequence(struct msg_sequence **seg, int sequence_index) { struct msg_sequence *msg_seq = seg[sequence_index]; - HeapFree(GetProcessHeap(), 0, msg_seq->sequence); + heap_free(msg_seq->sequence); msg_seq->sequence = NULL; msg_seq->count = msg_seq->size = 0; } @@ -391,5 +393,5 @@ static inline void init_msg_sequences(struct msg_sequence **seq, int n) int i;
for (i = 0; i < n; i++) - seq[i] = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct msg_sequence)); + seq[i] = heap_alloc_zero(sizeof(*seq[i])); } diff --git a/modules/rostests/winetests/comctl32/pager.c b/modules/rostests/winetests/comctl32/pager.c index 4766656150..0da396cdd1 100644 --- a/modules/rostests/winetests/comctl32/pager.c +++ b/modules/rostests/winetests/comctl32/pager.c @@ -18,7 +18,11 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include "precomp.h" +#include <windows.h> +#include <commctrl.h> + +#include "wine/test.h" +#include "msg.h"
#define NUM_MSG_SEQUENCES 1 #define PAGER_SEQ_INDEX 0 @@ -335,7 +339,6 @@ START_TEST(pager)
pSetWindowSubclass = (void*)GetProcAddress(mod, (LPSTR)410);
- InitCommonControls(); init_msg_sequences(sequences, NUM_MSG_SEQUENCES);
parent_wnd = create_parent_window(); diff --git a/modules/rostests/winetests/comctl32/precomp.h b/modules/rostests/winetests/comctl32/precomp.h index 92352b7794..046bc86520 100644 --- a/modules/rostests/winetests/comctl32/precomp.h +++ b/modules/rostests/winetests/comctl32/precomp.h @@ -1,3 +1,4 @@ + #ifndef _COMCTL32_WINETEST_PRECOMP_H_ #define _COMCTL32_WINETEST_PRECOMP_H_
diff --git a/modules/rostests/winetests/comctl32/progress.c b/modules/rostests/winetests/comctl32/progress.c index 506fee007f..b911021be0 100644 --- a/modules/rostests/winetests/comctl32/progress.c +++ b/modules/rostests/winetests/comctl32/progress.c @@ -17,10 +17,21 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include "precomp.h" +#include <stdarg.h>
-static HWND hProgressParentWnd, hProgressWnd; +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "winuser.h" +#include "commctrl.h" + +#include "wine/test.h" + +#include "v6util.h" + +static HWND hProgressParentWnd; static const char progressTestClass[] = "ProgressBarTestClass"; +static BOOL (WINAPI *pInitCommonControlsEx)(const INITCOMMONCONTROLSEX*);
static HWND create_progress(DWORD style) { @@ -85,24 +96,10 @@ static void update_window(HWND hWnd)
static void init(void) { - HMODULE hComctl32; - BOOL (WINAPI *pInitCommonControlsEx)(const INITCOMMONCONTROLSEX*); WNDCLASSA wc; RECT rect; BOOL ret;
- hComctl32 = GetModuleHandleA("comctl32.dll"); - pInitCommonControlsEx = (void*)GetProcAddress(hComctl32, "InitCommonControlsEx"); - if (pInitCommonControlsEx) - { - INITCOMMONCONTROLSEX iccex; - iccex.dwSize = sizeof(iccex); - iccex.dwICC = ICC_PROGRESS_CLASS; - pInitCommonControlsEx(&iccex); - } - else - InitCommonControls(); - wc.style = CS_HREDRAW | CS_VREDRAW; wc.cbClsExtra = 0; wc.cbWndExtra = 0; @@ -123,16 +120,6 @@ static void init(void) CW_USEDEFAULT, CW_USEDEFAULT, rect.right - rect.left, rect.bottom - rect.top, NULL, NULL, GetModuleHandleA(NULL), 0); ok(hProgressParentWnd != NULL, "failed to create parent wnd\n");
- GetClientRect(hProgressParentWnd, &rect); - hProgressWnd = CreateWindowExA(0, PROGRESS_CLASSA, "", WS_CHILD | WS_VISIBLE, - 0, 0, rect.right, rect.bottom, hProgressParentWnd, NULL, GetModuleHandleA(NULL), 0); - ok(hProgressWnd != NULL, "failed to create parent wnd\n"); - progress_wndproc = (WNDPROC)SetWindowLongPtrA(hProgressWnd, GWLP_WNDPROC, (LPARAM)progress_subclass_proc); - - ShowWindow(hProgressParentWnd, SW_SHOWNORMAL); - ok(GetUpdateRect(hProgressParentWnd, NULL, FALSE), "GetUpdateRect: There should be a region that needs to be updated\n"); - flush_events(); - update_window(hProgressParentWnd); }
static void cleanup(void) @@ -155,9 +142,21 @@ static void cleanup(void) */ static void test_redraw(void) { - RECT client_rect; + RECT client_rect, rect; + HWND hProgressWnd; LRESULT ret;
+ GetClientRect(hProgressParentWnd, &rect); + hProgressWnd = CreateWindowExA(0, PROGRESS_CLASSA, "", WS_CHILD | WS_VISIBLE, + 0, 0, rect.right, rect.bottom, hProgressParentWnd, NULL, GetModuleHandleA(NULL), 0); + ok(hProgressWnd != NULL, "Failed to create progress bar.\n"); + progress_wndproc = (WNDPROC)SetWindowLongPtrA(hProgressWnd, GWLP_WNDPROC, (LPARAM)progress_subclass_proc); + + ShowWindow(hProgressParentWnd, SW_SHOWNORMAL); + ok(GetUpdateRect(hProgressParentWnd, NULL, FALSE), "GetUpdateRect: There should be a region that needs to be updated\n"); + flush_events(); + update_window(hProgressParentWnd); + SendMessageA(hProgressWnd, PBM_SETRANGE, 0, MAKELPARAM(0, 100)); SendMessageA(hProgressWnd, PBM_SETPOS, 10, 0); SendMessageA(hProgressWnd, PBM_SETSTEP, 20, 0); @@ -166,15 +165,15 @@ static void test_redraw(void) /* PBM_SETPOS */ ok(SendMessageA(hProgressWnd, PBM_SETPOS, 50, 0) == 10, "PBM_SETPOS must return the previous position\n"); ok(!GetUpdateRect(hProgressWnd, NULL, FALSE), "PBM_SETPOS: The progress bar should be redrawn immediately\n"); - + /* PBM_DELTAPOS */ ok(SendMessageA(hProgressWnd, PBM_DELTAPOS, 15, 0) == 50, "PBM_DELTAPOS must return the previous position\n"); ok(!GetUpdateRect(hProgressWnd, NULL, FALSE), "PBM_DELTAPOS: The progress bar should be redrawn immediately\n"); - + /* PBM_SETPOS */ ok(SendMessageA(hProgressWnd, PBM_SETPOS, 80, 0) == 65, "PBM_SETPOS must return the previous position\n"); ok(!GetUpdateRect(hProgressWnd, NULL, FALSE), "PBM_SETPOS: The progress bar should be redrawn immediately\n"); - + /* PBM_STEPIT */ ok(SendMessageA(hProgressWnd, PBM_STEPIT, 0, 0) == 80, "PBM_STEPIT must return the previous position\n"); ok(!GetUpdateRect(hProgressWnd, NULL, FALSE), "PBM_STEPIT: The progress bar should be redrawn immediately\n"); @@ -183,7 +182,7 @@ static void test_redraw(void) win_skip("PBM_GETPOS needs comctl32 > 4.70\n"); else ok(ret == 100, "PBM_GETPOS returned a wrong position : %d\n", (UINT)ret); - + /* PBM_SETRANGE and PBM_SETRANGE32: Usually the progress bar doesn't repaint itself immediately. If the position is not in the new range, it does. @@ -211,6 +210,8 @@ static void test_redraw(void) wine_dbgstr_rect(&last_paint_rect), wine_dbgstr_rect(&client_rect)); update_window(hProgressWnd); ok(erased, "Progress bar should have erased the background\n"); + + DestroyWindow(hProgressWnd); }
static void test_setcolors(void) @@ -241,12 +242,90 @@ static void test_setcolors(void) DestroyWindow(progress); }
+static void test_PBM_STEPIT(void) +{ + struct stepit_test + { + int min; + int max; + int step; + } stepit_tests[] = + { + { 3, 15, 5 }, + { 3, 15, -5 }, + { 3, 15, 50 }, + }; + HWND progress; + int i, j; + + for (i = 0; i < sizeof(stepit_tests)/sizeof(stepit_tests[0]); i++) + { + struct stepit_test *test = &stepit_tests[i]; + LRESULT ret; + + progress = create_progress(0); + + ret = SendMessageA(progress, PBM_SETRANGE32, test->min, test->max); + ok(ret != 0, "Unexpected return value.\n"); + + SendMessageA(progress, PBM_SETPOS, test->min, 0); + SendMessageA(progress, PBM_SETSTEP, test->step, 0); + + for (j = 0; j < test->max; j++) + { + int pos = SendMessageA(progress, PBM_GETPOS, 0, 0); + int current; + + pos += test->step; + if (pos > test->max) + pos = (pos - test->min) % (test->max - test->min) + test->min; + if (pos < test->min) + pos = (pos - test->min) % (test->max - test->min) + test->max; + + SendMessageA(progress, PBM_STEPIT, 0, 0); + + current = SendMessageA(progress, PBM_GETPOS, 0, 0); + ok(current == pos, "Unexpected position %d, expected %d.\n", current, pos); + } + + DestroyWindow(progress); + } +} + +static void init_functions(void) +{ + HMODULE hComCtl32 = LoadLibraryA("comctl32.dll"); + +#define X(f) p##f = (void*)GetProcAddress(hComCtl32, #f); + X(InitCommonControlsEx); +#undef X +} + START_TEST(progress) { + INITCOMMONCONTROLSEX iccex; + ULONG_PTR ctx_cookie; + HANDLE hCtx; + + init_functions(); + + iccex.dwSize = sizeof(iccex); + iccex.dwICC = ICC_PROGRESS_CLASS; + pInitCommonControlsEx(&iccex); + init(); - + test_redraw(); test_setcolors(); + test_PBM_STEPIT(); + + if (!load_v6_module(&ctx_cookie, &hCtx)) + return; + + test_setcolors(); + test_PBM_STEPIT(); + + unload_v6_module(ctx_cookie, hCtx);
cleanup(); } diff --git a/modules/rostests/winetests/comctl32/propsheet.c b/modules/rostests/winetests/comctl32/propsheet.c index 35e942c6b5..25d7cdec89 100644 --- a/modules/rostests/winetests/comctl32/propsheet.c +++ b/modules/rostests/winetests/comctl32/propsheet.c @@ -18,9 +18,17 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include "precomp.h" +#include <windows.h> +#include <commctrl.h> +#include "msg.h"
+#include "resources.h" + +#include "wine/test.h" + +#ifdef __REACTOS__ #include <reactos/undocuser.h> +#endif
static HWND parenthwnd; static HWND sheethwnd; @@ -30,6 +38,10 @@ static LONG active_page = -1;
#define IDC_APPLY_BUTTON 12321
+static HPROPSHEETPAGE (WINAPI *pCreatePropertySheetPageA)(const PROPSHEETPAGEA *desc); +static HPROPSHEETPAGE (WINAPI *pCreatePropertySheetPageW)(const PROPSHEETPAGEW *desc); +static BOOL (WINAPI *pDestroyPropertySheetPage)(HPROPSHEETPAGE proppage); +static INT_PTR (WINAPI *pPropertySheetA)(const PROPSHEETHEADERA *header);
static void detect_locale(void) { @@ -137,7 +149,7 @@ static void test_title(void) psp.pfnDlgProc = page_dlg_proc; psp.lParam = 0;
- hpsp[0] = CreatePropertySheetPageA(&psp); + hpsp[0] = pCreatePropertySheetPageA(&psp);
memset(&psh, 0, sizeof(psh)); psh.dwSize = PROPSHEETHEADERA_V1_SIZE; @@ -148,7 +160,7 @@ static void test_title(void) U3(psh).phpage = hpsp; psh.pfnCallback = sheet_callback;
- hdlg = (HWND)PropertySheetA(&psh); + hdlg = (HWND)pPropertySheetA(&psh); ok(hdlg != INVALID_HANDLE_VALUE, "got invalid handle value %p\n", hdlg);
style = GetWindowLongA(hdlg, GWL_STYLE); @@ -176,7 +188,7 @@ static void test_nopage(void) psp.pfnDlgProc = page_dlg_proc; psp.lParam = 0;
- hpsp[0] = CreatePropertySheetPageA(&psp); + hpsp[0] = pCreatePropertySheetPageA(&psp);
memset(&psh, 0, sizeof(psh)); psh.dwSize = PROPSHEETHEADERA_V1_SIZE; @@ -187,7 +199,7 @@ static void test_nopage(void) U3(psh).phpage = hpsp; psh.pfnCallback = sheet_callback;
- hdlg = (HWND)PropertySheetA(&psh); + hdlg = (HWND)pPropertySheetA(&psh); ok(hdlg != INVALID_HANDLE_VALUE, "got invalid handle value %p\n", hdlg);
ShowWindow(hdlg,SW_NORMAL); @@ -256,7 +268,7 @@ static void test_disableowner(void) psp.pfnDlgProc = NULL; psp.lParam = 0;
- hpsp[0] = CreatePropertySheetPageA(&psp); + hpsp[0] = pCreatePropertySheetPageA(&psp);
memset(&psh, 0, sizeof(psh)); psh.dwSize = PROPSHEETHEADERA_V1_SIZE; @@ -267,7 +279,7 @@ static void test_disableowner(void) U3(psh).phpage = hpsp; psh.pfnCallback = disableowner_callback;
- p = PropertySheetA(&psh); + p = pPropertySheetA(&psh); todo_wine ok(p == 0, "Expected 0, got %ld\n", p); ok(IsWindowEnabled(parenthwnd) != 0, "parent window should be enabled\n"); @@ -353,25 +365,25 @@ static void test_wiznavigation(void) psp[0].hInstance = GetModuleHandleA(NULL); U(psp[0]).pszTemplate = (LPCSTR)MAKEINTRESOURCE(IDD_PROP_PAGE_INTRO); psp[0].pfnDlgProc = nav_page_proc; - hpsp[0] = CreatePropertySheetPageA(&psp[0]); + hpsp[0] = pCreatePropertySheetPageA(&psp[0]);
psp[1].dwSize = sizeof(PROPSHEETPAGEA); psp[1].hInstance = GetModuleHandleA(NULL); U(psp[1]).pszTemplate = (LPCSTR)MAKEINTRESOURCE(IDD_PROP_PAGE_EDIT); psp[1].pfnDlgProc = nav_page_proc; - hpsp[1] = CreatePropertySheetPageA(&psp[1]); + hpsp[1] = pCreatePropertySheetPageA(&psp[1]);
psp[2].dwSize = sizeof(PROPSHEETPAGEA); psp[2].hInstance = GetModuleHandleA(NULL); U(psp[2]).pszTemplate = (LPCSTR)MAKEINTRESOURCE(IDD_PROP_PAGE_RADIO); psp[2].pfnDlgProc = nav_page_proc; - hpsp[2] = CreatePropertySheetPageA(&psp[2]); + hpsp[2] = pCreatePropertySheetPageA(&psp[2]);
psp[3].dwSize = sizeof(PROPSHEETPAGEA); psp[3].hInstance = GetModuleHandleA(NULL); U(psp[3]).pszTemplate = (LPCSTR)MAKEINTRESOURCE(IDD_PROP_PAGE_EXIT); psp[3].pfnDlgProc = nav_page_proc; - hpsp[3] = CreatePropertySheetPageA(&psp[3]); + hpsp[3] = pCreatePropertySheetPageA(&psp[3]);
/* set up the property sheet dialog */ memset(&psh, 0, sizeof(psh)); @@ -381,7 +393,7 @@ static void test_wiznavigation(void) psh.nPages = 4; psh.hwndParent = GetDesktopWindow(); U3(psh).phpage = hpsp; - hdlg = (HWND)PropertySheetA(&psh); + hdlg = (HWND)pPropertySheetA(&psh); ok(hdlg != INVALID_HANDLE_VALUE, "got invalid handle %p\n", hdlg);
ok(active_page == 0, "Active page should be 0. Is: %d\n", active_page); @@ -476,7 +488,7 @@ static void test_buttons(void) psp.pfnDlgProc = page_dlg_proc; psp.lParam = 0;
- hpsp[0] = CreatePropertySheetPageA(&psp); + hpsp[0] = pCreatePropertySheetPageA(&psp);
memset(&psh, 0, sizeof(psh)); psh.dwSize = PROPSHEETHEADERA_V1_SIZE; @@ -487,7 +499,7 @@ static void test_buttons(void) U3(psh).phpage = hpsp; psh.pfnCallback = sheet_callback;
- hdlg = (HWND)PropertySheetA(&psh); + hdlg = (HWND)pPropertySheetA(&psh); ok(hdlg != INVALID_HANDLE_VALUE, "got null handle\n");
/* OK button */ @@ -583,7 +595,7 @@ static void test_custom_default_button(void) add_button_has_been_pressed = FALSE;
/* Create the modeless property sheet. */ - hdlg = (HWND)PropertySheetA(&psh); + hdlg = (HWND)pPropertySheetA(&psh); ok(hdlg != INVALID_HANDLE_VALUE, "Cannot create the property sheet\n");
/* Set the Add button as the default button. */ @@ -794,7 +806,7 @@ static void test_messages(void) psp.pfnDlgProc = page_dlg_proc_messages; psp.lParam = 0;
- hpsp[0] = CreatePropertySheetPageA(&psp); + hpsp[0] = pCreatePropertySheetPageA(&psp);
memset(&psh, 0, sizeof(psh)); psh.dwSize = PROPSHEETHEADERA_V1_SIZE; @@ -806,7 +818,7 @@ static void test_messages(void) U3(psh).phpage = hpsp; psh.pfnCallback = sheet_callback_messages;
- hdlg = (HWND)PropertySheetA(&psh); + hdlg = (HWND)pPropertySheetA(&psh); ok(hdlg != INVALID_HANDLE_VALUE, "got invalid handle %p\n", hdlg);
ShowWindow(hdlg,SW_NORMAL); @@ -835,15 +847,15 @@ static void test_PSM_ADDPAGE(void) psp.lParam = 0;
/* multiple pages with the same data */ - hpsp[0] = CreatePropertySheetPageA(&psp); - hpsp[1] = CreatePropertySheetPageA(&psp); - hpsp[2] = CreatePropertySheetPageA(&psp); + hpsp[0] = pCreatePropertySheetPageA(&psp); + hpsp[1] = pCreatePropertySheetPageA(&psp); + hpsp[2] = pCreatePropertySheetPageA(&psp);
U(psp).pszTemplate = (LPCSTR)MAKEINTRESOURCE(IDD_PROP_PAGE_ERROR); - hpsp[3] = CreatePropertySheetPageA(&psp); + hpsp[3] = pCreatePropertySheetPageA(&psp);
psp.dwFlags = PSP_PREMATURE; - hpsp[4] = CreatePropertySheetPageA(&psp); + hpsp[4] = pCreatePropertySheetPageA(&psp);
memset(&psh, 0, sizeof(psh)); psh.dwSize = PROPSHEETHEADERA_V1_SIZE; @@ -853,7 +865,7 @@ static void test_PSM_ADDPAGE(void) psh.hwndParent = GetDesktopWindow(); U3(psh).phpage = hpsp;
- hdlg = (HWND)PropertySheetA(&psh); + hdlg = (HWND)pPropertySheetA(&psh); ok(hdlg != INVALID_HANDLE_VALUE, "got invalid handle %p\n", hdlg);
/* add pages one by one */ @@ -902,7 +914,7 @@ if (0) r = SendMessageA(tab, TCM_GETITEMCOUNT, 0, 0); ok(r == 3, "got %d\n", r);
- DestroyPropertySheetPage(hpsp[4]); + pDestroyPropertySheetPage(hpsp[4]); DestroyWindow(hdlg); }
@@ -925,15 +937,15 @@ static void test_PSM_INSERTPAGE(void) psp.lParam = 0;
/* multiple pages with the same data */ - hpsp[0] = CreatePropertySheetPageA(&psp); - hpsp[1] = CreatePropertySheetPageA(&psp); - hpsp[2] = CreatePropertySheetPageA(&psp); + hpsp[0] = pCreatePropertySheetPageA(&psp); + hpsp[1] = pCreatePropertySheetPageA(&psp); + hpsp[2] = pCreatePropertySheetPageA(&psp);
U(psp).pszTemplate = (LPCSTR)MAKEINTRESOURCE(IDD_PROP_PAGE_ERROR); - hpsp[3] = CreatePropertySheetPageA(&psp); + hpsp[3] = pCreatePropertySheetPageA(&psp);
psp.dwFlags = PSP_PREMATURE; - hpsp[4] = CreatePropertySheetPageA(&psp); + hpsp[4] = pCreatePropertySheetPageA(&psp);
memset(&psh, 0, sizeof(psh)); psh.dwSize = PROPSHEETHEADERA_V1_SIZE; @@ -943,7 +955,7 @@ static void test_PSM_INSERTPAGE(void) psh.hwndParent = GetDesktopWindow(); U3(psh).phpage = hpsp;
- hdlg = (HWND)PropertySheetA(&psh); + hdlg = (HWND)pPropertySheetA(&psh); ok(hdlg != INVALID_HANDLE_VALUE, "got invalid handle %p\n", hdlg);
/* add pages one by one */ @@ -996,7 +1008,7 @@ if (0) r = SendMessageA(tab, TCM_GETITEMCOUNT, 0, 0); ok(r == 3, "got %d\n", r);
- DestroyPropertySheetPage(hpsp[4]); + pDestroyPropertySheetPage(hpsp[4]); DestroyWindow(hdlg); }
@@ -1086,7 +1098,7 @@ static void test_CreatePropertySheetPage(void) for (page.u.pageA.dwSize = PROPSHEETPAGEA_V1_SIZE - 1; page.u.pageA.dwSize <= PROPSHEETPAGEA_V4_SIZE + 1; page.u.pageA.dwSize++) { page.addref_called = 0; - hpsp = CreatePropertySheetPageA(&page.u.pageA); + hpsp = pCreatePropertySheetPageA(&page.u.pageA);
if (page.u.pageA.dwSize < PROPSHEETPAGEA_V1_SIZE) ok(hpsp == NULL, "Expected failure, size %u\n", page.u.pageA.dwSize); @@ -1099,7 +1111,7 @@ static void test_CreatePropertySheetPage(void) if (hpsp) { page.release_called = 0; - ret = DestroyPropertySheetPage(hpsp); + ret = pDestroyPropertySheetPage(hpsp); ok(ret, "Failed to destroy a page\n"); ok(page.release_called == 1, "Expected RELEASE callback message\n"); } @@ -1115,7 +1127,7 @@ static void test_CreatePropertySheetPage(void) for (page.u.pageW.dwSize = PROPSHEETPAGEW_V1_SIZE - 1; page.u.pageW.dwSize <= PROPSHEETPAGEW_V4_SIZE + 1; page.u.pageW.dwSize++) { page.addref_called = 0; - hpsp = CreatePropertySheetPageW(&page.u.pageW); + hpsp = pCreatePropertySheetPageW(&page.u.pageW);
if (page.u.pageW.dwSize < PROPSHEETPAGEW_V1_SIZE) ok(hpsp == NULL, "Expected failure, size %u\n", page.u.pageW.dwSize); @@ -1128,13 +1140,25 @@ static void test_CreatePropertySheetPage(void) if (hpsp) { page.release_called = 0; - ret = DestroyPropertySheetPage(hpsp); + ret = pDestroyPropertySheetPage(hpsp); ok(ret, "Failed to destroy a page\n"); ok(page.release_called == 1, "Expected RELEASE callback message\n"); } } }
+static void init_functions(void) +{ + HMODULE hComCtl32 = LoadLibraryA("comctl32.dll"); + +#define X(f) p##f = (void*)GetProcAddress(hComCtl32, #f); + X(CreatePropertySheetPageA); + X(CreatePropertySheetPageW); + X(DestroyPropertySheetPage); + X(PropertySheetA); +#undef X +} + START_TEST(propsheet) { detect_locale(); @@ -1146,6 +1170,8 @@ START_TEST(propsheet) SetProcessDefaultLayout(LAYOUT_RTL); }
+ init_functions(); + test_title(); test_nopage(); test_disableowner(); diff --git a/modules/rostests/winetests/comctl32/rebar.c b/modules/rostests/winetests/comctl32/rebar.c index 5aa3a1ef5f..b3e78009f5 100644 --- a/modules/rostests/winetests/comctl32/rebar.c +++ b/modules/rostests/winetests/comctl32/rebar.c @@ -17,7 +17,24 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include "precomp.h" +/* make sure the structures work with a comctl32 v5.x */ +#ifndef __REACTOS__ +#define _WIN32_WINNT 0x500 +#define _WIN32_IE 0x500 +#endif + +#include <assert.h> +#include <stdarg.h> + +#include <windows.h> +#include <commctrl.h> +#include <uxtheme.h> + +#include "wine/heap.h" +#include "wine/test.h" + +static BOOL (WINAPI *pImageList_Destroy)(HIMAGELIST); +static HIMAGELIST (WINAPI *pImageList_LoadImageA)(HINSTANCE, LPCSTR, int, int, COLORREF, UINT, UINT);
static RECT height_change_notify_rect; static HWND hMainWnd; @@ -206,9 +223,9 @@ static rbsize_result_t rbsize_init(int cleft, int ctop, int cright, int cbottom, SetRect(&ret.rcClient, cleft, ctop, cright, cbottom); ret.cyBarHeight = cyBarHeight; ret.nRows = 0; - ret.cyRowHeights = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, nRows*sizeof(int)); + ret.cyRowHeights = heap_alloc_zero(nRows * sizeof(int)); ret.nBands = 0; - ret.bands = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, nBands*sizeof(rbband_result_t)); + ret.bands = heap_alloc_zero(nBands * sizeof(*ret.bands));
return ret; } @@ -232,7 +249,7 @@ static rbsize_result_t *rbsize_results;
static void rbsize_results_init(void) { - rbsize_results = HeapAlloc(GetProcessHeap(), 0, rbsize_results_num*sizeof(rbsize_result_t)); + rbsize_results = heap_alloc(rbsize_results_num * sizeof(*rbsize_results));
rbsize_results[0] = rbsize_init(0, 0, 672, 0, 0, 0, 0);
@@ -419,10 +436,10 @@ static void rbsize_results_free(void) int i;
for (i = 0; i < rbsize_results_num; i++) { - HeapFree(GetProcessHeap(), 0, rbsize_results[i].cyRowHeights); - HeapFree(GetProcessHeap(), 0, rbsize_results[i].bands); + heap_free(rbsize_results[i].cyRowHeights); + heap_free(rbsize_results[i].bands); } - HeapFree(GetProcessHeap(), 0, rbsize_results); + heap_free(rbsize_results); rbsize_results = NULL; }
@@ -566,7 +583,7 @@ static void test_layout(void) check_sizes();
/* an image will increase the band height */ - himl = ImageList_LoadImageA(GetModuleHandleA("comctl32"), MAKEINTRESOURCEA(121), 24, 2, + himl = pImageList_LoadImageA(GetModuleHandleA("comctl32"), MAKEINTRESOURCEA(121), 24, 2, CLR_NONE, IMAGE_BITMAP, LR_DEFAULTCOLOR); ri.cbSize = sizeof(ri); ri.fMask = RBIM_IMAGELIST; @@ -647,7 +664,7 @@ static void test_layout(void)
rbsize_results_free(); DestroyWindow(hRebar); - ImageList_Destroy(himl); + pImageList_Destroy(himl); }
#if 0 /* use this to generate more tests */ @@ -1114,26 +1131,22 @@ static void test_notification(void) DestroyWindow(rebar); }
+static void init_functions(void) +{ + HMODULE hComCtl32 = LoadLibraryA("comctl32.dll"); + +#define X(f) p##f = (void*)GetProcAddress(hComCtl32, #f); + X(ImageList_Destroy); + X(ImageList_LoadImageA); +#undef X +} + START_TEST(rebar) { - HMODULE hComctl32; - BOOL (WINAPI *pInitCommonControlsEx)(const INITCOMMONCONTROLSEX*); - INITCOMMONCONTROLSEX iccex; MSG msg;
init_system_font_height(); - - /* LoadLibrary is needed. This file has no reference to functions in comctl32 */ - hComctl32 = LoadLibraryA("comctl32.dll"); - pInitCommonControlsEx = (void*)GetProcAddress(hComctl32, "InitCommonControlsEx"); - if (!pInitCommonControlsEx) - { - win_skip("InitCommonControlsEx() is missing. Skipping the tests\n"); - return; - } - iccex.dwSize = sizeof(iccex); - iccex.dwICC = ICC_COOL_CLASSES; - pInitCommonControlsEx(&iccex); + init_functions();
hMainWnd = create_parent_window();
@@ -1158,6 +1171,4 @@ out: DispatchMessageA(&msg); } DestroyWindow(hMainWnd); - - FreeLibrary(hComctl32); } diff --git a/modules/rostests/winetests/comctl32/static.c b/modules/rostests/winetests/comctl32/static.c index 3bc25dc08d..1cc7e8a01d 100644 --- a/modules/rostests/winetests/comctl32/static.c +++ b/modules/rostests/winetests/comctl32/static.c @@ -17,7 +17,19 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include "precomp.h" +#include <stdarg.h> +#include <stdio.h> + +#ifndef __REACTOS__ +#define STRICT +#endif +#define WIN32_LEAN_AND_MEAN +#include <windows.h> +#include "commctrl.h" + +#include "wine/test.h" + +#include "v6util.h"
#define TODO_COUNT 1
@@ -44,7 +56,7 @@ static void flush_events(void)
static HWND create_static(DWORD style) { - return CreateWindowA("static", "Test", WS_VISIBLE|WS_CHILD|style, 5, 5, 100, 100, hMainWnd, (HMENU)CTRL_ID, NULL, 0); + return CreateWindowA(WC_STATICA, "Test", WS_VISIBLE|WS_CHILD|style, 5, 5, 100, 100, hMainWnd, (HMENU)CTRL_ID, NULL, 0); }
static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) diff --git a/modules/rostests/winetests/comctl32/status.c b/modules/rostests/winetests/comctl32/status.c index 94345e1a3a..2308974761 100644 --- a/modules/rostests/winetests/comctl32/status.c +++ b/modules/rostests/winetests/comctl32/status.c @@ -18,7 +18,10 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include "precomp.h" +#include <windows.h> +#include <commctrl.h> + +#include "wine/test.h"
#define SUBCLASS_NAME "MyStatusBar"
@@ -40,6 +43,8 @@ static INT g_dpisize; static int g_wmdrawitm_ctr; static WNDPROC g_wndproc_saved;
+static BOOL (WINAPI *pInitCommonControlsEx)(const INITCOMMONCONTROLSEX*); + static HWND create_status_control(DWORD style, DWORD exstyle) { HWND hWndStatus; @@ -581,17 +586,32 @@ static void test_notify(void) ok(g_got_contextmenu, "WM_RBUTTONUP did not activate the context menu!\n"); }
+static void init_functions(void) +{ + HMODULE hComCtl32 = LoadLibraryA("comctl32.dll"); + +#define X(f) p##f = (void*)GetProcAddress(hComCtl32, #f); + X(InitCommonControlsEx); +#undef X +} + START_TEST(status) { + INITCOMMONCONTROLSEX iccex; + + init_functions(); + hinst = GetModuleHandleA(NULL);
- g_hMainWnd = CreateWindowExA(0, "static", "", WS_OVERLAPPEDWINDOW, + iccex.dwSize = sizeof(iccex); + iccex.dwICC = ICC_BAR_CLASSES; + pInitCommonControlsEx(&iccex); + + g_hMainWnd = CreateWindowExA(0, WC_STATICA, "", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 672+2*GetSystemMetrics(SM_CXSIZEFRAME), 226+GetSystemMetrics(SM_CYCAPTION)+2*GetSystemMetrics(SM_CYSIZEFRAME), NULL, NULL, GetModuleHandleA(NULL), 0);
- InitCommonControls(); - register_subclass();
test_status_control(); diff --git a/modules/rostests/winetests/comctl32/subclass.c b/modules/rostests/winetests/comctl32/subclass.c index 7333c65916..75a134352e 100644 --- a/modules/rostests/winetests/comctl32/subclass.c +++ b/modules/rostests/winetests/comctl32/subclass.c @@ -19,13 +19,18 @@
#define _WIN32_WINNT 0x0501 /* For SetWindowSubclass/etc */
-#include "wine/test.h" - #include <assert.h> +#include <stdarg.h>
+#include "windef.h" +#include "winbase.h" +#include "wingdi.h" #include "winuser.h" #include "commctrl.h"
+#include "wine/heap.h" +#include "wine/test.h" + static BOOL (WINAPI *pSetWindowSubclass)(HWND, SUBCLASSPROC, UINT_PTR, DWORD_PTR); static BOOL (WINAPI *pRemoveWindowSubclass)(HWND, SUBCLASSPROC, UINT_PTR); static LRESULT (WINAPI *pDefSubclassProc)(HWND, UINT, WPARAM, LPARAM); @@ -115,12 +120,12 @@ static void add_message(const struct message *msg) if (!sequence) { sequence_size = 10; - sequence = HeapAlloc( GetProcessHeap(), 0, sequence_size * sizeof (struct message) ); + sequence = heap_alloc( sequence_size * sizeof (struct message) ); } if (sequence_cnt == sequence_size) { sequence_size *= 2; - sequence = HeapReAlloc( GetProcessHeap(), 0, sequence, sequence_size * sizeof (struct message) ); + sequence = heap_realloc( sequence, sequence_size * sizeof (struct message) ); } assert(sequence);
@@ -132,8 +137,8 @@ static void add_message(const struct message *msg)
static void flush_sequence(void) { - HeapFree(GetProcessHeap(), 0, sequence); - sequence = 0; + heap_free(sequence); + sequence = NULL; sequence_cnt = sequence_size = 0; }
@@ -282,7 +287,7 @@ static BOOL init_function_pointers(void) HMODULE hmod; void *ptr;
- hmod = GetModuleHandleA("comctl32.dll"); + hmod = LoadLibraryA("comctl32.dll"); ok(hmod != NULL, "got %p\n", hmod);
/* Functions have to be loaded by ordinal. Only XP and W2K3 export diff --git a/modules/rostests/winetests/comctl32/syslink.c b/modules/rostests/winetests/comctl32/syslink.c index a585701c7e..a6b90b6a25 100644 --- a/modules/rostests/winetests/comctl32/syslink.c +++ b/modules/rostests/winetests/comctl32/syslink.c @@ -17,7 +17,12 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include "precomp.h" +#include <windows.h> +#include <commctrl.h> + +#include "wine/test.h" +#include "v6util.h" +#include "msg.h"
#define expect(expected, got) ok(got == expected, "Expected %d, got %d\n", expected, got) #define NUM_MSG_SEQUENCE 2 diff --git a/modules/rostests/winetests/comctl32/tab.c b/modules/rostests/winetests/comctl32/tab.c index 99f4bc3e89..d3e0e0c6cf 100644 --- a/modules/rostests/winetests/comctl32/tab.c +++ b/modules/rostests/winetests/comctl32/tab.c @@ -18,7 +18,12 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include "precomp.h" +#include <windows.h> +#include <commctrl.h> +#include <stdio.h> + +#include "wine/test.h" +#include "msg.h"
#define DEFAULT_MIN_TAB_WIDTH 54 #define TAB_PADDING_X 6 @@ -35,6 +40,11 @@
#define TabWidthPadded(padd_x, num) (DEFAULT_MIN_TAB_WIDTH - (TAB_PADDING_X - (padd_x)) * num)
+static HIMAGELIST (WINAPI *pImageList_Create)(INT,INT,UINT,INT,INT); +static BOOL (WINAPI *pImageList_Destroy)(HIMAGELIST); +static INT (WINAPI *pImageList_GetImageCount)(HIMAGELIST); +static INT (WINAPI *pImageList_ReplaceIcon)(HIMAGELIST,INT,HICON); + static void CheckSize(HWND hwnd, INT width, INT height, const char *msg, int line) { RECT r; @@ -69,84 +79,19 @@ static void TabCheckSetSize(HWND hwnd, INT set_width, INT set_height, INT exp_wi static HFONT hFont; static DRAWITEMSTRUCT g_drawitem; static HWND parent_wnd; +static LRESULT tcn_selchanging_result;
static struct msg_sequence *sequences[NUM_MSG_SEQUENCES];
-static const struct message add_tab_to_parent[] = { - { TCM_INSERTITEMA, sent }, - { TCM_INSERTITEMA, sent|optional }, - { WM_NOTIFYFORMAT, sent|defwinproc }, - { WM_QUERYUISTATE, sent|wparam|lparam|defwinproc|optional, 0, 0 }, - { WM_PARENTNOTIFY, sent|defwinproc }, - { TCM_INSERTITEMA, sent }, - { TCM_INSERTITEMA, sent }, - { TCM_INSERTITEMA, sent }, - { TCM_INSERTITEMA, sent|optional }, - { 0 } -}; - -static const struct message add_tab_to_parent_interactive[] = { - { TCM_INSERTITEMA, sent }, - { TCM_INSERTITEMA, sent }, - { WM_NOTIFYFORMAT, sent|defwinproc }, - { WM_QUERYUISTATE, sent|wparam|lparam|defwinproc, 0, 0 }, - { WM_PARENTNOTIFY, sent|defwinproc }, - { TCM_INSERTITEMA, sent }, - { TCM_INSERTITEMA, sent }, - { TCM_INSERTITEMA, sent }, - { WM_SHOWWINDOW, sent}, - { WM_WINDOWPOSCHANGING, sent}, - { WM_WINDOWPOSCHANGING, sent}, - { WM_NCACTIVATE, sent}, - { WM_ACTIVATE, sent}, - { WM_IME_SETCONTEXT, sent|defwinproc|optional}, - { WM_IME_NOTIFY, sent|defwinproc|optional}, - { WM_SETFOCUS, sent|defwinproc}, - { WM_WINDOWPOSCHANGED, sent}, - { WM_SIZE, sent}, - { WM_MOVE, sent}, - { 0 } -}; - -static const struct message add_tab_control_parent_seq[] = { - { WM_NOTIFYFORMAT, sent }, - { WM_QUERYUISTATE, sent|wparam|lparam|optional, 0, 0 }, - { 0 } -}; - -static const struct message add_tab_control_parent_seq_interactive[] = { - { WM_NOTIFYFORMAT, sent }, - { WM_QUERYUISTATE, sent|wparam|lparam, 0, 0 }, - { WM_WINDOWPOSCHANGING, sent|optional}, - { WM_NCACTIVATE, sent}, - { WM_ACTIVATE, sent}, - { WM_WINDOWPOSCHANGING, sent|optional}, - { WM_KILLFOCUS, sent}, - { WM_IME_SETCONTEXT, sent|optional}, - { WM_IME_NOTIFY, sent|optional}, - { 0 } -}; - static const struct message empty_sequence[] = { { 0 } };
-static const struct message get_item_count_seq[] = { - { TCM_GETITEMCOUNT, sent|wparam|lparam, 0, 0 }, - { 0 } -}; - static const struct message get_row_count_seq[] = { { TCM_GETROWCOUNT, sent|wparam|lparam, 0, 0 }, { 0 } };
-static const struct message get_item_rect_seq[] = { - { TCM_GETITEMRECT, sent }, - { TCM_GETITEMRECT, sent }, - { 0 } -}; - static const struct message getset_cur_focus_seq[] = { { TCM_SETCURFOCUS, sent|lparam, 0 }, { TCM_GETCURFOCUS, sent|wparam|lparam, 0, 0 }, @@ -254,6 +199,27 @@ static const struct message rbuttonup_seq[] = { { 0 } };
+static const struct message full_selchange_parent_seq[] = { + { WM_NOTIFY, sent|id, 0, 0, TCN_SELCHANGING }, + { WM_NOTIFY, sent|id, 0, 0, TCN_SELCHANGE }, + { 0 } +}; + +static const struct message selchanging_parent_seq[] = { + { WM_NOTIFY, sent|id, 0, 0, TCN_SELCHANGING }, + { 0 } +}; + +static const struct message selchange_parent_seq[] = { + { WM_NOTIFY, sent|id, 0, 0, TCN_SELCHANGE }, + { 0 } +}; + +static const struct message setfocus_parent_seq[] = { + { WM_NOTIFY, sent|id, 0, 0, TCN_FOCUSCHANGE }, + { 0 } +}; + static HWND create_tabcontrol (DWORD style, DWORD mask) { @@ -292,7 +258,7 @@ create_tabcontrol (DWORD style, DWORD mask) return handle; }
-static LRESULT WINAPI parentWindowProcess(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +static LRESULT WINAPI parent_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static LONG defwndproc_counter = 0; struct message msg = { 0 }; @@ -312,6 +278,8 @@ static LRESULT WINAPI parentWindowProcess(HWND hwnd, UINT message, WPARAM wParam if (defwndproc_counter) msg.flags |= defwinproc; msg.wParam = wParam; msg.lParam = lParam; + if (message == WM_NOTIFY && lParam) + msg.id = ((NMHDR*)lParam)->code; add_message(sequences, PARENT_SEQ_INDEX, &msg); }
@@ -319,6 +287,13 @@ static LRESULT WINAPI parentWindowProcess(HWND hwnd, UINT message, WPARAM wParam if (message == WM_DRAWITEM) g_drawitem = *(DRAWITEMSTRUCT*)lParam;
+ if (message == WM_NOTIFY) + { + NMHDR *nmhdr = (NMHDR *)lParam; + if (nmhdr && nmhdr->code == TCN_SELCHANGING) + return tcn_selchanging_result; + } + defwndproc_counter++; ret = DefWindowProcA(hwnd, message, wParam, lParam); defwndproc_counter--; @@ -331,7 +306,7 @@ static BOOL registerParentWindowClass(void) WNDCLASSA cls;
cls.style = 0; - cls.lpfnWndProc = parentWindowProcess; + cls.lpfnWndProc = parent_wnd_proc; cls.cbClsExtra = 0; cls.cbWndExtra = 0; cls.hInstance = GetModuleHandleA(NULL); @@ -353,7 +328,7 @@ static HWND createParentWindow(void) GetDesktopWindow(), NULL, GetModuleHandleA(NULL), NULL); }
-static LRESULT WINAPI tabSubclassProcess(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +static LRESULT WINAPI tab_subclass_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { WNDPROC oldproc = (WNDPROC)GetWindowLongPtrA(hwnd, GWLP_USERDATA); static LONG defwndproc_counter = 0; @@ -399,7 +374,7 @@ static HWND createFilledTabControl(HWND parent_wnd, DWORD style, DWORD mask, INT rect.bottom, parent_wnd, NULL, NULL, 0); ok(tabHandle != NULL, "failed to create tab wnd\n");
- oldproc = (WNDPROC)SetWindowLongPtrA(tabHandle, GWLP_WNDPROC, (LONG_PTR)tabSubclassProcess); + oldproc = (WNDPROC)SetWindowLongPtrA(tabHandle, GWLP_WNDPROC, (LONG_PTR)tab_subclass_proc); SetWindowLongPtrA(tabHandle, GWLP_USERDATA, (LONG_PTR)oldproc);
tcNewTab.mask = mask; @@ -465,7 +440,7 @@ static void test_tab(INT nMinTabWidth) { HWND hwTab; RECT rTab; - HIMAGELIST himl = ImageList_Create(21, 21, ILC_COLOR, 3, 4); + HIMAGELIST himl = pImageList_Create(21, 21, ILC_COLOR, 3, 4); SIZE size; HDC hdc; HFONT hOldFont; @@ -603,7 +578,7 @@ static void test_tab(INT nMinTabWidth)
DestroyWindow (hwTab);
- ImageList_Destroy(himl); + pImageList_Destroy(himl); }
static void test_width(void) @@ -623,7 +598,7 @@ static void test_width(void) static void test_curfocus(void) { const INT nTabs = 5; - INT focusIndex; + INT ret; HWND hTab;
hTab = createFilledTabControl(parent_wnd, TCS_FIXEDWIDTH, TCIF_TEXT|TCIF_IMAGE, nTabs); @@ -632,24 +607,63 @@ static void test_curfocus(void) flush_sequences(sequences, NUM_MSG_SEQUENCES);
/* Testing CurFocus with largest appropriate value */ - SendMessageA(hTab, TCM_SETCURFOCUS, nTabs - 1, 0); - focusIndex = SendMessageA(hTab, TCM_GETCURFOCUS, 0, 0); - expect(nTabs-1, focusIndex); + ret = SendMessageA(hTab, TCM_SETCURFOCUS, nTabs - 1, 0); + ok(ret == 0, "Unexpected ret value %d.\n", ret); + ret = SendMessageA(hTab, TCM_GETCURFOCUS, 0, 0); + ok(ret == nTabs - 1, "Unexpected focus index %d.\n", ret);
/* Testing CurFocus with negative value */ - SendMessageA(hTab, TCM_SETCURFOCUS, -10, 0); - focusIndex = SendMessageA(hTab, TCM_GETCURFOCUS, 0, 0); - expect(-1, focusIndex); + ret = SendMessageA(hTab, TCM_SETCURFOCUS, -10, 0); + ok(ret == 0, "Unexpected ret value %d.\n", ret); + ret = SendMessageA(hTab, TCM_GETCURFOCUS, 0, 0); + ok(ret == -1, "Unexpected focus index %d.\n", ret);
/* Testing CurFocus with value larger than number of tabs */ - focusIndex = SendMessageA(hTab, TCM_SETCURSEL, 1, 0); - expect(-1, focusIndex); + ret = SendMessageA(hTab, TCM_SETCURSEL, 1, 0); + ok(ret == -1, "Unexpected focus index %d.\n", ret);
- SendMessageA(hTab, TCM_SETCURFOCUS, nTabs + 1, 0); - focusIndex = SendMessageA(hTab, TCM_GETCURFOCUS, 0, 0); - expect(1, focusIndex); + ret = SendMessageA(hTab, TCM_SETCURFOCUS, nTabs + 1, 0); + ok(ret == 0, "Unexpected ret value %d.\n", ret); + ret = SendMessageA(hTab, TCM_GETCURFOCUS, 0, 0); + ok(ret == 1, "Unexpected focus index %d.\n", ret); + + ok_sequence(sequences, TAB_SEQ_INDEX, getset_cur_focus_seq, "Set focused tab sequence", FALSE); + ok_sequence(sequences, PARENT_SEQ_INDEX, empty_sequence, "Set focused tab parent sequence", TRUE); + + DestroyWindow(hTab); + + /* TCS_BUTTONS */ + hTab = createFilledTabControl(parent_wnd, TCS_BUTTONS, TCIF_TEXT|TCIF_IMAGE, nTabs); + ok(hTab != NULL, "Failed to create tab control\n"); + + flush_sequences(sequences, NUM_MSG_SEQUENCES); + + /* Testing CurFocus with largest appropriate value */ + ret = SendMessageA(hTab, TCM_SETCURFOCUS, nTabs - 1, 0); + ok(ret == 0, "Unexpected ret value %d.\n", ret); + ret = SendMessageA(hTab, TCM_GETCURFOCUS, 0, 0); + ok(ret == nTabs - 1, "Unexpected focus index %d.\n", ret); + + /* Testing CurFocus with negative value */ + ret = SendMessageA(hTab, TCM_SETCURFOCUS, -10, 0); + ok(ret == 0, "Unexpected ret value %d.\n", ret); + ret = SendMessageA(hTab, TCM_GETCURFOCUS, 0, 0); +todo_wine + ok(ret == nTabs - 1, "Unexpected focus index %d.\n", ret); + + /* Testing CurFocus with value larger than number of tabs */ + ret = SendMessageA(hTab, TCM_SETCURSEL, 1, 0); +todo_wine + ok(ret == 0, "Unexpected focus index %d.\n", ret); + + ret = SendMessageA(hTab, TCM_SETCURFOCUS, nTabs + 1, 0); + ok(ret == 0, "Unexpected ret value %d.\n", ret); + ret = SendMessageA(hTab, TCM_GETCURFOCUS, 0, 0); +todo_wine + ok(ret == nTabs - 1, "Unexpected focus index %d.\n", ret);
- ok_sequence(sequences, TAB_SEQ_INDEX, getset_cur_focus_seq, "Getset curFoc test sequence", FALSE); + ok_sequence(sequences, TAB_SEQ_INDEX, getset_cur_focus_seq, "TCS_BUTTONS: set focused tab sequence", FALSE); + ok_sequence(sequences, PARENT_SEQ_INDEX, setfocus_parent_seq, "TCS_BUTTONS: set focused tab parent sequence", TRUE);
DestroyWindow(hTab); } @@ -938,8 +952,9 @@ static void test_getset_item(void) static void test_getset_tooltips(void) { char toolTipText[32] = "ToolTip Text Test"; + HWND hTab, toolTip, hwnd; const INT nTabs = 5; - HWND hTab, toolTip; + int ret;
hTab = createFilledTabControl(parent_wnd, TCS_FIXEDWIDTH, TCIF_TEXT|TCIF_IMAGE, nTabs); ok(hTab != NULL, "Failed to create tab control\n"); @@ -947,78 +962,22 @@ static void test_getset_tooltips(void) flush_sequences(sequences, NUM_MSG_SEQUENCES);
toolTip = create_tooltip(hTab, toolTipText); - SendMessageA(hTab, TCM_SETTOOLTIPS, (LPARAM)toolTip, 0); - ok(toolTip == (HWND)SendMessageA(hTab, TCM_GETTOOLTIPS, 0,0), "ToolTip was set incorrectly.\n"); + ret = SendMessageA(hTab, TCM_SETTOOLTIPS, (WPARAM)toolTip, 0); + ok(ret == 0, "Unexpected ret value %d.\n", ret); + hwnd = (HWND)SendMessageA(hTab, TCM_GETTOOLTIPS, 0, 0); + ok(toolTip == hwnd, "Unexpected tooltip window.\n");
- SendMessageA(hTab, TCM_SETTOOLTIPS, 0, 0); - ok(!SendMessageA(hTab, TCM_GETTOOLTIPS, 0,0), "ToolTip was set incorrectly.\n"); + ret = SendMessageA(hTab, TCM_SETTOOLTIPS, 0, 0); + ok(ret == 0, "Unexpected ret value %d.\n", ret); + hwnd = (HWND)SendMessageA(hTab, TCM_GETTOOLTIPS, 0, 0); + ok(hwnd == NULL, "Unexpected tooltip window.\n"); + ok(IsWindow(toolTip), "Expected tooltip window to be alive.\n");
ok_sequence(sequences, TAB_SEQ_INDEX, getset_tooltip_seq, "Getset tooltip test sequence", TRUE); ok_sequence(sequences, PARENT_SEQ_INDEX, getset_tooltip_parent_seq, "Getset tooltip test parent sequence", TRUE);
DestroyWindow(hTab); -} - -static void test_misc(void) -{ - const INT nTabs = 5; - HWND hTab; - RECT rTab; - INT nTabsRetrieved; - INT rowCount; - INT dpi; - HDC hdc; - - ok(parent_wnd != NULL, "no parent window!\n"); - flush_sequences(sequences, NUM_MSG_SEQUENCES); - - hTab = createFilledTabControl(parent_wnd, TCS_FIXEDWIDTH, TCIF_TEXT|TCIF_IMAGE, nTabs); - ok(hTab != NULL, "Failed to create tab control\n"); - - if(!winetest_interactive) - ok_sequence(sequences, TAB_SEQ_INDEX, add_tab_to_parent, - "Tab sequence, after adding tab control to parent", TRUE); - else - ok_sequence(sequences, TAB_SEQ_INDEX, add_tab_to_parent_interactive, - "Tab sequence, after adding tab control to parent", TRUE); - - if(!winetest_interactive) - ok_sequence(sequences, PARENT_SEQ_INDEX, add_tab_control_parent_seq, - "Parent after sequence, adding tab control to parent", TRUE); - else - ok_sequence(sequences, PARENT_SEQ_INDEX, add_tab_control_parent_seq_interactive, - "Parent after sequence, adding tab control to parent", TRUE); - - flush_sequences(sequences, NUM_MSG_SEQUENCES); - ok(SendMessageA(hTab, TCM_SETMINTABWIDTH, 0, -1) > 0, "TCM_SETMINTABWIDTH returned < 0\n"); - ok_sequence(sequences, PARENT_SEQ_INDEX, empty_sequence, "Set minTabWidth test parent sequence", FALSE); - - /* Testing GetItemCount */ - flush_sequences(sequences, NUM_MSG_SEQUENCES); - nTabsRetrieved = SendMessageA(hTab, TCM_GETITEMCOUNT, 0, 0); - expect(nTabs, nTabsRetrieved); - ok_sequence(sequences, TAB_SEQ_INDEX, get_item_count_seq, "Get itemCount test sequence", FALSE); - ok_sequence(sequences, PARENT_SEQ_INDEX, empty_sequence, "Getset itemCount test parent sequence", FALSE); - - /* Testing GetRowCount */ - flush_sequences(sequences, NUM_MSG_SEQUENCES); - rowCount = SendMessageA(hTab, TCM_GETROWCOUNT, 0, 0); - expect(1, rowCount); - ok_sequence(sequences, TAB_SEQ_INDEX, get_row_count_seq, "Get rowCount test sequence", FALSE); - ok_sequence(sequences, PARENT_SEQ_INDEX, empty_sequence, "Get rowCount test parent sequence", FALSE); - - /* Testing GetItemRect */ - flush_sequences(sequences, NUM_MSG_SEQUENCES); - ok(SendMessageA(hTab, TCM_GETITEMRECT, 0, (LPARAM)&rTab), "GetItemRect failed.\n"); - - hdc = GetDC(hTab); - dpi = GetDeviceCaps(hdc, LOGPIXELSX); - ReleaseDC(hTab, hdc); - CHECKSIZE(hTab, dpi, -1 , "Default Width"); - ok_sequence(sequences, TAB_SEQ_INDEX, get_item_rect_seq, "Get itemRect test sequence", FALSE); - ok_sequence(sequences, PARENT_SEQ_INDEX, empty_sequence, "Get itemRect test parent sequence", FALSE); - - DestroyWindow(hTab); + DestroyWindow(toolTip); }
static void test_adjustrect(void) @@ -1160,12 +1119,12 @@ static void test_removeimage(void) INT i; TCITEMA item; HICON hicon; - HIMAGELIST himl = ImageList_Create(16, 16, ILC_COLOR, 3, 4); + HIMAGELIST himl = pImageList_Create(16, 16, ILC_COLOR, 3, 4);
hicon = CreateIcon(NULL, 16, 16, 1, 1, bits, bits); - ImageList_AddIcon(himl, hicon); - ImageList_AddIcon(himl, hicon); - ImageList_AddIcon(himl, hicon); + pImageList_ReplaceIcon(himl, -1, hicon); + pImageList_ReplaceIcon(himl, -1, hicon); + pImageList_ReplaceIcon(himl, -1, hicon);
hwTab = create_tabcontrol(TCS_FIXEDWIDTH, TCIF_TEXT|TCIF_IMAGE); SendMessageA(hwTab, TCM_SETIMAGELIST, 0, (LPARAM)himl); @@ -1180,7 +1139,8 @@ static void test_removeimage(void)
/* remove image middle image */ SendMessageA(hwTab, TCM_REMOVEIMAGE, 1, 0); - expect(2, ImageList_GetImageCount(himl)); + i = pImageList_GetImageCount(himl); + ok(i == 2, "Unexpected image count %d.\n", i); item.iImage = -1; SendMessageA(hwTab, TCM_GETITEMA, 0, (LPARAM)&item); expect(0, item.iImage); @@ -1192,7 +1152,8 @@ static void test_removeimage(void) expect(1, item.iImage); /* remove first image */ SendMessageA(hwTab, TCM_REMOVEIMAGE, 0, 0); - expect(1, ImageList_GetImageCount(himl)); + i = pImageList_GetImageCount(himl); + ok(i == 1, "Unexpected image count %d.\n", i); item.iImage = 0; SendMessageA(hwTab, TCM_GETITEMA, 0, (LPARAM)&item); expect(-1, item.iImage); @@ -1204,7 +1165,8 @@ static void test_removeimage(void) expect(0, item.iImage); /* remove the last one */ SendMessageA(hwTab, TCM_REMOVEIMAGE, 0, 0); - expect(0, ImageList_GetImageCount(himl)); + i = pImageList_GetImageCount(himl); + ok(i == 0, "Unexpected image count %d.\n", i); for(i = 0; i < 3; i++) { item.iImage = 0; SendMessageA(hwTab, TCM_GETITEMA, i, (LPARAM)&item); @@ -1212,7 +1174,7 @@ static void test_removeimage(void) }
DestroyWindow(hwTab); - ImageList_Destroy(himl); + pImageList_Destroy(himl); DestroyIcon(hicon); }
@@ -1418,6 +1380,107 @@ static void test_create(void) } }
+static void init_functions(void) +{ + HMODULE hComCtl32 = LoadLibraryA("comctl32.dll"); + +#define X(f) p##f = (void*)GetProcAddress(hComCtl32, #f); + X(ImageList_Create); + X(ImageList_Destroy); + X(ImageList_GetImageCount); + X(ImageList_ReplaceIcon); +#undef X +} + +static void test_TCN_SELCHANGING(void) +{ + const INT nTabs = 5; + HWND hTab; + INT ret; + + hTab = createFilledTabControl(parent_wnd, WS_CHILD|TCS_FIXEDWIDTH, TCIF_TEXT|TCIF_IMAGE, nTabs); + ok(hTab != NULL, "Failed to create tab control\n"); + + /* Initially first tab is focused. */ + ret = SendMessageA(hTab, TCM_GETCURFOCUS, 0, 0); + ok(ret == 0, "Unexpected tab focus %d.\n", ret); + + flush_sequences(sequences, NUM_MSG_SEQUENCES); + + /* Setting focus to currently focused item should do nothing. */ + ret = SendMessageA(hTab, TCM_SETCURFOCUS, 0, 0); + ok(ret == 0, "Unexpected ret value %d.\n", ret); + + ok_sequence(sequences, PARENT_SEQ_INDEX, empty_sequence, "Set focus to focused tab sequence", FALSE); + + /* Allow selection change. */ + flush_sequences(sequences, NUM_MSG_SEQUENCES); + + tcn_selchanging_result = 0; + ret = SendMessageA(hTab, TCM_SETCURFOCUS, nTabs - 1, 0); + ok(ret == 0, "Unexpected ret value %d.\n", ret); + + ok_sequence(sequences, PARENT_SEQ_INDEX, full_selchange_parent_seq, "Focus change allowed sequence", FALSE); + + ret = SendMessageA(hTab, TCM_GETCURFOCUS, 0, 0); + ok(ret == nTabs - 1, "Unexpected focused tab %d.\n", ret); + ret = SendMessageA(hTab, TCM_GETCURSEL, 0, 0); + ok(ret == nTabs - 1, "Unexpected selected tab %d.\n", ret); + + /* Forbid selection change. */ + flush_sequences(sequences, NUM_MSG_SEQUENCES); + + tcn_selchanging_result = 1; + ret = SendMessageA(hTab, TCM_SETCURFOCUS, 0, 0); + ok(ret == 0, "Unexpected ret value %d.\n", ret); + + ok_sequence(sequences, PARENT_SEQ_INDEX, selchanging_parent_seq, "Focus change disallowed sequence", FALSE); + + ret = SendMessageA(hTab, TCM_GETCURFOCUS, 0, 0); +todo_wine + ok(ret == nTabs - 1, "Unexpected focused tab %d.\n", ret); + ret = SendMessageA(hTab, TCM_GETCURSEL, 0, 0); +todo_wine + ok(ret == nTabs - 1, "Unexpected selected tab %d.\n", ret); + + /* Removing focus sends only TCN_SELCHANGE */ + flush_sequences(sequences, NUM_MSG_SEQUENCES); + + ret = SendMessageA(hTab, TCM_SETCURFOCUS, -1, 0); + ok(ret == 0, "Unexpected ret value %d.\n", ret); + + ok_sequence(sequences, PARENT_SEQ_INDEX, selchange_parent_seq, "Remove focus sequence", FALSE); + + ret = SendMessageA(hTab, TCM_GETCURFOCUS, 0, 0); + ok(ret == -1, "Unexpected focused tab %d.\n", ret); + + tcn_selchanging_result = 0; + + DestroyWindow(hTab); +} + +static void test_TCM_GETROWCOUNT(void) +{ + const INT nTabs = 5; + HWND hTab; + INT count; + + flush_sequences(sequences, NUM_MSG_SEQUENCES); + + hTab = createFilledTabControl(parent_wnd, TCS_FIXEDWIDTH, TCIF_TEXT|TCIF_IMAGE, nTabs); + ok(hTab != NULL, "Failed to create tab control\n"); + + flush_sequences(sequences, NUM_MSG_SEQUENCES); + + count = SendMessageA(hTab, TCM_GETROWCOUNT, 0, 0); + ok(count == 1, "Unexpected row count %d.\n", count); + + ok_sequence(sequences, TAB_SEQ_INDEX, get_row_count_seq, "Get rowCount test sequence", FALSE); + ok_sequence(sequences, PARENT_SEQ_INDEX, empty_sequence, "Get rowCount test parent sequence", FALSE); + + DestroyWindow(hTab); +} + START_TEST(tab) { LOGFONTA logfont; @@ -1429,25 +1492,21 @@ START_TEST(tab) logfont.lfCharSet = ANSI_CHARSET; hFont = CreateFontIndirectA(&logfont);
- InitCommonControls(); - - test_width(); + init_functions();
init_msg_sequences(sequences, NUM_MSG_SEQUENCES);
... 1170 lines suppressed ...