From: Zhiyi Zhang Subject: [PATCH 3/3] user32/tests: Test WM_NEXTDLGCTL with newer button styles. Message-Id: <1192ca6b-8c75-916b-8064-5ef1e0b96c7f@codeweavers.com> Date: Mon, 26 Aug 2019 19:57:49 +0800 Test WM_NEXTDLGCTL with Split Buttons and Command Links with and without common control version 6. Signed-off-by: Zhiyi Zhang --- dlls/user32/tests/dialog.c | 102 ++++++++++++++++++++++++++++- dlls/user32/tests/v6util.h | 131 +++++++++++++++++++++++++++++++++++++ 2 files changed, 231 insertions(+), 2 deletions(-) create mode 100644 dlls/user32/tests/v6util.h diff --git a/dlls/user32/tests/dialog.c b/dlls/user32/tests/dialog.c index b72f08816d..20536242e1 100644 --- a/dlls/user32/tests/dialog.c +++ b/dlls/user32/tests/dialog.c @@ -40,6 +40,8 @@ #include "winbase.h" #include "wingdi.h" #include "winuser.h" +#include "commctrl.h" +#include "v6util.h" #define MAXHWNDS 1024 static HWND hwnd [MAXHWNDS]; @@ -48,7 +50,7 @@ static unsigned int numwnds=1; /* 0 is reserved for null */ /* Global handles */ static HINSTANCE g_hinst; /* This application's HINSTANCE */ static HWND g_hwndMain, g_hwndButton1, g_hwndButton2, g_hwndButtonCancel; -static HWND g_hwndTestDlg, g_hwndTestDlgBut1, g_hwndTestDlgBut2, g_hwndTestDlgEdit; +static HWND g_hwndTestDlg, g_hwndTestDlgBut1, g_hwndTestDlgBut2, g_hwndTestDlgBut3, g_hwndTestDlgBut4, g_hwndTestDlgEdit; static HWND g_hwndInitialFocusT1, g_hwndInitialFocusT2, g_hwndInitialFocusGroupBox; static LONG g_styleInitialFocusT1, g_styleInitialFocusT2; @@ -457,6 +459,16 @@ static BOOL OnTestDlgCreate (HWND hwnd, LPCREATESTRUCTA lpcs) 90,102,80,24, hwnd, (HMENU)IDCANCEL, g_hinst, 0); if (!g_hwndTestDlgBut2) return FALSE; + g_hwndTestDlgBut3 = CreateWindowExA(WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR | WS_EX_NOPARENTNOTIFY, + "button", "Button &3", WS_CHILDWINDOW | WS_VISIBLE | WS_TABSTOP | BS_SPLITBUTTON, + 300, 150, 40, 40, hwnd, (HMENU)301, g_hinst, 0); + if (!g_hwndTestDlgBut3) return FALSE; + + g_hwndTestDlgBut4 = CreateWindowExA(WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR | WS_EX_NOPARENTNOTIFY, + "button", "Button &4", WS_CHILDWINDOW | WS_VISIBLE | WS_TABSTOP | BS_COMMANDLINK, + 300, 200, 40, 40, hwnd, (HMENU)401, g_hinst, 0); + if (!g_hwndTestDlgBut4) return FALSE; + return TRUE; } @@ -607,6 +619,8 @@ static void test_WM_NEXTDLGCTL(void) HWND child1, child2, child3; MSG msg; DWORD dwVal; + ULONG_PTR ctx_cookie; + HANDLE hCtx; g_hwndTestDlg = CreateWindowExA( WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR | WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE | WS_EX_CONTROLPARENT | WS_EX_APPWINDOW, @@ -614,12 +628,14 @@ static void test_WM_NEXTDLGCTL(void) "WM_NEXTDLGCTL Message test window", WS_POPUPWINDOW | WS_CLIPSIBLINGS | WS_DLGFRAME | WS_OVERLAPPED | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | DS_3DLOOK | DS_SETFONT | DS_MODALFRAME, - 0, 0, 235, 135, + 0, 0, 400, 300, NULL, NULL, g_hinst, 0); assert (g_hwndTestDlg); assert (g_hwndTestDlgBut1); assert (g_hwndTestDlgBut2); + assert (g_hwndTestDlgBut3); + assert (g_hwndTestDlgBut4); assert (g_hwndTestDlgEdit); /* @@ -656,6 +672,8 @@ static void test_WM_NEXTDLGCTL(void) */ ok(get_button_style(g_hwndTestDlgBut1) == BS_DEFPUSHBUTTON, "Button1's style not set to BS_DEFPUSHBUTTON"); ok(get_button_style(g_hwndTestDlgBut2) == BS_PUSHBUTTON, "Button2's style not set to BS_PUSHBUTTON"); + ok(get_button_style(g_hwndTestDlgBut3) == BS_SPLITBUTTON, "Button3's style not set to BS_SPLITBUTTON\n"); + ok(get_button_style(g_hwndTestDlgBut4) == BS_COMMANDLINK, "Button4's style not set to BS_COMMANDLINK\n"); /* Move focus to Button2 using "WM_NEXTDLGCTL" */ DefDlgProcA(g_hwndTestDlg, WM_NEXTDLGCTL, 0, 0); @@ -671,6 +689,28 @@ static void test_WM_NEXTDLGCTL(void) */ ok(get_button_style(g_hwndTestDlgBut1) == BS_PUSHBUTTON, "Button1's style not set to BS_PUSHBUTTON"); ok(get_button_style(g_hwndTestDlgBut2) == BS_DEFPUSHBUTTON, "Button2's style not set to BS_DEFPUSHBUTTON"); + ok(get_button_style(g_hwndTestDlgBut3) == BS_SPLITBUTTON, "Button3's style not set to BS_SPLITBUTTON\n"); + ok(get_button_style(g_hwndTestDlgBut4) == BS_COMMANDLINK, "Button4's style not set to BS_COMMANDLINK\n"); + + /* Move focus to Button3 using "WM_NEXTDLGCTL" */ + DefDlgProcA(g_hwndTestDlg, WM_NEXTDLGCTL, 0, 0); + ok((GetFocus() == g_hwndTestDlgBut3), "Focus didn't move to the third button\n"); + dwVal = DefDlgProcA(g_hwndTestDlg, DM_GETDEFID, 0, 0); + ok(IDCANCEL == (LOWORD(dwVal)), "WM_NEXTDLGCTL changed default button\n"); + ok(get_button_style(g_hwndTestDlgBut1) == BS_PUSHBUTTON, "Button1's style not set to BS_PUSHBUTTON"); + ok(get_button_style(g_hwndTestDlgBut2) == BS_DEFPUSHBUTTON, "Button2's style not set to BS_DEFPUSHBUTTON"); + ok(get_button_style(g_hwndTestDlgBut3) == BS_SPLITBUTTON, "Button3's style not set to BS_SPLITBUTTON\n"); + ok(get_button_style(g_hwndTestDlgBut4) == BS_COMMANDLINK, "Button4's style not set to BS_COMMANDLINK\n"); + + /* Move focus to Button4 using "WM_NEXTDLGCTL" */ + DefDlgProcA(g_hwndTestDlg, WM_NEXTDLGCTL, 0, 0); + ok((GetFocus() == g_hwndTestDlgBut4), "Focus didn't move to the fourth button\n"); + dwVal = DefDlgProcA(g_hwndTestDlg, DM_GETDEFID, 0, 0); + ok(IDCANCEL == (LOWORD(dwVal)), "WM_NEXTDLGCTL changed default button\n"); + ok(get_button_style(g_hwndTestDlgBut1) == BS_PUSHBUTTON, "Button1's style not set to BS_PUSHBUTTON"); + ok(get_button_style(g_hwndTestDlgBut2) == BS_DEFPUSHBUTTON, "Button2's style not set to BS_DEFPUSHBUTTON"); + ok(get_button_style(g_hwndTestDlgBut3) == BS_SPLITBUTTON, "Button3's style not set to BS_SPLITBUTTON\n"); + ok(get_button_style(g_hwndTestDlgBut4) == BS_COMMANDLINK, "Button4's style not set to BS_COMMANDLINK\n"); /* Move focus to Edit control using "WM_NEXTDLGCTL" */ DefDlgProcA(g_hwndTestDlg, WM_NEXTDLGCTL, 0, 0); @@ -712,6 +752,64 @@ static void test_WM_NEXTDLGCTL(void) DestroyWindow(child2); DestroyWindow(child1); DestroyWindow(g_hwndTestDlg); + + /* WM_NEXTDLGCTL with v6 common controls */ + if (!load_v6_module(&ctx_cookie, &hCtx)) + return; + + g_hwndTestDlg = CreateWindowExA( WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR + | WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE | WS_EX_CONTROLPARENT | WS_EX_APPWINDOW, + "WM_NEXTDLGCTLWndClass", "WM_NEXTDLGCTL Message test window", + WS_POPUPWINDOW | WS_CLIPSIBLINGS | WS_DLGFRAME | WS_OVERLAPPED | + WS_MINIMIZEBOX | WS_MAXIMIZEBOX | DS_3DLOOK | DS_SETFONT | DS_MODALFRAME, + 0, 0, 400, 300, NULL, NULL, g_hinst, 0); + + assert(g_hwndTestDlg); + assert(g_hwndTestDlgBut1); + assert(g_hwndTestDlgBut2); + assert(g_hwndTestDlgBut3); + assert(g_hwndTestDlgBut4); + + /* Set the focus first on edit control */ + SetFocus(g_hwndTestDlgEdit); + ok((GetFocus() == g_hwndTestDlgEdit), "Focus didn't set on Edit control\n"); + + DefDlgProcA(g_hwndTestDlg, WM_NEXTDLGCTL, 0, 0); + ok((GetFocus() == g_hwndTestDlgBut1), "Focus didn't move to first button\n"); + ok(get_button_style(g_hwndTestDlgBut1) == BS_DEFPUSHBUTTON, "Button1's style not set to BS_DEFPUSHBUTTON"); + ok(get_button_style(g_hwndTestDlgBut2) == BS_PUSHBUTTON, "Button2's style not set to BS_PUSHBUTTON"); + ok(get_button_style(g_hwndTestDlgBut3) == BS_SPLITBUTTON, "Button3's style not set to BS_SPLITBUTTON\n"); + ok(get_button_style(g_hwndTestDlgBut4) == BS_COMMANDLINK, "Button4's style not set to BS_COMMANDLINK\n"); + + DefDlgProcA(g_hwndTestDlg, WM_NEXTDLGCTL, 0, 0); + ok((GetFocus() == g_hwndTestDlgBut2), "Focus didn't move to second button\n"); + ok(get_button_style(g_hwndTestDlgBut1) == BS_PUSHBUTTON, "Button1's style not set to BS_PUSHBUTTON"); + ok(get_button_style(g_hwndTestDlgBut2) == BS_DEFPUSHBUTTON, "Button2's style not set to BS_DEFPUSHBUTTON"); + ok(get_button_style(g_hwndTestDlgBut3) == BS_SPLITBUTTON, "Button3's style not set to BS_SPLITBUTTON\n"); + ok(get_button_style(g_hwndTestDlgBut4) == BS_COMMANDLINK, "Button4's style not set to BS_COMMANDLINK\n"); + + DefDlgProcA(g_hwndTestDlg, WM_NEXTDLGCTL, 0, 0); + ok((GetFocus() == g_hwndTestDlgBut3), "Focus didn't move to the third button\n"); + ok(get_button_style(g_hwndTestDlgBut1) == BS_PUSHBUTTON, "Button1's style not set to BS_PUSHBUTTON"); + ok(get_button_style(g_hwndTestDlgBut2) == BS_PUSHBUTTON, "Button2's style not set to BS_PUSHBUTTON"); + /* XP/2003 doesn't support common control v6 */ + todo_wine ok(get_button_style(g_hwndTestDlgBut3) == BS_DEFSPLITBUTTON + || broken(get_button_style(g_hwndTestDlgBut3) == BS_SPLITBUTTON), + "Button3's style not set to BS_DEFSPLITBUTTON\n"); + ok(get_button_style(g_hwndTestDlgBut4) == BS_COMMANDLINK, "Button4's style not set to BS_COMMANDLINK\n"); + + DefDlgProcA(g_hwndTestDlg, WM_NEXTDLGCTL, 0, 0); + ok((GetFocus() == g_hwndTestDlgBut4), "Focus didn't move to the third button\n"); + ok(get_button_style(g_hwndTestDlgBut1) == BS_PUSHBUTTON, "Button1's style not set to BS_PUSHBUTTON"); + ok(get_button_style(g_hwndTestDlgBut2) == BS_PUSHBUTTON, "Button2's style not set to BS_PUSHBUTTON"); + todo_wine ok(get_button_style(g_hwndTestDlgBut3) == BS_SPLITBUTTON, "Button3's style not set to BS_SPLITBUTTON\n"); + /* XP/2003 doesn't support common control v6 */ + todo_wine ok(get_button_style(g_hwndTestDlgBut4) == BS_DEFCOMMANDLINK + || broken(get_button_style(g_hwndTestDlgBut4) == BS_COMMANDLINK), + "Button4's style not set to BS_DEFCOMMANDLINK\n"); + + DestroyWindow(g_hwndTestDlg); + unload_v6_module(ctx_cookie, hCtx); } static LRESULT CALLBACK hook_proc(INT code, WPARAM wParam, LPARAM lParam) diff --git a/dlls/user32/tests/v6util.h b/dlls/user32/tests/v6util.h new file mode 100644 index 0000000000..626f6e6125 --- /dev/null +++ b/dlls/user32/tests/v6util.h @@ -0,0 +1,131 @@ +/* + * Utility routines for comctl32 v6 tests + * + * Copyright 2006 Mike McCormack for CodeWeavers + * Copyright 2007 George Gov + * Copyright 2009 Owen Rudge for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifdef __i386__ +#define ARCH "x86" +#elif defined __x86_64__ +#define ARCH "amd64" +#elif defined __arm__ +#define ARCH "arm" +#elif defined __aarch64__ +#define ARCH "arm64" +#else +#define ARCH "none" +#endif + +static const CHAR manifest_name[] = "cc6.manifest"; + +static const CHAR manifest[] = + "\n" + "\n" + " \n" + "Wine comctl32 test suite\n" + "\n" + " \n" + " \n" + "\n" + "\n" + "\n"; + +static void unload_v6_module(ULONG_PTR cookie, HANDLE hCtx) +{ + DeactivateActCtx(0, cookie); + ReleaseActCtx(hCtx); + + DeleteFileA(manifest_name); +} + +static BOOL load_v6_module(ULONG_PTR *pcookie, HANDLE *hCtx) +{ + ACTCTX_SECTION_KEYED_DATA data; + DWORD written; + HMODULE hmod; + ACTCTXA ctx; + HANDLE file; + BOOL ret; + + /* create manifest */ + file = CreateFileA( manifest_name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL ); + if (file != INVALID_HANDLE_VALUE) + { + ret = (WriteFile( file, manifest, sizeof(manifest)-1, &written, NULL ) && + written == sizeof(manifest)-1); + CloseHandle( file ); + if (!ret) + { + DeleteFileA( manifest_name ); + skip("Failed to fill manifest file. Skipping comctl32 V6 tests.\n"); + return FALSE; + } + else + trace("created %s\n", manifest_name); + } + else + { + skip("Failed to create manifest file. Skipping comctl32 V6 tests.\n"); + return FALSE; + } + + memset(&ctx, 0, sizeof(ctx)); + ctx.cbSize = sizeof(ctx); + ctx.lpSource = manifest_name; + + *hCtx = CreateActCtxA(&ctx); + ok(*hCtx != 0, "Expected context handle\n"); + + hmod = GetModuleHandleA("comctl32.dll"); + + ret = ActivateActCtx(*hCtx, pcookie); + ok(ret, "Failed to activate context, error %d.\n", GetLastError()); + + if (!ret) + { + win_skip("A problem during context activation occurred.\n"); + DeleteFileA(manifest_name); + } + + data.cbSize = sizeof(data); + ret = FindActCtxSectionStringA(0, NULL, ACTIVATION_CONTEXT_SECTION_DLL_REDIRECTION, + "comctl32.dll", &data); + ok(ret, "failed to find comctl32.dll in active context, %u\n", GetLastError()); + if (ret) + { + FreeLibrary(hmod); + LoadLibraryA("comctl32.dll"); + } + + return ret; +} + +#undef ARCH -- 2.23.0.rc1