2 * PROJECT: ReactOS API tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for DeferWindowPos function family
5 * PROGRAMMERS: Thomas Faber <thomas.faber@reactos.org>
11 #include <undocuser.h>
13 #include <user32testhelpers.h>
15 HWND hWnd1
, hWnd2
, hWnd3
, hWnd4
;
17 /* FIXME: test for HWND_TOP, etc...*/
18 static int get_iwnd(HWND hWnd
)
20 if(hWnd
== hWnd1
) return 1;
21 else if(hWnd
== hWnd2
) return 2;
22 else if(hWnd
== hWnd3
) return 3;
23 else if(hWnd
== hWnd4
) return 4;
27 LRESULT CALLBACK
DWPTestProc(HWND hWnd
, UINT message
, WPARAM wParam
, LPARAM lParam
)
29 int iwnd
= get_iwnd(hWnd
);
31 if(message
> WM_USER
|| !iwnd
|| IsDWmMsg(message
) || IseKeyMsg(message
))
32 return DefWindowProc(hWnd
, message
, wParam
, lParam
);
36 case WM_IME_SETCONTEXT
:
41 case WM_WINDOWPOSCHANGING
:
42 case WM_WINDOWPOSCHANGED
:
44 WINDOWPOS
* pwp
= (WINDOWPOS
*)lParam
;
45 ok(wParam
==0,"expected wParam=0\n");
46 RECORD_MESSAGE(iwnd
, message
, SENT
, get_iwnd(pwp
->hwndInsertAfter
), pwp
->flags
);
50 RECORD_MESSAGE(iwnd
, message
, SENT
, 0,0);
52 return DefWindowProc(hWnd
, message
, wParam
, lParam
);
55 static void FlushMessages()
59 while (PeekMessage( &msg
, 0, 0, 0, PM_REMOVE
))
61 int iwnd
= get_iwnd(msg
.hwnd
);
62 if(!(msg
.message
> WM_USER
|| !iwnd
|| IsDWmMsg(msg
.message
) || IseKeyMsg(msg
.message
)))
63 RECORD_MESSAGE(iwnd
, msg
.message
, POST
,0,0);
64 DispatchMessageA( &msg
);
68 /* unfortunately sometimes MSCTF windows get between the expected chain of windows
69 so just checking the next window does not work*/
70 static BOOL
IsNext(HWND hWnd1
, HWND hWnd2
)
75 while((hWndNext
= GetWindow(hWndNext
,GW_HWNDNEXT
)))
85 #define EXPECT_NEXT(hWnd1, hWnd2) \
86 ok(IsNext(hWnd1, hWnd2), \
87 "After hwnd%d, expected hwnd%d not hwnd%d\n", \
88 get_iwnd(hWnd1), get_iwnd(hWnd2),get_iwnd(GetWindow(hWnd1,GW_HWNDNEXT)) )
90 #define EXPECT_CHAIN(A,B,C,D) \
91 EXPECT_NEXT(hWnd##A, hWnd##B); \
92 EXPECT_NEXT(hWnd##B, hWnd##C); \
93 EXPECT_NEXT(hWnd##C, hWnd##D);
95 #define ok_windowpos(hwnd, x, y, w, h, wnd) do { RECT rt; GetWindowRect(hwnd, &rt); \
96 ok(rt.left == (x) && rt.top == (y) && rt.right == (x)+(w) && rt.bottom == (y)+(h), \
97 "Unexpected %s position: (%ld, %ld) - (%ld, %ld)\n", wnd, rt.left, rt.top, rt.right, rt.bottom); } while (0)
99 #define ok_lasterr(err, s) ok(GetLastError() == (err), "%s error = %lu\n", s, GetLastError())
101 static void set_default_pos()
103 SetWindowPos(hWnd1
, 0, 10,20,200,210, SWP_NOOWNERZORDER
|SWP_SHOWWINDOW
|SWP_NOACTIVATE
);
104 SetWindowPos(hWnd2
, 0, 30,40,220,230, SWP_NOOWNERZORDER
|SWP_SHOWWINDOW
|SWP_NOACTIVATE
);
105 SetWindowPos(hWnd3
, 0, 20,350,300,300, SWP_NOOWNERZORDER
|SWP_SHOWWINDOW
|SWP_NOACTIVATE
);
106 SetWindowPos(hWnd4
, 0, 250,250,200,200, SWP_NOOWNERZORDER
|SWP_SHOWWINDOW
|SWP_NOACTIVATE
);
107 SetActiveWindow(hWnd4
);
112 static void Test_DWP_Error(HWND hWnd
, HWND hWnd2
)
117 ok_windowpos(hWnd1
, 10, 20, 200, 210, "Window 1");
118 ok_windowpos(hWnd2
, 30, 40, 220, 230, "Window 2");
120 /* close invalid handles */
121 SetLastError(DNS_ERROR_RCODE_NXRRSET
);
122 ret
= EndDeferWindowPos(NULL
);
123 ok(ret
== 0, "EndDeferWindowPos succeeded with invalid handle\n");
124 ok_lasterr(ERROR_INVALID_DWP_HANDLE
, "EndDeferWindowPos");
126 SetLastError(DNS_ERROR_RCODE_NXRRSET
);
127 ret
= EndDeferWindowPos((HDWP
)-1);
128 ok(ret
== 0, "EndDeferWindowPos succeeded with invalid handle\n");
129 ok_lasterr(ERROR_INVALID_DWP_HANDLE
, "EndDeferWindowPos");
131 /* negative window count */
132 SetLastError(DNS_ERROR_RCODE_NXRRSET
);
133 hDwp
= BeginDeferWindowPos(-1);
134 ok(hDwp
== NULL
, "BeginDeferWindowPos failed\n");
135 ok_lasterr(ERROR_INVALID_PARAMETER
, "BeginDeferWindowPos");
138 SetLastError(DNS_ERROR_RCODE_NXRRSET
);
139 hDwp
= BeginDeferWindowPos(0);
140 ok(hDwp
!= NULL
, "BeginDeferWindowPos failed\n");
141 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "BeginDeferWindowPos");
142 ret
= EndDeferWindowPos(hDwp
);
143 ok(ret
!= 0, "EndDeferWindowPos failed\n");
144 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "EndDeferWindowPos");
146 /* more windows than expected */
147 SetLastError(DNS_ERROR_RCODE_NXRRSET
);
148 hDwp
= BeginDeferWindowPos(0);
149 ok(hDwp
!= NULL
, "BeginDeferWindowPos failed\n");
150 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "BeginDeferWindowPos");
151 hDwp
= DeferWindowPos(hDwp
, hWnd
, NULL
, 0, 0, 0, 0, SWP_NOMOVE
| SWP_NOSIZE
| SWP_NOZORDER
);
152 ok(hDwp
!= NULL
, "DeferWindowPos failed\n");
153 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "DeferWindowPos");
154 ret
= EndDeferWindowPos(hDwp
);
155 ok(ret
!= 0, "EndDeferWindowPos failed\n");
156 ok(GetLastError() == ERROR_SUCCESS
/* win7 sp1/x64 */
157 || GetLastError() == ERROR_INVALID_WINDOW_HANDLE
/* 2k3 sp1/x86 */,
158 "EndDeferWindowPos error = %lu\n", GetLastError());
159 ok_windowpos(hWnd
, 10, 20, 200, 210, "Window 1");
161 /* more windows than expected 2 */
162 SetLastError(DNS_ERROR_RCODE_NXRRSET
);
163 hDwp
= BeginDeferWindowPos(1);
164 ok(hDwp
!= NULL
, "BeginDeferWindowPos failed\n");
165 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "BeginDeferWindowPos");
166 hDwp
= DeferWindowPos(hDwp
, hWnd
, NULL
, 30, 20, 190, 195, SWP_NOZORDER
);
167 ok(hDwp
!= NULL
, "DeferWindowPos failed\n");
168 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "DeferWindowPos");
169 hDwp
= DeferWindowPos(hDwp
, hWnd2
, NULL
, 20, 30, 195, 190, SWP_NOZORDER
);
170 ok(hDwp
!= NULL
, "DeferWindowPos failed\n");
171 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "DeferWindowPos");
172 ret
= EndDeferWindowPos(hDwp
);
173 ok(ret
!= 0, "EndDeferWindowPos failed\n");
174 ok_lasterr(ERROR_SUCCESS
, "EndDeferWindowPos");
175 ok_windowpos(hWnd
, 30, 20, 190, 195, "Window 1");
176 ok_windowpos(hWnd2
, 20, 30, 195, 190, "Window 2");
178 /* fewer windows than expected */
179 MoveWindow(hWnd
, 10, 20, 200, 210, FALSE
);
180 SetLastError(DNS_ERROR_RCODE_NXRRSET
);
181 hDwp
= BeginDeferWindowPos(2);
182 ok(hDwp
!= NULL
, "BeginDeferWindowPos failed\n");
183 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "BeginDeferWindowPos");
184 hDwp
= DeferWindowPos(hDwp
, hWnd
, NULL
, 20, 10, 210, 200, SWP_NOMOVE
| SWP_NOSIZE
| SWP_NOZORDER
);
185 ok(hDwp
!= NULL
, "DeferWindowPos failed\n");
186 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "DeferWindowPos");
187 ret
= EndDeferWindowPos(hDwp
);
188 ok(ret
!= 0, "EndDeferWindowPos failed\n");
189 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "EndDeferWindowPos");
190 ok_windowpos(hWnd
, 10, 20, 200, 210, "Window 1");
192 /* no operation, 1 window */
193 SetLastError(DNS_ERROR_RCODE_NXRRSET
);
194 hDwp
= BeginDeferWindowPos(1);
195 ok(hDwp
!= NULL
, "BeginDeferWindowPos failed\n");
196 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "BeginDeferWindowPos");
197 hDwp
= DeferWindowPos(hDwp
, hWnd
, NULL
, 20, 10, 210, 200, SWP_NOMOVE
| SWP_NOSIZE
| SWP_NOZORDER
);
198 ok(hDwp
!= NULL
, "DeferWindowPos failed\n");
199 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "DeferWindowPos");
200 ret
= EndDeferWindowPos(hDwp
);
201 ok(ret
!= 0, "EndDeferWindowPos failed\n");
202 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "EndDeferWindowPos");
203 ok_windowpos(hWnd
, 10, 20, 200, 210, "Window 1");
205 /* same window twice */
206 SetLastError(DNS_ERROR_RCODE_NXRRSET
);
207 hDwp
= BeginDeferWindowPos(2);
208 ok(hDwp
!= NULL
, "BeginDeferWindowPos failed\n");
209 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "BeginDeferWindowPos");
210 hDwp
= DeferWindowPos(hDwp
, hWnd
, NULL
, 80, 90, 220, 210, SWP_NOZORDER
);
211 ok(hDwp
!= NULL
, "DeferWindowPos failed\n");
212 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "DeferWindowPos");
213 hDwp
= DeferWindowPos(hDwp
, hWnd
, NULL
, 100, 110, 230, 250, SWP_NOZORDER
);
214 ok(hDwp
!= NULL
, "DeferWindowPos failed\n");
215 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "DeferWindowPos");
216 ret
= EndDeferWindowPos(hDwp
);
217 ok(ret
!= 0, "EndDeferWindowPos failed\n");
218 ok_lasterr(ERROR_SUCCESS
, "EndDeferWindowPos");
219 ok_windowpos(hWnd
, 100, 110, 230, 250, "Window 1");
221 /* move & resize operation, 1 window */
222 SetLastError(DNS_ERROR_RCODE_NXRRSET
);
223 hDwp
= BeginDeferWindowPos(1);
224 ok(hDwp
!= NULL
, "BeginDeferWindowPos failed\n");
225 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "BeginDeferWindowPos");
226 hDwp
= DeferWindowPos(hDwp
, hWnd
, NULL
, 20, 10, 210, 200, SWP_NOZORDER
);
227 ok(hDwp
!= NULL
, "DeferWindowPos failed\n");
228 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "DeferWindowPos");
229 ret
= EndDeferWindowPos(hDwp
);
230 ok(ret
!= 0, "EndDeferWindowPos failed\n");
231 ok_lasterr(ERROR_SUCCESS
, "EndDeferWindowPos");
232 ok_windowpos(hWnd
, 20, 10, 210, 200, "Window 1");
234 /* move & resize operation, 2 windows */
235 SetLastError(DNS_ERROR_RCODE_NXRRSET
);
236 hDwp
= BeginDeferWindowPos(2);
237 ok(hDwp
!= NULL
, "BeginDeferWindowPos failed\n");
238 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "BeginDeferWindowPos");
239 hDwp
= DeferWindowPos(hDwp
, hWnd
, NULL
, 50, 60, 230, 240, SWP_NOZORDER
);
240 ok(hDwp
!= NULL
, "DeferWindowPos failed\n");
241 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "DeferWindowPos");
242 hDwp
= DeferWindowPos(hDwp
, hWnd2
, NULL
, 70, 80, 250, 260, SWP_NOZORDER
);
243 ok(hDwp
!= NULL
, "DeferWindowPos failed\n");
244 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "DeferWindowPos");
245 ret
= EndDeferWindowPos(hDwp
);
246 ok(ret
!= 0, "EndDeferWindowPos failed\n");
247 ok_lasterr(ERROR_SUCCESS
, "EndDeferWindowPos");
248 ok_windowpos(hWnd
, 50, 60, 230, 240, "Window 1");
249 ok_windowpos(hWnd2
, 70, 80, 250, 260, "Window 2");
255 MSG_ENTRY move1_chain
[]={
256 {1,WM_WINDOWPOSCHANGING
, SENT
, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
},
257 {1,WM_GETMINMAXINFO
},
258 {1,WM_WINDOWPOSCHANGED
, SENT
, 0, SWP_NOSIZE
| SWP_NOACTIVATE
|SWP_NOOWNERZORDER
| SWP_NOCLIENTSIZE
},
262 MSG_ENTRY resize1_chain
[]={
263 {1,WM_WINDOWPOSCHANGING
, SENT
, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
},
264 {1,WM_GETMINMAXINFO
},
266 {1,WM_WINDOWPOSCHANGED
, SENT
, 0, SWP_NOMOVE
| SWP_NOZORDER
| SWP_NOACTIVATE
|SWP_NOOWNERZORDER
| SWP_NOCLIENTMOVE
},
271 MSG_ENTRY move1_2_chain
[]={
272 {1,WM_WINDOWPOSCHANGING
, SENT
, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
},
273 {1,WM_GETMINMAXINFO
},
274 {2,WM_WINDOWPOSCHANGING
, SENT
, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
},
275 {2,WM_GETMINMAXINFO
},
276 {1,WM_WINDOWPOSCHANGED
, SENT
, 0, SWP_NOSIZE
| SWP_NOZORDER
| SWP_NOACTIVATE
|SWP_NOOWNERZORDER
| SWP_NOCLIENTSIZE
},
278 {2,WM_WINDOWPOSCHANGED
, SENT
, 0, SWP_NOSIZE
| SWP_NOACTIVATE
|SWP_NOOWNERZORDER
| SWP_NOCLIENTSIZE
},
283 MSG_ENTRY ZOrder1_chain
[]={
284 {1,WM_WINDOWPOSCHANGING
, SENT
, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOMOVE
|SWP_NOSIZE
},
285 {1,WM_WINDOWPOSCHANGED
, SENT
, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOMOVE
|SWP_NOSIZE
| SWP_NOCLIENTMOVE
|SWP_NOCLIENTSIZE
},
288 MSG_ENTRY ZOrder1and2_chain
[]={
289 {1,WM_WINDOWPOSCHANGING
, SENT
, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOMOVE
|SWP_NOSIZE
},
290 {2,WM_WINDOWPOSCHANGING
, SENT
, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOMOVE
|SWP_NOSIZE
},
291 {1,WM_WINDOWPOSCHANGED
, SENT
, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOMOVE
|SWP_NOSIZE
| SWP_NOCLIENTMOVE
|SWP_NOCLIENTSIZE
},
292 {2,WM_WINDOWPOSCHANGED
, SENT
, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOMOVE
|SWP_NOSIZE
| SWP_NOCLIENTMOVE
|SWP_NOCLIENTSIZE
},
295 static void Test_DWP_SimpleMsg(HWND hWnd1
, HWND hWnd2
)
300 SetWindowPos(hWnd1
, 0, 10,20,100,100,0);
301 SetWindowPos(hWnd2
, 0, 10,20,100,100,0);
306 hdwp
= BeginDeferWindowPos(1);
307 ok(hdwp
!= NULL
, "BeginDeferWindowPos failed\n");
308 hdwp
= DeferWindowPos(hdwp
, hWnd1
, HWND_TOP
, 20, 30, 100, 100, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
);
309 ok(hdwp
!= NULL
, "DeferWindowPos failed\n");
311 COMPARE_CACHE(empty_chain
);
312 ret
= EndDeferWindowPos(hdwp
);
313 ok(ret
!= 0, "EndDeferWindowPos failed\n");
315 COMPARE_CACHE(move1_chain
);
318 hdwp
= BeginDeferWindowPos(1);
319 ok(hdwp
!= NULL
, "BeginDeferWindowPos failed\n");
320 hdwp
= DeferWindowPos(hdwp
, hWnd1
, HWND_TOP
, 20, 30, 110, 110, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
);
321 ok(hdwp
!= NULL
, "DeferWindowPos failed\n");
323 COMPARE_CACHE(empty_chain
);
324 ret
= EndDeferWindowPos(hdwp
);
325 ok(ret
!= 0, "EndDeferWindowPos failed\n");
327 COMPARE_CACHE(resize1_chain
);
329 /* move both windows */
330 hdwp
= BeginDeferWindowPos(1);
331 ok(hdwp
!= NULL
, "BeginDeferWindowPos failed\n");
332 hdwp
= DeferWindowPos(hdwp
, hWnd1
, HWND_TOP
, 30, 40, 110, 110, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
);
333 ok(hdwp
!= NULL
, "DeferWindowPos failed\n");
334 hdwp
= DeferWindowPos(hdwp
, hWnd2
, HWND_TOP
, 30, 40, 100, 100, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
);
335 ok(hdwp
!= NULL
, "DeferWindowPos failed\n");
337 COMPARE_CACHE(empty_chain
);
338 ret
= EndDeferWindowPos(hdwp
);
339 ok(ret
!= 0, "EndDeferWindowPos failed\n");
341 COMPARE_CACHE(move1_2_chain
);
343 /* change the z-order of the first window */
344 hdwp
= BeginDeferWindowPos(1);
345 ok(hdwp
!= NULL
, "BeginDeferWindowPos failed\n");
346 hdwp
= DeferWindowPos(hdwp
, hWnd1
, HWND_BOTTOM
, 0, 0, 0, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOMOVE
|SWP_NOSIZE
);
347 ok(hdwp
!= NULL
, "DeferWindowPos failed\n");
349 COMPARE_CACHE(empty_chain
);
350 ret
= EndDeferWindowPos(hdwp
);
351 ok(ret
!= 0, "EndDeferWindowPos failed\n");
353 COMPARE_CACHE(ZOrder1_chain
);
355 /* change the z-order of both windows */
356 hdwp
= BeginDeferWindowPos(2);
357 ok(hdwp
!= NULL
, "BeginDeferWindowPos failed\n");
358 hdwp
= DeferWindowPos(hdwp
, hWnd1
, HWND_TOP
, 0, 0, 0, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOMOVE
|SWP_NOSIZE
);
359 ok(hdwp
!= NULL
, "DeferWindowPos failed\n");
360 hdwp
= DeferWindowPos(hdwp
, hWnd2
, HWND_BOTTOM
, 0, 0, 0, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOMOVE
|SWP_NOSIZE
);
361 ok(hdwp
!= NULL
, "DeferWindowPos failed\n");
363 COMPARE_CACHE(empty_chain
);
364 ret
= EndDeferWindowPos(hdwp
);
365 ok(ret
!= 0, "EndDeferWindowPos failed\n");
367 COMPARE_CACHE(ZOrder1and2_chain
);
371 #define OwnerZOrderAParams SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOSIZE
373 MSG_ENTRY OwnerZOrder1A_chain
[]={
374 {4,WM_WINDOWPOSCHANGING
, SENT
,0, OwnerZOrderAParams
},
375 {3,WM_WINDOWPOSCHANGING
, SENT
,4, OwnerZOrderAParams
},
376 {1,WM_WINDOWPOSCHANGING
, SENT
,3, OwnerZOrderAParams
},
379 MSG_ENTRY OwnerZOrder2A_chain
[]={
380 {2,WM_WINDOWPOSCHANGING
, SENT
, 0, OwnerZOrderAParams
},
381 {2,WM_WINDOWPOSCHANGED
, SENT
, 0, OwnerZOrderAParams
| SWP_NOCLIENTMOVE
|SWP_NOCLIENTSIZE
},
384 MSG_ENTRY OwnerZOrder3A_chain
[]={
385 {3,WM_WINDOWPOSCHANGING
, SENT
, 0, OwnerZOrderAParams
},
386 {4,WM_WINDOWPOSCHANGING
, SENT
, 0, OwnerZOrderAParams
},
387 {1,WM_WINDOWPOSCHANGING
, SENT
, 4, OwnerZOrderAParams
},
388 {3,WM_WINDOWPOSCHANGED
, SENT
, 0, OwnerZOrderAParams
|SWP_NOCLIENTMOVE
|SWP_NOCLIENTSIZE
},
389 {4,WM_WINDOWPOSCHANGED
, SENT
, 0, OwnerZOrderAParams
|SWP_NOCLIENTMOVE
|SWP_NOCLIENTSIZE
},
390 {1,WM_WINDOWPOSCHANGED
, SENT
, 4, OwnerZOrderAParams
|SWP_NOCLIENTMOVE
|SWP_NOCLIENTSIZE
},
393 MSG_ENTRY OwnerZOrder4A_chain
[]={
394 {3,WM_WINDOWPOSCHANGING
, SENT
, 0 ,OwnerZOrderAParams
},
395 {4,WM_WINDOWPOSCHANGING
, SENT
, 0, OwnerZOrderAParams
} ,
396 {1,WM_WINDOWPOSCHANGING
, SENT
, 4, OwnerZOrderAParams
},
399 MSG_ENTRY OwnerZOrder5A_chain
[]={
400 {4,WM_WINDOWPOSCHANGING
, SENT
, 0, OwnerZOrderAParams
},
401 {3,WM_WINDOWPOSCHANGING
, SENT
, 4, OwnerZOrderAParams
},
402 {1,WM_WINDOWPOSCHANGING
, SENT
, 3, OwnerZOrderAParams
},
403 {4,WM_WINDOWPOSCHANGED
, SENT
, 0, OwnerZOrderAParams
|SWP_NOCLIENTMOVE
|SWP_NOCLIENTSIZE
},
406 #define OwnerZOrderBParams SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOOWNERZORDER
408 MSG_ENTRY OwnerZOrder1B_chain
[]={
409 {1,WM_WINDOWPOSCHANGING
, SENT
, 0, OwnerZOrderBParams
},
410 {1,WM_WINDOWPOSCHANGED
, SENT
, 0, OwnerZOrderBParams
| SWP_NOCLIENTMOVE
|SWP_NOCLIENTSIZE
},
413 MSG_ENTRY OwnerZOrder2B_chain
[]={
414 {2,WM_WINDOWPOSCHANGING
, SENT
, 0, OwnerZOrderBParams
},
415 {2,WM_WINDOWPOSCHANGED
, SENT
, 0, OwnerZOrderBParams
| SWP_NOCLIENTMOVE
|SWP_NOCLIENTSIZE
},
418 MSG_ENTRY OwnerZOrder3B_chain
[]={
419 {3,WM_WINDOWPOSCHANGING
, SENT
, 0, OwnerZOrderBParams
},
420 {3,WM_WINDOWPOSCHANGED
, SENT
, 0, OwnerZOrderBParams
| SWP_NOCLIENTMOVE
|SWP_NOCLIENTSIZE
},
423 MSG_ENTRY OwnerZOrder4B_chain
[]={
424 {1,WM_WINDOWPOSCHANGING
, SENT
, 0, OwnerZOrderBParams
},
425 {1,WM_WINDOWPOSCHANGED
, SENT
, 0, OwnerZOrderBParams
| SWP_NOCLIENTMOVE
|SWP_NOCLIENTSIZE
},
428 MSG_ENTRY OwnerZOrder5B_chain
[]={
429 {4,WM_WINDOWPOSCHANGING
, SENT
, 0, OwnerZOrderBParams
},
430 {4,WM_WINDOWPOSCHANGED
, SENT
, 0, OwnerZOrderBParams
| SWP_NOCLIENTMOVE
|SWP_NOCLIENTSIZE
},
433 static void Test_DWP_OwnerZOrder()
435 EXPECT_CHAIN(4,3,1,2);
437 /* test how SetWindowPos can change the z order of owner windows */
438 /* note that SWP_NOACTIVATE must be used because otherwise
439 SetWindowPos will call SetWindowPos again with different parameters */
440 SetWindowPos(hWnd1
, 0, 0,0,0,0, OwnerZOrderAParams
);
442 COMPARE_CACHE(OwnerZOrder1A_chain
);
443 EXPECT_CHAIN(4,3,1,2);
445 SetWindowPos(hWnd2
, 0, 0,0,0,0, OwnerZOrderAParams
);
447 COMPARE_CACHE(OwnerZOrder2A_chain
);
448 EXPECT_CHAIN(2,4,3,1);
450 SetWindowPos(hWnd3
, 0, 0,0,0,0, OwnerZOrderAParams
);
452 COMPARE_CACHE(OwnerZOrder3A_chain
);
453 EXPECT_CHAIN(3,4,1,2);
455 SetWindowPos(hWnd1
, 0, 0,0,0,0, OwnerZOrderAParams
);
457 COMPARE_CACHE(OwnerZOrder4A_chain
);
458 EXPECT_CHAIN(3,4,1,2);
460 SetWindowPos(hWnd4
, 0, 0,0,0,0, OwnerZOrderAParams
);
462 COMPARE_CACHE(OwnerZOrder5A_chain
);
463 EXPECT_CHAIN(4,3,1,2);
465 /* now do the same thing one more time with SWP_NOOWNERZORDER */
466 /* SWP_NOACTIVATE is needed because without it SetActiveWindow
467 will be calledit and it will call SetWindowPos again
468 WITHOUT SWP_NOOWNERZORDER. that means that
469 in order for SWP_NOOWNERZORDER to have effect we have to use
470 SWP_NOACTIVATE as well */
472 EXPECT_CHAIN(4,3,2,1);
474 SetWindowPos(hWnd1
, 0, 0,0,0,0, OwnerZOrderBParams
);
476 COMPARE_CACHE(OwnerZOrder1B_chain
);
477 EXPECT_CHAIN(1,4,3,2);
479 SetWindowPos(hWnd2
, 0, 0,0,0,0, OwnerZOrderBParams
);
481 COMPARE_CACHE(OwnerZOrder2B_chain
);
482 EXPECT_CHAIN(2,1,4,3);
484 SetWindowPos(hWnd3
, 0, 0,0,0,0, OwnerZOrderBParams
);
486 COMPARE_CACHE(OwnerZOrder3B_chain
);
487 EXPECT_CHAIN(3,2,1,4);
489 SetWindowPos(hWnd1
, 0, 0,0,0,0, OwnerZOrderBParams
);
491 COMPARE_CACHE(OwnerZOrder4B_chain
);
492 EXPECT_CHAIN(1,3,2,4);
494 SetWindowPos(hWnd4
, 0, 0,0,0,0, OwnerZOrderBParams
);
496 COMPARE_CACHE(OwnerZOrder5B_chain
);
497 EXPECT_CHAIN(4,1,3,2);
501 START_TEST(DeferWindowPos
)
505 RegisterSimpleClass(DWPTestProc
, L
"ownertest");
506 hWnd1
= CreateWindowExW(0, L
"ownertest", L
"abc", 0, 10, 20,
507 200, 210, NULL
, NULL
, 0, NULL
);
508 hWnd2
= CreateWindowExW(0, L
"ownertest", L
"def", 0, 30, 40,
509 220, 230, NULL
, NULL
, 0, NULL
);
510 hWnd3
= CreateWindowW(L
"ownertest", L
"ownertest", WS_OVERLAPPEDWINDOW
,
511 20, 350, 300, 300, hWnd1
, NULL
, 0, NULL
);
512 hWnd4
= CreateWindowW(L
"ownertest", L
"ownertest", WS_OVERLAPPEDWINDOW
,
513 250, 250, 200, 200, hWnd1
, NULL
, 0, NULL
);
515 ok(hWnd1
!= NULL
, "CreateWindow failed\n");
516 ok(hWnd2
!= NULL
, "CreateWindow failed\n");
517 ok(hWnd3
!= NULL
, "CreateWindow failed\n");
518 ok(hWnd4
!= NULL
, "CreateWindow failed\n");
521 Test_DWP_Error(hWnd1
, hWnd2
);
524 Test_DWP_SimpleMsg(hWnd1
, hWnd2
);
527 Test_DWP_OwnerZOrder();
529 DestroyWindow(hWnd4
);
530 DestroyWindow(hWnd3
);
531 DestroyWindow(hWnd2
);
532 DestroyWindow(hWnd1
);