Add a test case for children Z ordering at window creation time.

This commit is contained in:
Dmitry Timoshkov 2004-04-12 22:05:53 +00:00 committed by Alexandre Julliard
parent ab14429b9d
commit e1d413da84
2 changed files with 67 additions and 3 deletions

View File

@ -591,7 +591,7 @@ static LRESULT CALLBACK cbt_hook_proc(int nCode, WPARAM wParam, LPARAM lParam)
{ {
case HCBT_CREATEWND: case HCBT_CREATEWND:
{ {
DWORD style; LONG style;
CBT_CREATEWNDA *createwnd = (CBT_CREATEWNDA *)lParam; CBT_CREATEWNDA *createwnd = (CBT_CREATEWNDA *)lParam;
trace("HCBT_CREATEWND: hwnd %p, parent %p, style %08lx\n", trace("HCBT_CREATEWND: hwnd %p, parent %p, style %08lx\n",
(HWND)wParam, createwnd->lpcs->hwndParent, createwnd->lpcs->style); (HWND)wParam, createwnd->lpcs->hwndParent, createwnd->lpcs->style);
@ -954,12 +954,13 @@ static LRESULT WINAPI mdi_child_wnd_proc_1(HWND hwnd, UINT msg, WPARAM wparam, L
if (GetWindowLongA(cs->hwndParent, GWL_STYLE) & MDIS_ALLCHILDSTYLES) if (GetWindowLongA(cs->hwndParent, GWL_STYLE) & MDIS_ALLCHILDSTYLES)
{ {
ok(cs->style == (mdi_cs->style | WS_CHILD | WS_CLIPSIBLINGS), LONG style = mdi_cs->style | WS_CHILD | WS_CLIPSIBLINGS;
ok(cs->style == style,
"cs->style does not match (%08lx)\n", cs->style); "cs->style does not match (%08lx)\n", cs->style);
} }
else else
{ {
DWORD style = mdi_cs->style; LONG style = mdi_cs->style;
style &= ~WS_POPUP; style &= ~WS_POPUP;
style |= WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CAPTION | style |= WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CAPTION |
WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX; WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX;
@ -1222,6 +1223,66 @@ static void test_SetMenu(HWND parent)
DestroyMenu(hMenu); DestroyMenu(hMenu);
} }
static void test_window_tree(HWND parent, const DWORD *style, const int *order, int total)
{
HWND child[5], hwnd;
int i;
assert(total <= 5);
hwnd = GetWindow(parent, GW_CHILD);
ok(!hwnd, "have to start without children to perform the test\n");
for (i = 0; i < total; i++)
{
child[i] = CreateWindowExA(0, "static", "", style[i], 0,0,10,10,
parent, 0, 0, NULL);
trace("child[%d] = %p\n", i, child[i]);
ok(child[i] != 0, "CreateWindowEx failed to create child window\n");
}
hwnd = GetWindow(parent, GW_CHILD);
ok(hwnd != 0, "GetWindow(GW_CHILD) failed\n");
ok(hwnd == GetWindow(child[total - 1], GW_HWNDFIRST), "GW_HWNDFIRST is wrong\n");
for (i = 0; i < total; i++)
{
trace("hwnd[%d] = %p\n", i, hwnd);
ok(child[order[i]] == hwnd, "Z order of child #%d is wrong\n", i);
hwnd = GetWindow(hwnd, GW_HWNDNEXT);
}
for (i = 0; i < total; i++)
ok(DestroyWindow(child[i]), "DestroyWindow failed\n");
}
static void test_children_zorder(HWND parent)
{
const DWORD simple_style[5] = { WS_CHILD, WS_CHILD, WS_CHILD, WS_CHILD,
WS_CHILD };
const int simple_order[5] = { 0, 1, 2, 3, 4 };
const DWORD complex_style[5] = { WS_CHILD, WS_CHILD | WS_MAXIMIZE,
WS_CHILD | WS_VISIBLE, WS_CHILD,
WS_CHILD | WS_MAXIMIZE | WS_VISIBLE };
const int complex_order_1[1] = { 0 };
const int complex_order_2[2] = { 1, 0 };
const int complex_order_3[3] = { 1, 0, 2 };
const int complex_order_4[4] = { 1, 0, 2, 3 };
const int complex_order_5[5] = { 4, 1, 0, 2, 3 };
/* simple WS_CHILD */
test_window_tree(parent, simple_style, simple_order, 5);
/* complex children styles */
test_window_tree(parent, complex_style, complex_order_1, 1);
test_window_tree(parent, complex_style, complex_order_2, 2);
test_window_tree(parent, complex_style, complex_order_3, 3);
test_window_tree(parent, complex_style, complex_order_4, 4);
test_window_tree(parent, complex_style, complex_order_5, 5);
}
START_TEST(win) START_TEST(win)
{ {
pGetAncestor = (void *)GetProcAddress( GetModuleHandleA("user32.dll"), "GetAncestor" ); pGetAncestor = (void *)GetProcAddress( GetModuleHandleA("user32.dll"), "GetAncestor" );
@ -1252,5 +1313,7 @@ START_TEST(win)
test_SetWindowPos(hwndMain); test_SetWindowPos(hwndMain);
test_SetMenu(hwndMain); test_SetMenu(hwndMain);
test_children_zorder(hwndMain);
UnhookWindowsHookEx(hhook); UnhookWindowsHookEx(hhook);
} }

View File

@ -1063,6 +1063,7 @@ BOOL X11DRV_CreateWindow( HWND hwnd, CREATESTRUCTA *cs, BOOL unicode )
data->client_rect.right, data->client_rect.bottom, data->client_rect.right, data->client_rect.bottom,
(unsigned int)data->whole_window, (unsigned int)data->client_window ); (unsigned int)data->whole_window, (unsigned int)data->client_window );
/* yes, even if the CBT hook was called with HWND_TOP */
if ((wndPtr->dwStyle & (WS_CHILD|WS_MAXIMIZE)) == WS_CHILD) if ((wndPtr->dwStyle & (WS_CHILD|WS_MAXIMIZE)) == WS_CHILD)
WIN_LinkWindow( hwnd, wndPtr->parent, HWND_BOTTOM ); WIN_LinkWindow( hwnd, wndPtr->parent, HWND_BOTTOM );
else else