comctl32: More tests for Toolbar window style handling.
This commit is contained in:
parent
53bd62737c
commit
1c1b1c0073
|
@ -54,6 +54,24 @@ static const struct message ttgetdispinfo_parent_seq[] = {
|
|||
{ 0 }
|
||||
};
|
||||
|
||||
#define DEFINE_EXPECT(func) \
|
||||
static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
|
||||
|
||||
#define CHECK_EXPECT2(func) \
|
||||
do { \
|
||||
ok(expect_ ##func, "unexpected call " #func "\n"); \
|
||||
called_ ## func = TRUE; \
|
||||
}while(0)
|
||||
|
||||
#define CHECK_CALLED(func) \
|
||||
do { \
|
||||
ok(called_ ## func, "expected " #func "\n"); \
|
||||
expect_ ## func = called_ ## func = FALSE; \
|
||||
}while(0)
|
||||
|
||||
#define SET_EXPECT(func) \
|
||||
expect_ ## func = TRUE
|
||||
|
||||
#define expect(EXPECTED,GOT) ok((GOT)==(EXPECTED), "Expected %d, got %d\n", (EXPECTED), (GOT))
|
||||
|
||||
#define check_rect(name, val, exp, ...) ok(val.top == exp.top && val.bottom == exp.bottom && \
|
||||
|
@ -1610,6 +1628,7 @@ static void test_tooltip(void)
|
|||
{0, 21, TBSTATE_ENABLED, 0, {0, }, 0, -1},
|
||||
};
|
||||
NMTTDISPINFOW nmtti;
|
||||
HWND tooltip;
|
||||
|
||||
rebuild_toolbar(&hToolbar);
|
||||
|
||||
|
@ -1632,6 +1651,13 @@ static void test_tooltip(void)
|
|||
g_ResetDispTextPtr = FALSE;
|
||||
|
||||
DestroyWindow(hToolbar);
|
||||
|
||||
/* TBSTYLE_TOOLTIPS */
|
||||
hToolbar = CreateWindowExA(0, TOOLBARCLASSNAME, NULL, WS_CHILD | WS_VISIBLE, 0, 0, 0, 0,
|
||||
hMainWnd, (HMENU)5, GetModuleHandle(NULL), NULL);
|
||||
tooltip = (HWND)SendMessageA(hToolbar, TB_GETTOOLTIPS, 0, 0);
|
||||
ok(tooltip == NULL, "got %p\n", tooltip);
|
||||
DestroyWindow(hToolbar);
|
||||
}
|
||||
|
||||
static void test_get_set_style(void)
|
||||
|
@ -1658,6 +1684,7 @@ static void test_get_set_style(void)
|
|||
|
||||
style = SendMessageA(hToolbar, TB_GETSTYLE, 0, 0);
|
||||
style2 = GetWindowLongA(hToolbar, GWL_STYLE);
|
||||
todo_wine
|
||||
ok(style == style2, "got 0x%08x, expected 0x%08x\n", style, style2);
|
||||
|
||||
/* try to alter common window bits */
|
||||
|
@ -1681,6 +1708,125 @@ static void test_get_set_style(void)
|
|||
DestroyWindow(hToolbar);
|
||||
}
|
||||
|
||||
static HHOOK g_tbhook;
|
||||
static HWND g_toolbar;
|
||||
|
||||
DEFINE_EXPECT(g_hook_create);
|
||||
DEFINE_EXPECT(g_hook_WM_NCCREATE);
|
||||
DEFINE_EXPECT(g_hook_WM_CREATE);
|
||||
|
||||
static LRESULT WINAPI toolbar_subclass_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
WNDPROC oldproc = (WNDPROC)GetWindowLongPtrA(hwnd, GWLP_USERDATA);
|
||||
LRESULT ret;
|
||||
DWORD style;
|
||||
|
||||
if (msg == WM_NCCREATE)
|
||||
{
|
||||
if (g_toolbar == hwnd)
|
||||
{
|
||||
CHECK_EXPECT2(g_hook_WM_NCCREATE);
|
||||
g_toolbar = hwnd;
|
||||
ret = CallWindowProcA(oldproc, hwnd, msg, wParam, lParam);
|
||||
|
||||
/* control is already set up */
|
||||
style = SendMessageA(hwnd, TB_GETSTYLE, 0, 0);
|
||||
ok(style != 0, "got %x\n", style);
|
||||
|
||||
style = GetWindowLongA(hwnd, GWL_STYLE);
|
||||
ok((style & TBSTYLE_TOOLTIPS) == 0, "got 0x%08x\n", style);
|
||||
SetWindowLongA(hwnd, GWL_STYLE, style|TBSTYLE_TOOLTIPS);
|
||||
style = GetWindowLongA(hwnd, GWL_STYLE);
|
||||
ok((style & TBSTYLE_TOOLTIPS) == TBSTYLE_TOOLTIPS, "got 0x%08x\n", style);
|
||||
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
else if (msg == WM_CREATE)
|
||||
{
|
||||
CREATESTRUCTA *cs = (CREATESTRUCTA*)lParam;
|
||||
|
||||
if (g_toolbar == hwnd)
|
||||
{
|
||||
CHECK_EXPECT2(g_hook_WM_CREATE);
|
||||
|
||||
style = GetWindowLongA(hwnd, GWL_STYLE);
|
||||
ok((style & TBSTYLE_TOOLTIPS) == TBSTYLE_TOOLTIPS, "got 0x%08x\n", style);
|
||||
|
||||
/* test if toolbar-specific messages are already working before WM_CREATE */
|
||||
style = SendMessageA(hwnd, TB_GETSTYLE, 0, 0);
|
||||
ok(style != 0, "got %x\n", style);
|
||||
ok((style & TBSTYLE_TOOLTIPS) == TBSTYLE_TOOLTIPS, "got 0x%x\n", style);
|
||||
ok((cs->style & TBSTYLE_TOOLTIPS) == 0, "0x%08x\n", cs->style);
|
||||
|
||||
ret = CallWindowProcA(oldproc, hwnd, msg, wParam, lParam);
|
||||
|
||||
style = GetWindowLongA(hwnd, GWL_STYLE);
|
||||
ok((style & TBSTYLE_TOOLTIPS) == TBSTYLE_TOOLTIPS, "got 0x%08x\n", style);
|
||||
|
||||
/* test if toolbar-specific messages are already working before WM_CREATE */
|
||||
style = SendMessageA(hwnd, TB_GETSTYLE, 0, 0);
|
||||
ok(style != 0, "got %x\n", style);
|
||||
ok((style & TBSTYLE_TOOLTIPS) == TBSTYLE_TOOLTIPS, "got 0x%x\n", style);
|
||||
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return CallWindowProcA(oldproc, hwnd, msg, wParam, lParam);
|
||||
}
|
||||
|
||||
LRESULT CALLBACK cbt_hook_proc(int code, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
if (code == HCBT_CREATEWND)
|
||||
{
|
||||
HWND hwnd = (HWND)wParam;
|
||||
|
||||
if (!g_toolbar)
|
||||
{
|
||||
WNDPROC oldproc;
|
||||
|
||||
CHECK_EXPECT2(g_hook_create);
|
||||
g_toolbar = hwnd;
|
||||
/* subclass */
|
||||
oldproc = (WNDPROC)SetWindowLongPtrA(hwnd, GWLP_WNDPROC, (LONG_PTR)toolbar_subclass_proc);
|
||||
SetWindowLongPtrA(hwnd, GWLP_USERDATA, (LONG_PTR)oldproc);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
return CallNextHookEx(g_tbhook, code, wParam, lParam);
|
||||
}
|
||||
|
||||
static void test_create(void)
|
||||
{
|
||||
HWND hwnd, tooltip;
|
||||
DWORD style;
|
||||
|
||||
g_tbhook = SetWindowsHookA(WH_CBT, cbt_hook_proc);
|
||||
|
||||
SET_EXPECT(g_hook_create);
|
||||
SET_EXPECT(g_hook_WM_NCCREATE);
|
||||
SET_EXPECT(g_hook_WM_CREATE);
|
||||
|
||||
hwnd = CreateWindowExA(0, TOOLBARCLASSNAME, NULL, WS_CHILD | WS_VISIBLE, 0, 0, 0, 0,
|
||||
hMainWnd, (HMENU)5, GetModuleHandle(NULL), NULL);
|
||||
|
||||
CHECK_CALLED(g_hook_create);
|
||||
CHECK_CALLED(g_hook_WM_NCCREATE);
|
||||
CHECK_CALLED(g_hook_WM_CREATE);
|
||||
|
||||
style = GetWindowLongA(hwnd, GWL_STYLE);
|
||||
ok((style & TBSTYLE_TOOLTIPS) == TBSTYLE_TOOLTIPS, "got 0x%08x\n", style);
|
||||
|
||||
tooltip = (HWND)SendMessageA(hwnd, TB_GETTOOLTIPS, 0, 0);
|
||||
ok(tooltip != NULL, "got %p\n", tooltip);
|
||||
ok(GetParent(tooltip) == hMainWnd, "got %p, %p\n", hMainWnd, hwnd);
|
||||
|
||||
DestroyWindow(hwnd);
|
||||
UnhookWindowsHook(WH_CBT, cbt_hook_proc);
|
||||
}
|
||||
|
||||
START_TEST(toolbar)
|
||||
{
|
||||
WNDCLASSA wc;
|
||||
|
@ -1721,6 +1867,7 @@ START_TEST(toolbar)
|
|||
test_getstring();
|
||||
test_tooltip();
|
||||
test_get_set_style();
|
||||
test_create();
|
||||
|
||||
PostQuitMessage(0);
|
||||
while(GetMessageA(&msg,0,0,0)) {
|
||||
|
|
|
@ -5155,7 +5155,7 @@ TOOLBAR_Create (HWND hwnd, const CREATESTRUCTW *lpcs)
|
|||
|
||||
TRACE("hwnd = %p, style=0x%08x\n", hwnd, lpcs->style);
|
||||
|
||||
infoPtr->dwStyle = lpcs->style;
|
||||
infoPtr->dwStyle = GetWindowLongW(hwnd, GWL_STYLE);
|
||||
GetClientRect(hwnd, &infoPtr->client_rect);
|
||||
infoPtr->bUnicode = infoPtr->hwndNotify &&
|
||||
(NFR_UNICODE == SendMessageW(hwnd, WM_NOTIFYFORMAT, (WPARAM)hwnd, NF_REQUERY));
|
||||
|
|
Loading…
Reference in New Issue