https://git.reactos.org/?p=reactos.git;a=commitdiff;h=f37104dadfeaa8aa2a39b…
commit f37104dadfeaa8aa2a39ba630c25d7d4b5627a0b
Author: Amine Khaldi <amine.khaldi(a)reactos.org>
AuthorDate: Tue Apr 3 13:25:05 2018 +0100
Commit: Amine Khaldi <amine.khaldi(a)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 ...