📄 win.c
字号:
/* not owned popup with WS_CHILD (same as WS_POPUP only) */
test = create_tool_window( WS_POPUP | WS_CHILD, 0 );
trace( "created WS_CHILD popup %p\n", test );
check_parents( test, desktop, 0, 0, 0, test, test );
DestroyWindow( test );
/* not owned popup with WS_CHILD | WS_MAXIMIZE (same as WS_POPUP only) */
test = create_tool_window( WS_POPUP | WS_CHILD | WS_MAXIMIZE, 0 );
DestroyWindow( test );
/* owned popup with WS_CHILD (same as WS_POPUP only) */
test = create_tool_window( WS_POPUP | WS_CHILD, hwndMain );
trace( "created owned WS_CHILD popup %p\n", test );
check_parents( test, desktop, hwndMain, hwndMain, hwndMain, test, hwndMain );
DestroyWindow( test );
/* owned popup with WS_CHILD (same as WS_POPUP only) with WS_MAXIMIZE */
test = create_tool_window( WS_POPUP | WS_CHILD | WS_MAXIMIZE, hwndMain );
DestroyWindow( test );
/******************** parent changes *************************/
trace( "testing parent changes\n" );
/* desktop window */
check_parents( desktop, 0, 0, 0, 0, 0, 0 );
#if 0 /* this test succeeds on NT but crashes on win9x systems */
ret = (HWND)SetWindowLongA( test, GWL_HWNDPARENT, (LONG_PTR)hwndMain2 );
ok( !ret, "Set GWL_HWNDPARENT succeeded on desktop\n" );
check_parents( desktop, 0, 0, 0, 0, 0, 0 );
ok( !SetParent( desktop, hwndMain ), "SetParent succeeded on desktop\n" );
check_parents( desktop, 0, 0, 0, 0, 0, 0 );
#endif
/* normal child window */
test = create_tool_window( WS_CHILD, hwndMain );
trace( "created child %p\n", test );
ret = (HWND)SetWindowLongPtrA( test, GWLP_HWNDPARENT, (LONG_PTR)hwndMain2 );
ok( ret == hwndMain, "GWL_HWNDPARENT return value %p expected %p\n", ret, hwndMain );
check_parents( test, hwndMain2, hwndMain2, hwndMain2, 0, hwndMain2, hwndMain2 );
ret = (HWND)SetWindowLongPtrA( test, GWLP_HWNDPARENT, (LONG_PTR)child );
ok( ret == hwndMain2, "GWL_HWNDPARENT return value %p expected %p\n", ret, hwndMain2 );
check_parents( test, child, child, child, 0, hwndMain, hwndMain );
ret = (HWND)SetWindowLongPtrA( test, GWLP_HWNDPARENT, (LONG_PTR)desktop );
ok( ret == child, "GWL_HWNDPARENT return value %p expected %p\n", ret, child );
check_parents( test, desktop, 0, desktop, 0, test, desktop );
/* window is now child of desktop so GWLP_HWNDPARENT changes owner from now on */
ret = (HWND)SetWindowLongPtrA( test, GWLP_HWNDPARENT, (LONG_PTR)child );
ok( ret == 0, "GWL_HWNDPARENT return value %p expected 0\n", ret );
check_parents( test, desktop, child, desktop, child, test, desktop );
ret = (HWND)SetWindowLongPtrA( test, GWLP_HWNDPARENT, 0 );
ok( ret == child, "GWL_HWNDPARENT return value %p expected %p\n", ret, child );
check_parents( test, desktop, 0, desktop, 0, test, desktop );
DestroyWindow( test );
/* not owned top-level window */
test = create_tool_window( 0, 0 );
trace( "created top-level %p\n", test );
ret = (HWND)SetWindowLongPtrA( test, GWLP_HWNDPARENT, (LONG_PTR)hwndMain2 );
ok( ret == 0, "GWL_HWNDPARENT return value %p expected 0\n", ret );
check_parents( test, desktop, hwndMain2, 0, hwndMain2, test, test );
ret = (HWND)SetWindowLongPtrA( test, GWLP_HWNDPARENT, (LONG_PTR)child );
ok( ret == hwndMain2, "GWL_HWNDPARENT return value %p expected %p\n", ret, hwndMain2 );
check_parents( test, desktop, child, 0, child, test, test );
ret = (HWND)SetWindowLongPtrA( test, GWLP_HWNDPARENT, 0 );
ok( ret == child, "GWL_HWNDPARENT return value %p expected %p\n", ret, child );
check_parents( test, desktop, 0, 0, 0, test, test );
DestroyWindow( test );
/* not owned popup */
test = create_tool_window( WS_POPUP, 0 );
trace( "created popup %p\n", test );
ret = (HWND)SetWindowLongPtrA( test, GWLP_HWNDPARENT, (LONG_PTR)hwndMain2 );
ok( ret == 0, "GWL_HWNDPARENT return value %p expected 0\n", ret );
check_parents( test, desktop, hwndMain2, hwndMain2, hwndMain2, test, hwndMain2 );
ret = (HWND)SetWindowLongPtrA( test, GWLP_HWNDPARENT, (LONG_PTR)child );
ok( ret == hwndMain2, "GWL_HWNDPARENT return value %p expected %p\n", ret, hwndMain2 );
check_parents( test, desktop, child, child, child, test, hwndMain );
ret = (HWND)SetWindowLongPtrA( test, GWLP_HWNDPARENT, 0 );
ok( ret == child, "GWL_HWNDPARENT return value %p expected %p\n", ret, child );
check_parents( test, desktop, 0, 0, 0, test, test );
DestroyWindow( test );
/* normal child window */
test = create_tool_window( WS_CHILD, hwndMain );
trace( "created child %p\n", test );
ret = SetParent( test, desktop );
ok( ret == hwndMain, "SetParent return value %p expected %p\n", ret, hwndMain );
check_parents( test, desktop, 0, desktop, 0, test, desktop );
ret = SetParent( test, child );
ok( ret == desktop, "SetParent return value %p expected %p\n", ret, desktop );
check_parents( test, child, child, child, 0, hwndMain, hwndMain );
ret = SetParent( test, hwndMain2 );
ok( ret == child, "SetParent return value %p expected %p\n", ret, child );
check_parents( test, hwndMain2, hwndMain2, hwndMain2, 0, hwndMain2, hwndMain2 );
DestroyWindow( test );
/* not owned top-level window */
test = create_tool_window( 0, 0 );
trace( "created top-level %p\n", test );
ret = SetParent( test, child );
ok( ret == desktop, "SetParent return value %p expected %p\n", ret, desktop );
check_parents( test, child, child, 0, 0, hwndMain, test );
DestroyWindow( test );
/* owned popup */
test = create_tool_window( WS_POPUP, hwndMain2 );
trace( "created owned popup %p\n", test );
ret = SetParent( test, child );
ok( ret == desktop, "SetParent return value %p expected %p\n", ret, desktop );
check_parents( test, child, child, hwndMain2, hwndMain2, hwndMain, hwndMain2 );
ret = (HWND)SetWindowLongPtrA( test, GWLP_HWNDPARENT, (ULONG_PTR)hwndMain );
ok( ret == child, "GWL_HWNDPARENT return value %p expected %p\n", ret, child );
check_parents( test, hwndMain, hwndMain, hwndMain2, hwndMain2, hwndMain, hwndMain2 );
DestroyWindow( test );
/**************** test owner destruction *******************/
/* owned child popup */
owner = create_tool_window( 0, 0 );
test = create_tool_window( WS_POPUP, owner );
trace( "created owner %p and popup %p\n", owner, test );
ret = SetParent( test, child );
ok( ret == desktop, "SetParent return value %p expected %p\n", ret, desktop );
check_parents( test, child, child, owner, owner, hwndMain, owner );
/* window is now child of 'child' but owned by 'owner' */
DestroyWindow( owner );
ok( IsWindow(test), "Window %p destroyed by owner destruction\n", test );
/* Win98 doesn't pass this test. It doesn't allow a destroyed owner,
* while Win95, Win2k, WinXP do.
*/
/*check_parents( test, child, child, owner, owner, hwndMain, owner );*/
ok( !IsWindow(owner), "Owner %p not destroyed\n", owner );
DestroyWindow(test);
/* owned top-level popup */
owner = create_tool_window( 0, 0 );
test = create_tool_window( WS_POPUP, owner );
trace( "created owner %p and popup %p\n", owner, test );
check_parents( test, desktop, owner, owner, owner, test, owner );
DestroyWindow( owner );
ok( !IsWindow(test), "Window %p not destroyed by owner destruction\n", test );
/* top-level popup owned by child */
owner = create_tool_window( WS_CHILD, hwndMain2 );
test = create_tool_window( WS_POPUP, 0 );
trace( "created owner %p and popup %p\n", owner, test );
ret = (HWND)SetWindowLongPtrA( test, GWLP_HWNDPARENT, (ULONG_PTR)owner );
ok( ret == 0, "GWL_HWNDPARENT return value %p expected 0\n", ret );
check_parents( test, desktop, owner, owner, owner, test, hwndMain2 );
DestroyWindow( owner );
ok( IsWindow(test), "Window %p destroyed by owner destruction\n", test );
ok( !IsWindow(owner), "Owner %p not destroyed\n", owner );
/* Win98 doesn't pass this test. It doesn't allow a destroyed owner,
* while Win95, Win2k, WinXP do.
*/
/*check_parents( test, desktop, owner, owner, owner, test, owner );*/
DestroyWindow(test);
/* final cleanup */
DestroyWindow(child);
owner = create_tool_window( WS_OVERLAPPED, 0 );
test = create_tool_window( WS_POPUP, desktop );
ok( !GetWindow( test, GW_OWNER ), "Wrong owner window\n" );
numChildren = 0;
ok( !EnumChildWindows( owner, EnumChildProc, (LPARAM)&numChildren ),
"EnumChildWindows should have returned FALSE\n" );
ok( numChildren == 0, "numChildren should be 0 got %d\n", numChildren );
SetWindowLongA( test, GWL_STYLE, (GetWindowLongA( test, GWL_STYLE ) & ~WS_POPUP) | WS_CHILD );
ret = SetParent( test, owner );
ok( ret == desktop, "SetParent return value %p expected %p\n", ret, desktop );
numChildren = 0;
ok( EnumChildWindows( owner, EnumChildProc, (LPARAM)&numChildren ),
"EnumChildWindows should have returned TRUE\n" );
ok( numChildren == 1, "numChildren should be 1 got %d\n", numChildren );
child = create_tool_window( WS_CHILD, owner );
numChildren = 0;
ok( !EnumChildWindows( owner, EnumChildProc, (LPARAM)&numChildren ),
"EnumChildWindows should have returned FALSE\n" );
ok( numChildren == 2, "numChildren should be 2 got %d\n", numChildren );
DestroyWindow( child );
child = create_tool_window( WS_VISIBLE | WS_OVERLAPPEDWINDOW, owner );
ok( GetWindow( child, GW_OWNER ) == owner, "Wrong owner window\n" );
numChildren = 0;
ok( EnumChildWindows( owner, EnumChildProc, (LPARAM)&numChildren ),
"EnumChildWindows should have returned TRUE\n" );
ok( numChildren == 1, "numChildren should be 1 got %d\n", numChildren );
ret = SetParent( child, owner );
ok( GetWindow( child, GW_OWNER ) == owner, "Wrong owner window\n" );
ok( ret == desktop, "SetParent return value %p expected %p\n", ret, desktop );
numChildren = 0;
ok( !EnumChildWindows( owner, EnumChildProc, (LPARAM)&numChildren ),
"EnumChildWindows should have returned FALSE\n" );
ok( numChildren == 2, "numChildren should be 2 got %d\n", numChildren );
ret = SetParent( child, NULL );
ok( GetWindow( child, GW_OWNER ) == owner, "Wrong owner window\n" );
ok( ret == owner, "SetParent return value %p expected %p\n", ret, owner );
numChildren = 0;
ok( EnumChildWindows( owner, EnumChildProc, (LPARAM)&numChildren ),
"EnumChildWindows should have returned TRUE\n" );
ok( numChildren == 1, "numChildren should be 1 got %d\n", numChildren );
/* even GW_OWNER == owner it's still a desktop's child */
ok( !EnumChildWindows( desktop, EnumChildProc1, (LPARAM)child ),
"EnumChildWindows should have found %p and returned FALSE\n", child );
DestroyWindow( child );
child = create_tool_window( WS_VISIBLE | WS_OVERLAPPEDWINDOW, NULL );
ok( !EnumChildWindows( desktop, EnumChildProc1, (LPARAM)child ),
"EnumChildWindows should have found %p and returned FALSE\n", child );
DestroyWindow( child );
DestroyWindow( test );
DestroyWindow( owner );
}
static LRESULT WINAPI main_window_procA(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
switch (msg)
{
case WM_GETMINMAXINFO:
{
MINMAXINFO* minmax = (MINMAXINFO *)lparam;
trace("hwnd %p, WM_GETMINMAXINFO, %08x, %08lx\n", hwnd, wparam, lparam);
trace("ptReserved (%ld,%ld), ptMaxSize (%ld,%ld), ptMaxPosition (%ld,%ld)\n"
" ptMinTrackSize (%ld,%ld), ptMaxTrackSize (%ld,%ld)\n",
minmax->ptReserved.x, minmax->ptReserved.y,
minmax->ptMaxSize.x, minmax->ptMaxSize.y,
minmax->ptMaxPosition.x, minmax->ptMaxPosition.y,
minmax->ptMinTrackSize.x, minmax->ptMinTrackSize.y,
minmax->ptMaxTrackSize.x, minmax->ptMaxTrackSize.y);
SetWindowLongPtrA(hwnd, GWLP_USERDATA, 0x20031021);
break;
}
case WM_WINDOWPOSCHANGING:
{
BOOL is_win9x = GetWindowLongPtrW(hwnd, GWLP_WNDPROC) == 0;
WINDOWPOS *winpos = (WINDOWPOS *)lparam;
trace("main: WM_WINDOWPOSCHANGING\n");
trace("%p after %p, x %d, y %d, cx %d, cy %d flags %08x\n",
winpos->hwnd, winpos->hwndInsertAfter,
winpos->x, winpos->y, winpos->cx, winpos->cy, winpos->flags);
if (!(winpos->flags & SWP_NOMOVE))
{
ok(winpos->x >= -32768 && winpos->x <= 32767, "bad winpos->x %d\n", winpos->x);
ok(winpos->y >= -32768 && winpos->y <= 32767, "bad winpos->y %d\n", winpos->y);
}
/* Win9x does not fixup cx/xy for WM_WINDOWPOSCHANGING */
if (!(winpos->flags & SWP_NOSIZE) && !is_win9x)
{
ok(winpos->cx >= 0 && winpos->cx <= 32767, "bad winpos->cx %d\n", winpos->cx);
ok(winpos->cy >= 0 && winpos->cy <= 32767, "bad winpos->cy %d\n", winpos->cy);
}
break;
}
case WM_WINDOWPOSCHANGED:
{
RECT rc1, rc2;
WINDOWPOS *winpos = (WINDOWPOS *)lparam;
trace("main: WM_WINDOWPOSCHANGED\n");
trace("%p after %p, x %d, y %d, cx %d, cy %d flags %08x\n",
winpos->hwnd, winpos->hwndInsertAfter,
winpos->x, winpos->y, winpos->cx, winpos->cy, winpos->flags);
ok(winpos->x >= -32768 && winpos->x <= 32767, "bad winpos->x %d\n", winpos->x);
ok(winpos->y >= -32768 && winpos->y <= 32767, "bad winpos->y %d\n", winpos->y);
ok(winpos->cx >= 0 && winpos->cx <= 32767, "bad winpos->cx %d\n", winpos->cx);
ok(winpos->cy >= 0 && winpos->cy <= 32767, "bad winpos->cy %d\n", winpos->cy);
GetWindowRect(hwnd, &rc1);
trace("window: (%ld,%ld)-(%ld,%ld)\n", rc1.left, rc1.top, rc1.right, rc1.bottom);
SetRect(&rc2, winpos->x, winpos->y, winpos->x + winpos->cx, winpos->y + winpos->cy);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -