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>
12 #include <undocuser.h>
14 HWND hWnd1
, hWnd2
, hWnd3
, hWnd4
;
16 /* FIXME: test for HWND_TOP, etc...*/
17 static int get_iwnd(HWND hWnd
)
19 if(hWnd
== hWnd1
) return 1;
20 else if(hWnd
== hWnd2
) return 2;
21 else if(hWnd
== hWnd3
) return 3;
22 else if(hWnd
== hWnd4
) return 4;
26 LRESULT CALLBACK
DWPTestProc(HWND hWnd
, UINT message
, WPARAM wParam
, LPARAM lParam
)
28 int iwnd
= get_iwnd(hWnd
);
30 if(message
> WM_USER
|| !iwnd
|| IsDWmMsg(message
) || IseKeyMsg(message
))
31 return DefWindowProc(hWnd
, message
, wParam
, lParam
);
35 case WM_IME_SETCONTEXT
:
40 case WM_WINDOWPOSCHANGING
:
41 case WM_WINDOWPOSCHANGED
:
43 WINDOWPOS
* pwp
= (WINDOWPOS
*)lParam
;
44 ok(wParam
==0,"expected wParam=0\n");
45 RECORD_MESSAGE(iwnd
, message
, SENT
, get_iwnd(pwp
->hwndInsertAfter
), pwp
->flags
);
49 RECORD_MESSAGE(iwnd
, message
, SENT
, 0,0);
51 return DefWindowProc(hWnd
, message
, wParam
, lParam
);
54 static void FlushMessages()
58 while (PeekMessage( &msg
, 0, 0, 0, PM_REMOVE
))
60 int iwnd
= get_iwnd(msg
.hwnd
);
61 if(!(msg
.message
> WM_USER
|| !iwnd
|| IsDWmMsg(msg
.message
) || IseKeyMsg(msg
.message
)))
62 RECORD_MESSAGE(iwnd
, msg
.message
, POST
,0,0);
63 DispatchMessageA( &msg
);
67 /* unfortunately sometimes MSCTF windows get between the expected chain of windows
68 so just checking the next window does not work*/
69 static BOOL
IsNext(HWND hWnd1
, HWND hWnd2
)
74 while((hWndNext
= GetWindow(hWndNext
,GW_HWNDNEXT
)))
84 #define EXPECT_NEXT(hWnd1, hWnd2) \
85 ok(IsNext(hWnd1, hWnd2), \
86 "After hwnd%d, expected hwnd%d not hwnd%d\n", \
87 get_iwnd(hWnd1), get_iwnd(hWnd2),get_iwnd(GetWindow(hWnd1,GW_HWNDNEXT)) )
89 #define EXPECT_CHAIN(A,B,C,D) \
90 EXPECT_NEXT(hWnd##A, hWnd##B); \
91 EXPECT_NEXT(hWnd##B, hWnd##C); \
92 EXPECT_NEXT(hWnd##C, hWnd##D);
94 #define ok_windowpos(hwnd, x, y, w, h, wnd) do { RECT rt; GetWindowRect(hwnd, &rt); \
95 ok(rt.left == (x) && rt.top == (y) && rt.right == (x)+(w) && rt.bottom == (y)+(h), \
96 "Unexpected %s position: (%ld, %ld) - (%ld, %ld)\n", wnd, rt.left, rt.top, rt.right, rt.bottom); } while (0)
98 #define ok_lasterr(err, s) ok(GetLastError() == (err), "%s error = %lu\n", s, GetLastError())
100 static void set_default_pos()
102 SetWindowPos(hWnd1
, 0, 10,20,200,210, SWP_NOOWNERZORDER
|SWP_SHOWWINDOW
|SWP_NOACTIVATE
);
103 SetWindowPos(hWnd2
, 0, 30,40,220,230, SWP_NOOWNERZORDER
|SWP_SHOWWINDOW
|SWP_NOACTIVATE
);
104 SetWindowPos(hWnd3
, 0, 20,350,300,300, SWP_NOOWNERZORDER
|SWP_SHOWWINDOW
|SWP_NOACTIVATE
);
105 SetWindowPos(hWnd4
, 0, 250,250,200,200, SWP_NOOWNERZORDER
|SWP_SHOWWINDOW
|SWP_NOACTIVATE
);
106 SetActiveWindow(hWnd4
);
111 static void Test_DWP_Error(HWND hWnd
, HWND hWnd2
)
116 ok_windowpos(hWnd1
, 10, 20, 200, 210, "Window 1");
117 ok_windowpos(hWnd2
, 30, 40, 220, 230, "Window 2");
119 /* close invalid handles */
120 SetLastError(DNS_ERROR_RCODE_NXRRSET
);
121 ret
= EndDeferWindowPos(NULL
);
122 ok(ret
== 0, "EndDeferWindowPos succeeded with invalid handle\n");
123 ok_lasterr(ERROR_INVALID_DWP_HANDLE
, "EndDeferWindowPos");
125 SetLastError(DNS_ERROR_RCODE_NXRRSET
);
126 ret
= EndDeferWindowPos((HDWP
)-1);
127 ok(ret
== 0, "EndDeferWindowPos succeeded with invalid handle\n");
128 ok_lasterr(ERROR_INVALID_DWP_HANDLE
, "EndDeferWindowPos");
130 /* negative window count */
131 SetLastError(DNS_ERROR_RCODE_NXRRSET
);
132 hDwp
= BeginDeferWindowPos(-1);
133 ok(hDwp
== NULL
, "BeginDeferWindowPos failed\n");
134 ok_lasterr(ERROR_INVALID_PARAMETER
, "BeginDeferWindowPos");
137 SetLastError(DNS_ERROR_RCODE_NXRRSET
);
138 hDwp
= BeginDeferWindowPos(0);
139 ok(hDwp
!= NULL
, "BeginDeferWindowPos failed\n");
140 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "BeginDeferWindowPos");
141 ret
= EndDeferWindowPos(hDwp
);
142 ok(ret
!= 0, "EndDeferWindowPos failed\n");
143 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "EndDeferWindowPos");
145 /* more windows than expected */
146 SetLastError(DNS_ERROR_RCODE_NXRRSET
);
147 hDwp
= BeginDeferWindowPos(0);
148 ok(hDwp
!= NULL
, "BeginDeferWindowPos failed\n");
149 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "BeginDeferWindowPos");
150 hDwp
= DeferWindowPos(hDwp
, hWnd
, NULL
, 0, 0, 0, 0, SWP_NOMOVE
| SWP_NOSIZE
| SWP_NOZORDER
);
151 ok(hDwp
!= NULL
, "DeferWindowPos failed\n");
152 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "DeferWindowPos");
153 ret
= EndDeferWindowPos(hDwp
);
154 ok(ret
!= 0, "EndDeferWindowPos failed\n");
155 ok(GetLastError() == ERROR_SUCCESS
/* win7 sp1/x64 */
156 || GetLastError() == ERROR_INVALID_WINDOW_HANDLE
/* 2k3 sp1/x86 */,
157 "EndDeferWindowPos error = %lu\n", GetLastError());
158 ok_windowpos(hWnd
, 10, 20, 200, 210, "Window 1");
160 /* more windows than expected 2 */
161 SetLastError(DNS_ERROR_RCODE_NXRRSET
);
162 hDwp
= BeginDeferWindowPos(1);
163 ok(hDwp
!= NULL
, "BeginDeferWindowPos failed\n");
164 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "BeginDeferWindowPos");
165 hDwp
= DeferWindowPos(hDwp
, hWnd
, NULL
, 30, 20, 190, 195, SWP_NOZORDER
);
166 ok(hDwp
!= NULL
, "DeferWindowPos failed\n");
167 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "DeferWindowPos");
168 hDwp
= DeferWindowPos(hDwp
, hWnd2
, NULL
, 20, 30, 195, 190, SWP_NOZORDER
);
169 ok(hDwp
!= NULL
, "DeferWindowPos failed\n");
170 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "DeferWindowPos");
171 ret
= EndDeferWindowPos(hDwp
);
172 ok(ret
!= 0, "EndDeferWindowPos failed\n");
173 ok_lasterr(ERROR_SUCCESS
, "EndDeferWindowPos");
174 ok_windowpos(hWnd
, 30, 20, 190, 195, "Window 1");
175 ok_windowpos(hWnd2
, 20, 30, 195, 190, "Window 2");
177 /* fewer windows than expected */
178 MoveWindow(hWnd
, 10, 20, 200, 210, FALSE
);
179 SetLastError(DNS_ERROR_RCODE_NXRRSET
);
180 hDwp
= BeginDeferWindowPos(2);
181 ok(hDwp
!= NULL
, "BeginDeferWindowPos failed\n");
182 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "BeginDeferWindowPos");
183 hDwp
= DeferWindowPos(hDwp
, hWnd
, NULL
, 20, 10, 210, 200, SWP_NOMOVE
| SWP_NOSIZE
| SWP_NOZORDER
);
184 ok(hDwp
!= NULL
, "DeferWindowPos failed\n");
185 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "DeferWindowPos");
186 ret
= EndDeferWindowPos(hDwp
);
187 ok(ret
!= 0, "EndDeferWindowPos failed\n");
188 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "EndDeferWindowPos");
189 ok_windowpos(hWnd
, 10, 20, 200, 210, "Window 1");
191 /* no operation, 1 window */
192 SetLastError(DNS_ERROR_RCODE_NXRRSET
);
193 hDwp
= BeginDeferWindowPos(1);
194 ok(hDwp
!= NULL
, "BeginDeferWindowPos failed\n");
195 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "BeginDeferWindowPos");
196 hDwp
= DeferWindowPos(hDwp
, hWnd
, NULL
, 20, 10, 210, 200, SWP_NOMOVE
| SWP_NOSIZE
| SWP_NOZORDER
);
197 ok(hDwp
!= NULL
, "DeferWindowPos failed\n");
198 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "DeferWindowPos");
199 ret
= EndDeferWindowPos(hDwp
);
200 ok(ret
!= 0, "EndDeferWindowPos failed\n");
201 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "EndDeferWindowPos");
202 ok_windowpos(hWnd
, 10, 20, 200, 210, "Window 1");
204 /* same window twice */
205 SetLastError(DNS_ERROR_RCODE_NXRRSET
);
206 hDwp
= BeginDeferWindowPos(2);
207 ok(hDwp
!= NULL
, "BeginDeferWindowPos failed\n");
208 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "BeginDeferWindowPos");
209 hDwp
= DeferWindowPos(hDwp
, hWnd
, NULL
, 80, 90, 220, 210, SWP_NOZORDER
);
210 ok(hDwp
!= NULL
, "DeferWindowPos failed\n");
211 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "DeferWindowPos");
212 hDwp
= DeferWindowPos(hDwp
, hWnd
, NULL
, 100, 110, 230, 250, SWP_NOZORDER
);
213 ok(hDwp
!= NULL
, "DeferWindowPos failed\n");
214 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "DeferWindowPos");
215 ret
= EndDeferWindowPos(hDwp
);
216 ok(ret
!= 0, "EndDeferWindowPos failed\n");
217 ok_lasterr(ERROR_SUCCESS
, "EndDeferWindowPos");
218 ok_windowpos(hWnd
, 100, 110, 230, 250, "Window 1");
220 /* move & resize operation, 1 window */
221 SetLastError(DNS_ERROR_RCODE_NXRRSET
);
222 hDwp
= BeginDeferWindowPos(1);
223 ok(hDwp
!= NULL
, "BeginDeferWindowPos failed\n");
224 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "BeginDeferWindowPos");
225 hDwp
= DeferWindowPos(hDwp
, hWnd
, NULL
, 20, 10, 210, 200, SWP_NOZORDER
);
226 ok(hDwp
!= NULL
, "DeferWindowPos failed\n");
227 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "DeferWindowPos");
228 ret
= EndDeferWindowPos(hDwp
);
229 ok(ret
!= 0, "EndDeferWindowPos failed\n");
230 ok_lasterr(ERROR_SUCCESS
, "EndDeferWindowPos");
231 ok_windowpos(hWnd
, 20, 10, 210, 200, "Window 1");
233 /* move & resize operation, 2 windows */
234 SetLastError(DNS_ERROR_RCODE_NXRRSET
);
235 hDwp
= BeginDeferWindowPos(2);
236 ok(hDwp
!= NULL
, "BeginDeferWindowPos failed\n");
237 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "BeginDeferWindowPos");
238 hDwp
= DeferWindowPos(hDwp
, hWnd
, NULL
, 50, 60, 230, 240, SWP_NOZORDER
);
239 ok(hDwp
!= NULL
, "DeferWindowPos failed\n");
240 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "DeferWindowPos");
241 hDwp
= DeferWindowPos(hDwp
, hWnd2
, NULL
, 70, 80, 250, 260, SWP_NOZORDER
);
242 ok(hDwp
!= NULL
, "DeferWindowPos failed\n");
243 ok_lasterr(DNS_ERROR_RCODE_NXRRSET
, "DeferWindowPos");
244 ret
= EndDeferWindowPos(hDwp
);
245 ok(ret
!= 0, "EndDeferWindowPos failed\n");
246 ok_lasterr(ERROR_SUCCESS
, "EndDeferWindowPos");
247 ok_windowpos(hWnd
, 50, 60, 230, 240, "Window 1");
248 ok_windowpos(hWnd2
, 70, 80, 250, 260, "Window 2");
254 MSG_ENTRY move1_chain
[]={
255 {1,WM_WINDOWPOSCHANGING
, SENT
, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
},
256 {1,WM_GETMINMAXINFO
},
257 {1,WM_WINDOWPOSCHANGED
, SENT
, 0, SWP_NOSIZE
| SWP_NOACTIVATE
|SWP_NOOWNERZORDER
| SWP_NOCLIENTSIZE
},
261 MSG_ENTRY resize1_chain
[]={
262 {1,WM_WINDOWPOSCHANGING
, SENT
, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
},
263 {1,WM_GETMINMAXINFO
},
265 {1,WM_WINDOWPOSCHANGED
, SENT
, 0, SWP_NOMOVE
| SWP_NOZORDER
| SWP_NOACTIVATE
|SWP_NOOWNERZORDER
| SWP_NOCLIENTMOVE
},
270 MSG_ENTRY move1_2_chain
[]={
271 {1,WM_WINDOWPOSCHANGING
, SENT
, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
},
272 {1,WM_GETMINMAXINFO
},
273 {2,WM_WINDOWPOSCHANGING
, SENT
, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
},
274 {2,WM_GETMINMAXINFO
},
275 {1,WM_WINDOWPOSCHANGED
, SENT
, 0, SWP_NOSIZE
| SWP_NOZORDER
| SWP_NOACTIVATE
|SWP_NOOWNERZORDER
| SWP_NOCLIENTSIZE
},
277 {2,WM_WINDOWPOSCHANGED
, SENT
, 0, SWP_NOSIZE
| SWP_NOACTIVATE
|SWP_NOOWNERZORDER
| SWP_NOCLIENTSIZE
},
282 MSG_ENTRY ZOrder1_chain
[]={
283 {1,WM_WINDOWPOSCHANGING
, SENT
, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOMOVE
|SWP_NOSIZE
},
284 {1,WM_WINDOWPOSCHANGED
, SENT
, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOMOVE
|SWP_NOSIZE
| SWP_NOCLIENTMOVE
|SWP_NOCLIENTSIZE
},
287 MSG_ENTRY ZOrder1and2_chain
[]={
288 {1,WM_WINDOWPOSCHANGING
, SENT
, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOMOVE
|SWP_NOSIZE
},
289 {2,WM_WINDOWPOSCHANGING
, SENT
, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOMOVE
|SWP_NOSIZE
},
290 {1,WM_WINDOWPOSCHANGED
, SENT
, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOMOVE
|SWP_NOSIZE
| SWP_NOCLIENTMOVE
|SWP_NOCLIENTSIZE
},
291 {2,WM_WINDOWPOSCHANGED
, SENT
, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOMOVE
|SWP_NOSIZE
| SWP_NOCLIENTMOVE
|SWP_NOCLIENTSIZE
},
294 static void Test_DWP_SimpleMsg(HWND hWnd1
, HWND hWnd2
)
299 SetWindowPos(hWnd1
, 0, 10,20,100,100,0);
300 SetWindowPos(hWnd2
, 0, 10,20,100,100,0);
305 hdwp
= BeginDeferWindowPos(1);
306 ok(hdwp
!= NULL
, "BeginDeferWindowPos failed\n");
307 hdwp
= DeferWindowPos(hdwp
, hWnd1
, HWND_TOP
, 20, 30, 100, 100, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
);
308 ok(hdwp
!= NULL
, "DeferWindowPos failed\n");
310 COMPARE_CACHE(empty_chain
);
311 ret
= EndDeferWindowPos(hdwp
);
312 ok(ret
!= 0, "EndDeferWindowPos failed\n");
314 COMPARE_CACHE(move1_chain
);
317 hdwp
= BeginDeferWindowPos(1);
318 ok(hdwp
!= NULL
, "BeginDeferWindowPos failed\n");
319 hdwp
= DeferWindowPos(hdwp
, hWnd1
, HWND_TOP
, 20, 30, 110, 110, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
);
320 ok(hdwp
!= NULL
, "DeferWindowPos failed\n");
322 COMPARE_CACHE(empty_chain
);
323 ret
= EndDeferWindowPos(hdwp
);
324 ok(ret
!= 0, "EndDeferWindowPos failed\n");
326 COMPARE_CACHE(resize1_chain
);
328 /* move both windows */
329 hdwp
= BeginDeferWindowPos(1);
330 ok(hdwp
!= NULL
, "BeginDeferWindowPos failed\n");
331 hdwp
= DeferWindowPos(hdwp
, hWnd1
, HWND_TOP
, 30, 40, 110, 110, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
);
332 ok(hdwp
!= NULL
, "DeferWindowPos failed\n");
333 hdwp
= DeferWindowPos(hdwp
, hWnd2
, HWND_TOP
, 30, 40, 100, 100, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
);
334 ok(hdwp
!= NULL
, "DeferWindowPos failed\n");
336 COMPARE_CACHE(empty_chain
);
337 ret
= EndDeferWindowPos(hdwp
);
338 ok(ret
!= 0, "EndDeferWindowPos failed\n");
340 COMPARE_CACHE(move1_2_chain
);
342 /* change the z-order of the first window */
343 hdwp
= BeginDeferWindowPos(1);
344 ok(hdwp
!= NULL
, "BeginDeferWindowPos failed\n");
345 hdwp
= DeferWindowPos(hdwp
, hWnd1
, HWND_BOTTOM
, 0, 0, 0, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOMOVE
|SWP_NOSIZE
);
346 ok(hdwp
!= NULL
, "DeferWindowPos failed\n");
348 COMPARE_CACHE(empty_chain
);
349 ret
= EndDeferWindowPos(hdwp
);
350 ok(ret
!= 0, "EndDeferWindowPos failed\n");
352 COMPARE_CACHE(ZOrder1_chain
);
354 /* change the z-order of both windows */
355 hdwp
= BeginDeferWindowPos(2);
356 ok(hdwp
!= NULL
, "BeginDeferWindowPos failed\n");
357 hdwp
= DeferWindowPos(hdwp
, hWnd1
, HWND_TOP
, 0, 0, 0, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOMOVE
|SWP_NOSIZE
);
358 ok(hdwp
!= NULL
, "DeferWindowPos failed\n");
359 hdwp
= DeferWindowPos(hdwp
, hWnd2
, HWND_BOTTOM
, 0, 0, 0, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOMOVE
|SWP_NOSIZE
);
360 ok(hdwp
!= NULL
, "DeferWindowPos failed\n");
362 COMPARE_CACHE(empty_chain
);
363 ret
= EndDeferWindowPos(hdwp
);
364 ok(ret
!= 0, "EndDeferWindowPos failed\n");
366 COMPARE_CACHE(ZOrder1and2_chain
);
370 #define OwnerZOrderAParams SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOSIZE
372 MSG_ENTRY OwnerZOrder1A_chain
[]={
373 {4,WM_WINDOWPOSCHANGING
, SENT
,0, OwnerZOrderAParams
},
374 {3,WM_WINDOWPOSCHANGING
, SENT
,4, OwnerZOrderAParams
},
375 {1,WM_WINDOWPOSCHANGING
, SENT
,3, OwnerZOrderAParams
},
378 MSG_ENTRY OwnerZOrder2A_chain
[]={
379 {2,WM_WINDOWPOSCHANGING
, SENT
, 0, OwnerZOrderAParams
},
380 {2,WM_WINDOWPOSCHANGED
, SENT
, 0, OwnerZOrderAParams
| SWP_NOCLIENTMOVE
|SWP_NOCLIENTSIZE
},
383 MSG_ENTRY OwnerZOrder3A_chain
[]={
384 {3,WM_WINDOWPOSCHANGING
, SENT
, 0, OwnerZOrderAParams
},
385 {4,WM_WINDOWPOSCHANGING
, SENT
, 0, OwnerZOrderAParams
},
386 {1,WM_WINDOWPOSCHANGING
, SENT
, 4, OwnerZOrderAParams
},
387 {3,WM_WINDOWPOSCHANGED
, SENT
, 0, OwnerZOrderAParams
|SWP_NOCLIENTMOVE
|SWP_NOCLIENTSIZE
},
388 {4,WM_WINDOWPOSCHANGED
, SENT
, 0, OwnerZOrderAParams
|SWP_NOCLIENTMOVE
|SWP_NOCLIENTSIZE
},
389 {1,WM_WINDOWPOSCHANGED
, SENT
, 4, OwnerZOrderAParams
|SWP_NOCLIENTMOVE
|SWP_NOCLIENTSIZE
},
392 MSG_ENTRY OwnerZOrder4A_chain
[]={
393 {3,WM_WINDOWPOSCHANGING
, SENT
, 0 ,OwnerZOrderAParams
},
394 {4,WM_WINDOWPOSCHANGING
, SENT
, 0, OwnerZOrderAParams
} ,
395 {1,WM_WINDOWPOSCHANGING
, SENT
, 4, OwnerZOrderAParams
},
398 MSG_ENTRY OwnerZOrder5A_chain
[]={
399 {4,WM_WINDOWPOSCHANGING
, SENT
, 0, OwnerZOrderAParams
},
400 {3,WM_WINDOWPOSCHANGING
, SENT
, 4, OwnerZOrderAParams
},
401 {1,WM_WINDOWPOSCHANGING
, SENT
, 3, OwnerZOrderAParams
},
402 {4,WM_WINDOWPOSCHANGED
, SENT
, 0, OwnerZOrderAParams
|SWP_NOCLIENTMOVE
|SWP_NOCLIENTSIZE
},
405 #define OwnerZOrderBParams SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOOWNERZORDER
407 MSG_ENTRY OwnerZOrder1B_chain
[]={
408 {1,WM_WINDOWPOSCHANGING
, SENT
, 0, OwnerZOrderBParams
},
409 {1,WM_WINDOWPOSCHANGED
, SENT
, 0, OwnerZOrderBParams
| SWP_NOCLIENTMOVE
|SWP_NOCLIENTSIZE
},
412 MSG_ENTRY OwnerZOrder2B_chain
[]={
413 {2,WM_WINDOWPOSCHANGING
, SENT
, 0, OwnerZOrderBParams
},
414 {2,WM_WINDOWPOSCHANGED
, SENT
, 0, OwnerZOrderBParams
| SWP_NOCLIENTMOVE
|SWP_NOCLIENTSIZE
},
417 MSG_ENTRY OwnerZOrder3B_chain
[]={
418 {3,WM_WINDOWPOSCHANGING
, SENT
, 0, OwnerZOrderBParams
},
419 {3,WM_WINDOWPOSCHANGED
, SENT
, 0, OwnerZOrderBParams
| SWP_NOCLIENTMOVE
|SWP_NOCLIENTSIZE
},
422 MSG_ENTRY OwnerZOrder4B_chain
[]={
423 {1,WM_WINDOWPOSCHANGING
, SENT
, 0, OwnerZOrderBParams
},
424 {1,WM_WINDOWPOSCHANGED
, SENT
, 0, OwnerZOrderBParams
| SWP_NOCLIENTMOVE
|SWP_NOCLIENTSIZE
},
427 MSG_ENTRY OwnerZOrder5B_chain
[]={
428 {4,WM_WINDOWPOSCHANGING
, SENT
, 0, OwnerZOrderBParams
},
429 {4,WM_WINDOWPOSCHANGED
, SENT
, 0, OwnerZOrderBParams
| SWP_NOCLIENTMOVE
|SWP_NOCLIENTSIZE
},
432 static void Test_DWP_OwnerZOrder()
434 EXPECT_CHAIN(4,3,1,2);
436 /* test how SetWindowPos can change the z order of owner windows */
437 /* note that SWP_NOACTIVATE must be used because otherwise
438 SetWindowPos will call SetWindowPos again with different parameters */
439 SetWindowPos(hWnd1
, 0, 0,0,0,0, OwnerZOrderAParams
);
441 COMPARE_CACHE(OwnerZOrder1A_chain
);
442 EXPECT_CHAIN(4,3,1,2);
444 SetWindowPos(hWnd2
, 0, 0,0,0,0, OwnerZOrderAParams
);
446 COMPARE_CACHE(OwnerZOrder2A_chain
);
447 EXPECT_CHAIN(2,4,3,1);
449 SetWindowPos(hWnd3
, 0, 0,0,0,0, OwnerZOrderAParams
);
451 COMPARE_CACHE(OwnerZOrder3A_chain
);
452 EXPECT_CHAIN(3,4,1,2);
454 SetWindowPos(hWnd1
, 0, 0,0,0,0, OwnerZOrderAParams
);
456 COMPARE_CACHE(OwnerZOrder4A_chain
);
457 EXPECT_CHAIN(3,4,1,2);
459 SetWindowPos(hWnd4
, 0, 0,0,0,0, OwnerZOrderAParams
);
461 COMPARE_CACHE(OwnerZOrder5A_chain
);
462 EXPECT_CHAIN(4,3,1,2);
464 /* now do the same thing one more time with SWP_NOOWNERZORDER */
465 /* SWP_NOACTIVATE is needed because without it SetActiveWindow
466 will be calledit and it will call SetWindowPos again
467 WITHOUT SWP_NOOWNERZORDER. that means that
468 in order for SWP_NOOWNERZORDER to have effect we have to use
469 SWP_NOACTIVATE as well */
471 EXPECT_CHAIN(4,3,2,1);
473 SetWindowPos(hWnd1
, 0, 0,0,0,0, OwnerZOrderBParams
);
475 COMPARE_CACHE(OwnerZOrder1B_chain
);
476 EXPECT_CHAIN(1,4,3,2);
478 SetWindowPos(hWnd2
, 0, 0,0,0,0, OwnerZOrderBParams
);
480 COMPARE_CACHE(OwnerZOrder2B_chain
);
481 EXPECT_CHAIN(2,1,4,3);
483 SetWindowPos(hWnd3
, 0, 0,0,0,0, OwnerZOrderBParams
);
485 COMPARE_CACHE(OwnerZOrder3B_chain
);
486 EXPECT_CHAIN(3,2,1,4);
488 SetWindowPos(hWnd1
, 0, 0,0,0,0, OwnerZOrderBParams
);
490 COMPARE_CACHE(OwnerZOrder4B_chain
);
491 EXPECT_CHAIN(1,3,2,4);
493 SetWindowPos(hWnd4
, 0, 0,0,0,0, OwnerZOrderBParams
);
495 COMPARE_CACHE(OwnerZOrder5B_chain
);
496 EXPECT_CHAIN(4,1,3,2);
500 START_TEST(DeferWindowPos
)
504 RegisterSimpleClass(DWPTestProc
, L
"ownertest");
505 hWnd1
= CreateWindowExW(0, L
"ownertest", L
"abc", 0, 10, 20,
506 200, 210, NULL
, NULL
, 0, NULL
);
507 hWnd2
= CreateWindowExW(0, L
"ownertest", L
"def", 0, 30, 40,
508 220, 230, NULL
, NULL
, 0, NULL
);
509 hWnd3
= CreateWindowW(L
"ownertest", L
"ownertest", WS_OVERLAPPEDWINDOW
,
510 20, 350, 300, 300, hWnd1
, NULL
, 0, NULL
);
511 hWnd4
= CreateWindowW(L
"ownertest", L
"ownertest", WS_OVERLAPPEDWINDOW
,
512 250, 250, 200, 200, hWnd1
, NULL
, 0, NULL
);
514 ok(hWnd1
!= NULL
, "CreateWindow failed\n");
515 ok(hWnd2
!= NULL
, "CreateWindow failed\n");
516 ok(hWnd3
!= NULL
, "CreateWindow failed\n");
517 ok(hWnd4
!= NULL
, "CreateWindow failed\n");
520 Test_DWP_Error(hWnd1
, hWnd2
);
523 Test_DWP_SimpleMsg(hWnd1
, hWnd2
);
526 Test_DWP_OwnerZOrder();
528 DestroyWindow(hWnd4
);
529 DestroyWindow(hWnd3
);
530 DestroyWindow(hWnd2
);
531 DestroyWindow(hWnd1
);