1 /*
2  * PROJECT:         ReactOS API tests
3  * LICENSE:         LGPLv2.1+ - See COPYING.LIB in the top level directory
4  * PURPOSE:         Test for CreateWindowEx
5  * PROGRAMMERS:     Thomas Faber <thomas.faber@reactos.org>
6  *                  Mark Jansen (mark.jansen@reactos.org)
7  */
8 
9 #include "precomp.h"
10 
11 static void Test_Params(void)
12 {
13     HWND hWnd;
14     DWORD dwError;
15 
16     SetLastError(0x1234);
17     hWnd = CreateWindowExW(0, L"BUTTON", NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL);
18     dwError = GetLastError();
19     ok(hWnd != NULL, "hWnd = %p\n", hWnd);
20     ok(dwError == 0, "error = %lu\n", dwError);
21     DestroyWindow(hWnd);
22 
23     SetLastError(0x1234);
24     hWnd = CreateWindowExW(0, L"BUTTON", NULL, 0, 0, 0, 0, 0, (HWND)(LONG_PTR)-1, NULL, NULL, NULL);
25     dwError = GetLastError();
26     ok(hWnd == NULL, "hWnd = %p\n", hWnd);
27     ok(dwError == ERROR_INVALID_WINDOW_HANDLE, "error = %lu\n", dwError);
28 
29     SetLastError(0x1234);
30     hWnd = CreateWindowExW(0, L"BUTTON", NULL, WS_CHILD, 0, 0, 0, 0, NULL, NULL, NULL, NULL);
31     dwError = GetLastError();
32     ok(hWnd == NULL, "hWnd = %p\n", hWnd);
33     ok(dwError == ERROR_TLW_WITH_WSCHILD, "error = %lu\n", dwError);
34 
35     SetLastError(0x1234);
36     hWnd = CreateWindowExW(0, L"BUTTON", NULL, WS_CHILD, 0, 0, 0, 0, (HWND)(LONG_PTR)-1, NULL, NULL, NULL);
37     dwError = GetLastError();
38     ok(hWnd == NULL, "hWnd = %p\n", hWnd);
39     ok(dwError == ERROR_INVALID_WINDOW_HANDLE, "error = %lu\n", dwError);
40 
41     SetLastError(0x1234);
42     hWnd = CreateWindowExW(0, L"BUTTON", NULL, WS_POPUP, 0, 0, 0, 0, NULL, NULL, NULL, NULL);
43     dwError = GetLastError();
44     ok(hWnd != NULL, "hWnd = %p\n", hWnd);
45     ok(dwError == 0, "error = %lu\n", dwError);
46     DestroyWindow(hWnd);
47 
48     SetLastError(0x1234);
49     hWnd = CreateWindowExW(0, L"BUTTON", NULL, WS_POPUP, 0, 0, 0, 0, (HWND)(LONG_PTR)-1, NULL, NULL, NULL);
50     dwError = GetLastError();
51     ok(hWnd == NULL, "hWnd = %p\n", hWnd);
52     ok(dwError == ERROR_INVALID_WINDOW_HANDLE, "error = %lu\n", dwError);
53 
54     SetLastError(0x1234);
55     hWnd = CreateWindowExW(0, L"BUTTON", NULL, WS_CHILD|WS_POPUP, 0, 0, 0, 0, NULL, NULL, NULL, NULL);
56     dwError = GetLastError();
57     ok(hWnd != NULL, "hWnd = %p\n", hWnd);
58     ok(dwError == 0, "error = %lu\n", dwError);
59     DestroyWindow(hWnd);
60 
61     SetLastError(0x1234);
62     hWnd = CreateWindowExW(0, L"BUTTON", NULL, WS_CHILD|WS_POPUP, 0, 0, 0, 0, (HWND)(LONG_PTR)-1, NULL, NULL, NULL);
63     dwError = GetLastError();
64     ok(hWnd == NULL, "hWnd = %p\n", hWnd);
65     ok(dwError == ERROR_INVALID_WINDOW_HANDLE, "error = %lu\n", dwError);
66 }
67 
68 static HWND g_TestWindow = NULL;
69 static HWND g_ChildWindow = NULL;
70 static HWND g_hwndMDIClient = NULL;
71 
72 static int get_iwnd(HWND hWnd)
73 {
74     if (!g_TestWindow)
75         g_TestWindow = hWnd;
76     if (!g_ChildWindow && hWnd != g_TestWindow)
77         g_ChildWindow = hWnd;
78 
79     if (hWnd == g_TestWindow)
80         return 1;
81     else if (hWnd == g_ChildWindow)
82         return 2;
83     return 0;
84 }
85 
86 static DWORD g_FaultLine = 0;
87 static DWORD g_NcExpectStyle = 0;
88 static DWORD g_NcExpectExStyle = 0;
89 static DWORD g_ExpectStyle = 0;
90 static DWORD g_ExpectExStyle = 0;
91 
92 static DWORD g_ChildNcExpectStyle = 0;
93 static DWORD g_ChildNcExpectExStyle = 0;
94 static DWORD g_ChildExpectStyle = 0;
95 static DWORD g_ChildExpectExStyle = 0;
96 
97 #undef ok_hex_
98 #define ok_hex_(expression, result) \
99     do { \
100         int _value = (expression); \
101         ok_(__FILE__, g_FaultLine)(_value == (result), "Wrong value for '%s', expected: " #result " (0x%x), got: 0x%x\n", \
102            #expression, (int)(result), _value); \
103     } while (0)
104 
105 
106 
107 static int g_ChangeStyle = 0;
108 static LRESULT CALLBACK MSGTestProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
109 {
110     LRESULT lRet;
111     int iwnd = get_iwnd(hWnd);
112 
113     if(message > WM_USER || !iwnd || IsDWmMsg(message) || IseKeyMsg(message))
114         return DefWindowProc(hWnd, message, wParam, lParam);
115 
116     switch(message)
117     {
118     case WM_IME_SETCONTEXT:
119     case WM_IME_NOTIFY:
120     case WM_GETICON:
121     case WM_GETTEXT:
122         return DefWindowProc(hWnd, message, wParam, lParam);
123         break;
124     case WM_NCCREATE:
125     {
126         LPCREATESTRUCT create = (LPCREATESTRUCT)lParam;
127         RECORD_MESSAGE(iwnd, message, SENT, 0, 0);
128         ok_hex_(create->style, g_NcExpectStyle);
129         ok_hex_(create->dwExStyle, g_NcExpectExStyle);
130         if (g_ChangeStyle)
131         {
132             DWORD dwStyle = GetWindowLong(hWnd, GWL_EXSTYLE);
133             dwStyle &= ~(WS_EX_CLIENTEDGE);
134             SetWindowLong(hWnd, GWL_EXSTYLE, dwStyle);
135             RECORD_MESSAGE(iwnd, message, MARKER, 0, 0);
136             SetWindowPos(hWnd, NULL, 0, 0, 0, 0,
137                          SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_DRAWFRAME);
138 
139             RECORD_MESSAGE(iwnd, message, MARKER, 0, 0);
140             ok_hex_(create->style, g_NcExpectStyle);
141             ok_hex_(create->dwExStyle, g_NcExpectExStyle);
142         }
143     }
144         break;
145     case WM_CREATE:
146     {
147         LPCREATESTRUCT create = (LPCREATESTRUCT)lParam;
148         RECORD_MESSAGE(iwnd, message, SENT, 0, 0);
149         ok_hex_(create->style, g_ExpectStyle);
150         ok_hex_(create->dwExStyle, g_ExpectExStyle);
151     }
152         break;
153     case WM_NCCALCSIZE:
154     case WM_STYLECHANGING:
155     case WM_STYLECHANGED:
156     case WM_SIZE:
157         RECORD_MESSAGE(iwnd, message, SENT, wParam, 0);
158         break;
159     case WM_WINDOWPOSCHANGING:
160     case WM_WINDOWPOSCHANGED:
161         ok(wParam == 0,"expected wParam=0\n");
162         RECORD_MESSAGE(iwnd, message, SENT, ((WINDOWPOS*)lParam)->flags, 0);
163         break;
164     default:
165         RECORD_MESSAGE(iwnd, message, SENT, 0, 0);
166         break;
167     }
168     lRet = DefWindowProc(hWnd, message, wParam, lParam);
169     RECORD_MESSAGE(iwnd, message, SENT_RET, 0, 0);
170     return lRet;
171 }
172 
173 static MSG_ENTRY create_chain[] =
174 {
175     { 1, WM_GETMINMAXINFO, SENT },
176     { 1, WM_GETMINMAXINFO, SENT_RET },
177     { 1, WM_NCCREATE, SENT },
178     { 1, WM_NCCREATE, SENT_RET },
179     { 1, WM_NCCALCSIZE, SENT },
180     { 1, WM_NCCALCSIZE, SENT_RET },
181     { 1, WM_CREATE, SENT },
182     { 1, WM_CREATE, SENT_RET },
183     { 0, 0 }
184 };
185 
186 static MSG_ENTRY create_chain_modify[] =
187 {
188     { 1, WM_GETMINMAXINFO, SENT },
189     { 1, WM_GETMINMAXINFO, SENT_RET },
190     { 1, WM_NCCREATE, SENT },
191         { 1, WM_STYLECHANGING, SENT, GWL_EXSTYLE },
192         { 1, WM_STYLECHANGING, SENT_RET },
193         { 1, WM_STYLECHANGED, SENT, GWL_EXSTYLE },
194         { 1, WM_STYLECHANGED, SENT_RET },
195     { 1, WM_NCCREATE, MARKER },
196         { 1, WM_WINDOWPOSCHANGING, SENT, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED },
197         { 1, WM_WINDOWPOSCHANGING, SENT_RET },
198         { 1, WM_NCCALCSIZE, SENT, TRUE },
199         { 1, WM_NCCALCSIZE, SENT_RET },
200         { 1, WM_WINDOWPOSCHANGED, SENT, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOREDRAW | SWP_NOACTIVATE | SWP_FRAMECHANGED },
201             { 1, WM_MOVE, SENT },
202             { 1, WM_MOVE, SENT_RET },
203             { 1, WM_SIZE, SENT },
204             { 1, WM_SIZE, SENT_RET },
205         { 1, WM_WINDOWPOSCHANGED, SENT_RET },
206     { 1, WM_NCCREATE, MARKER },
207     { 1, WM_NCCREATE, SENT_RET },
208     { 1, WM_NCCALCSIZE, SENT },
209     { 1, WM_NCCALCSIZE, SENT_RET },
210     { 1, WM_CREATE, SENT },
211     { 1, WM_CREATE, SENT_RET },
212     { 0, 0 }
213 };
214 
215 static MSG_ENTRY create_chain_modify_below8_nonsrv[] =
216 {
217     { 1, WM_GETMINMAXINFO, SENT },
218     { 1, WM_GETMINMAXINFO, SENT_RET },
219     { 1, WM_NCCREATE, SENT },
220         { 1, WM_STYLECHANGING, SENT, GWL_EXSTYLE },
221         { 1, WM_STYLECHANGING, SENT_RET },
222         { 1, WM_STYLECHANGED, SENT, GWL_EXSTYLE },
223         { 1, WM_STYLECHANGED, SENT_RET },
224     { 1, WM_NCCREATE, MARKER },
225         { 1, WM_WINDOWPOSCHANGING, SENT, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED },
226         { 1, WM_WINDOWPOSCHANGING, SENT_RET },
227         { 1, WM_NCCALCSIZE, SENT, TRUE },
228         { 1, WM_NCCALCSIZE, SENT_RET },
229         { 1, WM_WINDOWPOSCHANGED, SENT, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOREDRAW | SWP_NOACTIVATE | SWP_FRAMECHANGED },
230             { 1, WM_MOVE, SENT },
231             { 1, WM_MOVE, SENT_RET },
232             { 1, WM_SIZE, SENT },
233             { 1, WM_SIZE, SENT_RET },
234         { 1, WM_WINDOWPOSCHANGED, SENT_RET },
235         { 1, WM_NCCALCSIZE, SENT, TRUE },
236         { 1, WM_NCCALCSIZE, SENT_RET },
237     { 1, WM_NCCREATE, MARKER },
238     { 1, WM_NCCREATE, SENT_RET },
239     { 1, WM_NCCALCSIZE, SENT },
240     { 1, WM_NCCALCSIZE, SENT_RET },
241     { 1, WM_CREATE, SENT },
242     { 1, WM_CREATE, SENT_RET },
243     { 0, 0 }
244 };
245 
246 
247 static BOOL
248 IsWindowsServer()
249 {
250     OSVERSIONINFOEXW osvi = { sizeof(osvi), 0, 0, 0, 0, {0}, 0, 0, 0, VER_NT_WORKSTATION };
251     DWORDLONG        const dwlConditionMask = VerSetConditionMask( 0, VER_PRODUCT_TYPE, VER_EQUAL );
252 
253     return !VerifyVersionInfoW(&osvi, VER_PRODUCT_TYPE, dwlConditionMask);
254 }
255 
256 
257 static BOOL
258 IsWindows8OrGreater()
259 {
260     OSVERSIONINFOEXW osvi = { sizeof(osvi), 0, 0, 0, 0, {0}, 0, 0 };
261     DWORDLONG const dwlConditionMask = VerSetConditionMask(VerSetConditionMask(
262         VerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL),
263             VER_MINORVERSION, VER_GREATER_EQUAL),
264             VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL);
265 
266     osvi.dwMajorVersion = HIBYTE(_WIN32_WINNT_WIN8);
267     osvi.dwMinorVersion = LOBYTE(_WIN32_WINNT_WIN8);
268 
269     return VerifyVersionInfoW(&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, dwlConditionMask) != FALSE;
270 }
271 
272 static void Test_Messages(void)
273 {
274     HWND hWnd;
275     BOOL Below8NonServer = !IsWindows8OrGreater() && !IsWindowsServer();
276 
277     RegisterSimpleClass(MSGTestProc, L"Test_Message_Window_XX");
278 
279     g_ChangeStyle = 0;
280 
281     g_ExpectStyle = g_NcExpectStyle = 0;
282     g_ExpectExStyle = g_NcExpectExStyle = WS_EX_CLIENTEDGE;
283     g_FaultLine = __LINE__ + 1;
284     hWnd = CreateWindowExW(WS_EX_CLIENTEDGE, L"Test_Message_Window_XX", L"", 0, 10, 20,
285                            200, 210, NULL, NULL, 0, NULL);
286 
287     ok(hWnd == g_TestWindow, "We are testing with %p instead of %p\n", g_TestWindow, hWnd);
288     COMPARE_CACHE(create_chain);
289     DestroyWindow(hWnd);
290     g_TestWindow = g_ChildWindow = NULL;
291     EMPTY_CACHE();
292 
293     g_ExpectStyle = g_NcExpectStyle = WS_OVERLAPPEDWINDOW;
294     g_ExpectExStyle = g_NcExpectExStyle = WS_EX_OVERLAPPEDWINDOW;
295     g_FaultLine = __LINE__ + 1;
296     hWnd = CreateWindowExW(WS_EX_CLIENTEDGE, L"Test_Message_Window_XX", L"", WS_OVERLAPPEDWINDOW, 10, 20,
297                            200, 210, NULL, NULL, 0, NULL);
298 
299     ok(hWnd == g_TestWindow, "We are testing with %p instead of %p\n", g_TestWindow, hWnd);
300     COMPARE_CACHE(create_chain);
301     DestroyWindow(hWnd);
302     g_TestWindow = g_ChildWindow = NULL;
303     EMPTY_CACHE();
304 
305     g_ChangeStyle = 1;
306 
307     g_ExpectStyle = g_NcExpectStyle = 0;
308     g_ExpectExStyle = g_NcExpectExStyle = WS_EX_CLIENTEDGE;
309     g_FaultLine = __LINE__ + 1;
310     hWnd = CreateWindowExW(WS_EX_CLIENTEDGE, L"Test_Message_Window_XX", L"", 0, 10, 20,
311                            200, 210, NULL, NULL, 0, NULL);
312 
313     ok(hWnd == g_TestWindow, "We are testing with %p instead of %p\n", g_TestWindow, hWnd);
314     COMPARE_CACHE(Below8NonServer ? create_chain_modify_below8_nonsrv : create_chain_modify);
315     DestroyWindow(hWnd);
316     g_TestWindow = g_ChildWindow = NULL;
317     EMPTY_CACHE();
318 
319     g_ExpectStyle = g_NcExpectStyle = WS_OVERLAPPEDWINDOW;
320     g_ExpectExStyle = g_NcExpectExStyle = WS_EX_OVERLAPPEDWINDOW;
321     g_FaultLine = __LINE__ + 1;
322     hWnd = CreateWindowExW(WS_EX_CLIENTEDGE, L"Test_Message_Window_XX", L"", WS_OVERLAPPEDWINDOW, 10, 20,
323                            200, 210, NULL, NULL, 0, NULL);
324 
325     ok(hWnd == g_TestWindow, "We are testing with %p instead of %p\n", g_TestWindow, hWnd);
326     COMPARE_CACHE(Below8NonServer ? create_chain_modify_below8_nonsrv : create_chain_modify);
327     DestroyWindow(hWnd);
328     g_TestWindow = g_ChildWindow = NULL;
329     EMPTY_CACHE();
330 
331     UnregisterClassW(L"Test_Message_Window_XX", NULL);
332 }
333 
334 
335 static LRESULT CALLBACK MSGChildProc2(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
336 {
337     LRESULT lRet;
338     int iwnd = get_iwnd(hWnd);
339 
340     if(message > WM_USER || !iwnd || IsDWmMsg(message) || IseKeyMsg(message))
341         return DefWindowProc(hWnd, message, wParam, lParam);
342 
343     switch(message)
344     {
345     case WM_IME_SETCONTEXT:
346     case WM_IME_NOTIFY:
347     case WM_GETICON:
348     case WM_GETTEXT:
349         return DefWindowProc(hWnd, message, wParam, lParam);
350         break;
351     case WM_NCCREATE:
352     {
353         LPCREATESTRUCT create = (LPCREATESTRUCT)lParam;
354         RECORD_MESSAGE(iwnd, message, SENT, 0, 0);
355         ok_hex_(create->style, g_ChildNcExpectStyle);
356         ok_hex_(create->dwExStyle, g_ChildNcExpectExStyle);
357 
358         if (g_ChangeStyle)
359         {
360             DWORD dwStyle = GetWindowLong(g_TestWindow, GWL_EXSTYLE);
361             dwStyle &= ~(WS_EX_CLIENTEDGE);
362             SetWindowLong(g_TestWindow, GWL_EXSTYLE, dwStyle);
363             RECORD_MESSAGE(iwnd, message, MARKER, 0, 0);
364             SetWindowPos(g_TestWindow, NULL, 0, 0, 0, 0,
365                          SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_DRAWFRAME);
366 
367             RECORD_MESSAGE(iwnd, message, MARKER, 0, 0);
368             ok_hex_(create->style, g_ChildNcExpectStyle);
369             ok_hex_(create->dwExStyle, g_ChildNcExpectExStyle);
370         }
371     }
372     break;
373     case WM_CREATE:
374     {
375         LPCREATESTRUCT create = (LPCREATESTRUCT)lParam;
376         RECORD_MESSAGE(iwnd, message, SENT, 0, 0);
377         ok_hex_(create->style, g_ChildExpectStyle);
378         ok_hex_(create->dwExStyle, g_ChildExpectExStyle);
379     }
380     break;
381     case WM_NCCALCSIZE:
382     case WM_STYLECHANGING:
383     case WM_STYLECHANGED:
384     case WM_SIZE:
385         RECORD_MESSAGE(iwnd, message, SENT, wParam, 0);
386         break;
387     case WM_WINDOWPOSCHANGING:
388     case WM_WINDOWPOSCHANGED:
389         ok(wParam == 0,"expected wParam=0\n");
390         RECORD_MESSAGE(iwnd, message, SENT, ((WINDOWPOS*)lParam)->flags, 0);
391         break;
392     default:
393         RECORD_MESSAGE(iwnd, message, SENT, 0, 0);
394         break;
395     }
396     lRet = DefWindowProc(hWnd, message, wParam, lParam);
397     RECORD_MESSAGE(iwnd, message, SENT_RET, 0, 0);
398     return lRet;
399 }
400 
401 
402 static LRESULT CALLBACK MSGTestProc2(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
403 {
404     LRESULT lRet;
405     int iwnd = get_iwnd(hWnd);
406 
407     if(message > WM_USER || !iwnd || IsDWmMsg(message) || IseKeyMsg(message))
408         return DefWindowProc(hWnd, message, wParam, lParam);
409 
410     switch(message)
411     {
412     case WM_IME_SETCONTEXT:
413     case WM_IME_NOTIFY:
414     case WM_GETICON:
415     case WM_GETTEXT:
416         return DefWindowProc(hWnd, message, wParam, lParam);
417         break;
418     case WM_NCCREATE:
419     {
420         HWND child;
421         LPCREATESTRUCT create = (LPCREATESTRUCT)lParam;
422         RECORD_MESSAGE(iwnd, message, SENT, 0, 0);
423         ok_hex_(create->style, g_NcExpectStyle);
424         ok_hex_(create->dwExStyle, g_NcExpectExStyle);
425 
426         child = CreateWindowExW(0, L"Test_Message_Window_Child2", L"", WS_CHILD, 0, 0, 10, 10, hWnd, NULL, 0, NULL);
427         RECORD_MESSAGE(iwnd, message, MARKER, 0, 0);
428         ok_(__FILE__, g_FaultLine)(g_ChildWindow == child, "Testing against the wrong child!\n");
429     }
430     break;
431     case WM_NCDESTROY:
432         RECORD_MESSAGE(iwnd, message, SENT, 0, 0);
433         DestroyWindow(g_ChildWindow);
434         break;
435     case WM_CREATE:
436     {
437         LPCREATESTRUCT create = (LPCREATESTRUCT)lParam;
438         RECORD_MESSAGE(iwnd, message, SENT, 0, 0);
439         ok_hex_(create->style, g_ExpectStyle);
440         ok_hex_(create->dwExStyle, g_ExpectExStyle);
441     }
442     break;
443     case WM_NCCALCSIZE:
444     case WM_STYLECHANGING:
445     case WM_STYLECHANGED:
446     case WM_SIZE:
447         RECORD_MESSAGE(iwnd, message, SENT, wParam, 0);
448         break;
449     case WM_WINDOWPOSCHANGING:
450     case WM_WINDOWPOSCHANGED:
451         ok(wParam == 0,"expected wParam=0\n");
452         RECORD_MESSAGE(iwnd, message, SENT, ((WINDOWPOS*)lParam)->flags, 0);
453         break;
454     default:
455         RECORD_MESSAGE(iwnd, message, SENT, 0, 0);
456         break;
457     }
458     lRet = DefWindowProc(hWnd, message, wParam, lParam);
459     RECORD_MESSAGE(iwnd, message, SENT_RET, 0, 0);
460     return lRet;
461 }
462 
463 
464 MSG_ENTRY child_create_chain[] =
465 {
466     { 1, WM_GETMINMAXINFO, SENT },
467     { 1, WM_GETMINMAXINFO, SENT_RET },
468     { 1, WM_NCCREATE, SENT },
469         { 2, WM_NCCREATE, SENT },
470         { 2, WM_NCCREATE, SENT_RET },
471         { 2, WM_NCCALCSIZE, SENT },
472         { 2, WM_NCCALCSIZE, SENT_RET },
473         { 2, WM_CREATE, SENT },
474         { 2, WM_CREATE, SENT_RET },
475         { 2, WM_SIZE, SENT },
476         { 2, WM_SIZE, SENT_RET },
477         { 2, WM_MOVE, SENT },
478         { 2, WM_MOVE, SENT_RET },
479         { 1, WM_PARENTNOTIFY, SENT },
480         { 1, WM_PARENTNOTIFY, SENT_RET },
481     { 1, WM_NCCREATE, MARKER },
482     { 1, WM_NCCREATE, SENT_RET },
483     { 1, WM_NCCALCSIZE, SENT },
484     { 1, WM_NCCALCSIZE, SENT_RET },
485     { 1, WM_CREATE, SENT },
486     { 1, WM_CREATE, SENT_RET },
487     { 0, 0 }
488 };
489 
490 MSG_ENTRY child_create_chain_modify[] =
491 {
492     { 1, WM_GETMINMAXINFO, SENT },
493     { 1, WM_GETMINMAXINFO, SENT_RET },
494     { 1, WM_NCCREATE, SENT },
495         { 2, WM_NCCREATE, SENT },
496             { 1, WM_STYLECHANGING, SENT, GWL_EXSTYLE },
497             { 1, WM_STYLECHANGING, SENT_RET },
498             { 1, WM_STYLECHANGED, SENT, GWL_EXSTYLE },
499             { 1, WM_STYLECHANGED, SENT_RET },
500         { 2, WM_NCCREATE, MARKER },
501             { 1, WM_WINDOWPOSCHANGING, SENT, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED },
502             { 1, WM_WINDOWPOSCHANGING, SENT_RET },
503             { 1, WM_NCCALCSIZE, SENT, TRUE },
504             { 1, WM_NCCALCSIZE, SENT_RET },
505             { 1, WM_WINDOWPOSCHANGED, SENT, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOREDRAW | SWP_NOACTIVATE | SWP_FRAMECHANGED },
506                 { 1, WM_MOVE, SENT },
507                 { 1, WM_MOVE, SENT_RET },
508                 { 1, WM_SIZE, SENT },
509                 { 1, WM_SIZE, SENT_RET },
510             { 1, WM_WINDOWPOSCHANGED, SENT_RET },
511         { 2, WM_NCCREATE, MARKER },
512         { 2, WM_NCCREATE, SENT_RET },
513         { 2, WM_NCCALCSIZE, SENT },
514         { 2, WM_NCCALCSIZE, SENT_RET },
515         { 2, WM_CREATE, SENT },
516         { 2, WM_CREATE, SENT_RET },
517         { 2, WM_SIZE, SENT },
518         { 2, WM_SIZE, SENT_RET },
519         { 2, WM_MOVE, SENT },
520         { 2, WM_MOVE, SENT_RET },
521         { 1, WM_PARENTNOTIFY, SENT },
522         { 1, WM_PARENTNOTIFY, SENT_RET },
523     { 1, WM_NCCREATE, MARKER },
524     { 1, WM_NCCREATE, SENT_RET },
525     { 1, WM_NCCALCSIZE, SENT },
526     { 1, WM_NCCALCSIZE, SENT_RET },
527     { 1, WM_CREATE, SENT },
528     { 1, WM_CREATE, SENT_RET },
529     { 0, 0 }
530 };
531 
532 MSG_ENTRY child_create_chain_modify_below8_nonsrv[] =
533 {
534     { 1, WM_GETMINMAXINFO, SENT },
535     { 1, WM_GETMINMAXINFO, SENT_RET },
536     { 1, WM_NCCREATE, SENT },
537         { 2, WM_NCCREATE, SENT },
538             { 1, WM_STYLECHANGING, SENT, GWL_EXSTYLE },
539             { 1, WM_STYLECHANGING, SENT_RET },
540             { 1, WM_STYLECHANGED, SENT, GWL_EXSTYLE },
541             { 1, WM_STYLECHANGED, SENT_RET },
542         { 2, WM_NCCREATE, MARKER },
543             { 1, WM_WINDOWPOSCHANGING, SENT, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED },
544             { 1, WM_WINDOWPOSCHANGING, SENT_RET },
545             { 1, WM_NCCALCSIZE, SENT, TRUE },
546             { 1, WM_NCCALCSIZE, SENT_RET },
547             { 1, WM_WINDOWPOSCHANGED, SENT, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOREDRAW | SWP_NOACTIVATE | SWP_FRAMECHANGED },
548                 { 1, WM_MOVE, SENT },
549                 { 1, WM_MOVE, SENT_RET },
550                 { 1, WM_SIZE, SENT },
551                 { 1, WM_SIZE, SENT_RET },
552             { 1, WM_WINDOWPOSCHANGED, SENT_RET },
553             { 1, WM_NCCALCSIZE, SENT, TRUE },
554             { 1, WM_NCCALCSIZE, SENT_RET },
555         { 2, WM_NCCREATE, MARKER },
556         { 2, WM_NCCREATE, SENT_RET },
557         { 2, WM_NCCALCSIZE, SENT },
558         { 2, WM_NCCALCSIZE, SENT_RET },
559         { 2, WM_CREATE, SENT },
560         { 2, WM_CREATE, SENT_RET },
561         { 2, WM_SIZE, SENT },
562         { 2, WM_SIZE, SENT_RET },
563         { 2, WM_MOVE, SENT },
564         { 2, WM_MOVE, SENT_RET },
565         { 1, WM_PARENTNOTIFY, SENT },
566         { 1, WM_PARENTNOTIFY, SENT_RET },
567     { 1, WM_NCCREATE, MARKER },
568     { 1, WM_NCCREATE, SENT_RET },
569     { 1, WM_NCCALCSIZE, SENT },
570     { 1, WM_NCCALCSIZE, SENT_RET },
571     { 1, WM_CREATE, SENT },
572     { 1, WM_CREATE, SENT_RET },
573     { 0, 0 }
574 };
575 
576 
577 
578 static void Test_Messages_Child(void)
579 {
580     HWND hWnd;
581     BOOL Below8NonServer = !IsWindows8OrGreater() && !IsWindowsServer();
582 
583     RegisterSimpleClass(MSGTestProc2, L"Test_Message_Window_X2");
584     RegisterSimpleClass(MSGChildProc2, L"Test_Message_Window_Child2");
585 
586     g_ChangeStyle = 0;
587 
588     g_ExpectStyle = g_NcExpectStyle = 0;
589     g_ExpectExStyle = g_NcExpectExStyle = WS_EX_CLIENTEDGE;
590     g_ChildExpectStyle = g_ChildNcExpectStyle = WS_CHILD;
591     g_ChildExpectExStyle = g_ChildNcExpectExStyle = 0;
592     g_FaultLine = __LINE__ + 1;
593     hWnd = CreateWindowExW(WS_EX_CLIENTEDGE, L"Test_Message_Window_X2", L"", 0, 10, 20,
594                            200, 210, NULL, NULL, 0, NULL);
595 
596     ok(hWnd == g_TestWindow, "We are testing with %p instead of %p\n", g_TestWindow, hWnd);
597     COMPARE_CACHE(child_create_chain);
598     DestroyWindow(hWnd);
599     g_TestWindow = g_ChildWindow = NULL;
600     EMPTY_CACHE();
601 
602     g_ExpectStyle = g_NcExpectStyle = WS_OVERLAPPEDWINDOW;
603     g_ExpectExStyle = g_NcExpectExStyle = WS_EX_OVERLAPPEDWINDOW;
604     g_ChildExpectStyle = g_ChildNcExpectStyle = WS_CHILD;
605     g_ChildExpectExStyle = g_ChildNcExpectExStyle = 0;
606     g_FaultLine = __LINE__ + 1;
607     hWnd = CreateWindowExW(WS_EX_CLIENTEDGE, L"Test_Message_Window_X2", L"", WS_OVERLAPPEDWINDOW, 10, 20,
608                            200, 210, NULL, NULL, 0, NULL);
609 
610     ok(hWnd == g_TestWindow, "We are testing with %p instead of %p\n", g_TestWindow, hWnd);
611     COMPARE_CACHE(child_create_chain);
612     DestroyWindow(hWnd);
613     g_TestWindow = g_ChildWindow = NULL;
614     EMPTY_CACHE();
615 
616     g_ChangeStyle = 1;
617 
618     g_ExpectStyle = g_NcExpectStyle = 0;
619     g_ExpectExStyle = g_NcExpectExStyle = WS_EX_CLIENTEDGE;
620     g_ChildExpectStyle = g_ChildNcExpectStyle = WS_CHILD;
621     g_ChildExpectExStyle = g_ChildNcExpectExStyle = 0;
622     g_FaultLine = __LINE__ + 1;
623     hWnd = CreateWindowExW(WS_EX_CLIENTEDGE, L"Test_Message_Window_X2", L"", 0, 10, 20,
624                            200, 210, NULL, NULL, 0, NULL);
625 
626     ok(hWnd == g_TestWindow, "We are testing with %p instead of %p\n", g_TestWindow, hWnd);
627     COMPARE_CACHE(Below8NonServer ? child_create_chain_modify_below8_nonsrv : child_create_chain_modify);
628     DestroyWindow(hWnd);
629     g_TestWindow = g_ChildWindow = NULL;
630     EMPTY_CACHE();
631 
632     g_ExpectStyle = g_NcExpectStyle = WS_OVERLAPPEDWINDOW;
633     g_ExpectExStyle = g_NcExpectExStyle = WS_EX_OVERLAPPEDWINDOW;
634     g_ChildExpectStyle = g_ChildNcExpectStyle = WS_CHILD;
635     g_ChildExpectExStyle = g_ChildNcExpectExStyle = 0;
636     g_FaultLine = __LINE__ + 1;
637     hWnd = CreateWindowExW(WS_EX_CLIENTEDGE, L"Test_Message_Window_X2", L"", WS_OVERLAPPEDWINDOW, 10, 20,
638                            200, 210, NULL, NULL, 0, NULL);
639 
640     ok(hWnd == g_TestWindow, "We are testing with %p instead of %p\n", g_TestWindow, hWnd);
641     COMPARE_CACHE(Below8NonServer ? child_create_chain_modify_below8_nonsrv : child_create_chain_modify);
642     DestroyWindow(hWnd);
643     g_TestWindow = g_ChildWindow = NULL;
644     EMPTY_CACHE();
645 
646     UnregisterClassW(L"Test_Message_Window_X2", NULL);
647     UnregisterClassW(L"Test_Message_Window_Child2", NULL);
648 }
649 
650 
651 
652 static LRESULT CALLBACK MSGTestProcMDI(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
653 {
654     LRESULT lRet;
655     int iwnd = get_iwnd(hWnd);
656 
657     if(message > WM_USER || !iwnd || IsDWmMsg(message) || IseKeyMsg(message))
658         return DefWindowProc(hWnd, message, wParam, lParam);
659 
660     switch(message)
661     {
662     case WM_IME_SETCONTEXT:
663     case WM_IME_NOTIFY:
664     case WM_GETICON:
665     case WM_GETTEXT:
666         return DefWindowProc(hWnd, message, wParam, lParam);
667         break;
668     case WM_NCCREATE:
669     {
670         LPCREATESTRUCT create = (LPCREATESTRUCT)lParam;
671         RECORD_MESSAGE(iwnd, message, SENT, 0, 0);
672         ok_hex_(create->style, g_NcExpectStyle);
673         ok_hex_(create->dwExStyle, g_NcExpectExStyle);
674     }
675     break;
676     case WM_CREATE:
677     {
678         CLIENTCREATESTRUCT ccs = { 0 };
679         LPCREATESTRUCT create = (LPCREATESTRUCT)lParam;
680         RECORD_MESSAGE(iwnd, message, SENT, 0, 0);
681         ok_hex_(create->style, g_ExpectStyle);
682         ok_hex_(create->dwExStyle, g_ExpectExStyle);
683 
684         g_hwndMDIClient = CreateWindow("MDICLIENT", (LPCTSTR) NULL,
685                                      WS_CHILD | WS_CLIPCHILDREN | WS_VSCROLL | WS_HSCROLL,
686                                      0, 0, 0, 0, hWnd, (HMENU) 0xCAC, NULL, (LPSTR) &ccs);
687 
688         ShowWindow(g_hwndMDIClient, SW_SHOW);
689 
690     }
691     break;
692     case WM_NCCALCSIZE:
693     case WM_STYLECHANGING:
694     case WM_STYLECHANGED:
695     case WM_SIZE:
696         RECORD_MESSAGE(iwnd, message, SENT, wParam, 0);
697         break;
698     case WM_WINDOWPOSCHANGING:
699     case WM_WINDOWPOSCHANGED:
700         ok(wParam == 0,"expected wParam=0\n");
701         RECORD_MESSAGE(iwnd, message, SENT, ((WINDOWPOS*)lParam)->flags, 0);
702         break;
703     default:
704         RECORD_MESSAGE(iwnd, message, SENT, 0, 0);
705         break;
706     }
707     lRet = DefWindowProc(hWnd, message, wParam, lParam);
708     RECORD_MESSAGE(iwnd, message, SENT_RET, 0, 0);
709     return lRet;
710 }
711 
712 MSG_ENTRY create_chain_MDI[] =
713 {
714     { 1, WM_GETMINMAXINFO, SENT },
715     { 1, WM_GETMINMAXINFO, SENT_RET },
716     { 1, WM_NCCREATE, SENT },
717     { 1, WM_NCCREATE, SENT_RET },
718     { 1, WM_NCCALCSIZE, SENT },
719     { 1, WM_NCCALCSIZE, SENT_RET },
720     { 1, WM_CREATE, SENT },
721     { 1, WM_PARENTNOTIFY, SENT },
722     { 1, WM_PARENTNOTIFY, SENT_RET },
723     { 1, WM_CREATE, SENT_RET },
724     { 0, 0 }
725 };
726 
727 static void Test_Messages_MDI(void)
728 {
729     HWND hWnd;
730 
731     RegisterSimpleClass(MSGTestProcMDI, L"Test_Message_Window_MDI_XX");
732 
733     g_ExpectStyle = g_NcExpectStyle = 0;
734     g_ExpectExStyle = g_NcExpectExStyle = WS_EX_CLIENTEDGE;
735     g_FaultLine = __LINE__ + 1;
736     hWnd = CreateWindowExW(WS_EX_CLIENTEDGE, L"Test_Message_Window_MDI_XX", L"", 0, 10, 20,
737                            200, 210, NULL, NULL, 0, NULL);
738 
739     ok(hWnd == g_TestWindow, "We are testing with %p instead of %p\n", g_TestWindow, hWnd);
740     COMPARE_CACHE(create_chain_MDI);
741     DestroyWindow(hWnd);
742     g_TestWindow = g_hwndMDIClient = g_ChildWindow = NULL;
743     EMPTY_CACHE();
744 
745     g_ExpectStyle = g_NcExpectStyle = WS_OVERLAPPEDWINDOW;
746     g_ExpectExStyle = g_NcExpectExStyle = WS_EX_OVERLAPPEDWINDOW;
747     g_FaultLine = __LINE__ + 1;
748     hWnd = CreateWindowExW(WS_EX_CLIENTEDGE, L"Test_Message_Window_MDI_XX", L"", WS_OVERLAPPEDWINDOW, 10, 20,
749                            200, 210, NULL, NULL, 0, NULL);
750 
751     ok(hWnd == g_TestWindow, "We are testing with %p instead of %p\n", g_TestWindow, hWnd);
752     COMPARE_CACHE(create_chain_MDI);
753     DestroyWindow(hWnd);
754     g_TestWindow = g_hwndMDIClient = g_ChildWindow = NULL;
755     EMPTY_CACHE();
756 
757     UnregisterClassW(L"Test_Message_Window_MDI_XX", NULL);
758 }
759 
760 
761 static LRESULT CALLBACK MSGTestProcMDI2(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
762 {
763     LRESULT lRet;
764     int iwnd = get_iwnd(hWnd);
765 
766     if(message > WM_USER || !iwnd || IsDWmMsg(message) || IseKeyMsg(message))
767         return DefWindowProc(hWnd, message, wParam, lParam);
768 
769     switch(message)
770     {
771     case WM_IME_SETCONTEXT:
772     case WM_IME_NOTIFY:
773     case WM_GETICON:
774     case WM_GETTEXT:
775         return DefWindowProc(hWnd, message, wParam, lParam);
776         break;
777     case WM_NCCREATE:
778     {
779         LPCREATESTRUCT create = (LPCREATESTRUCT)lParam;
780         RECORD_MESSAGE(iwnd, message, SENT, 0, 0);
781         ok_hex_(create->style, g_NcExpectStyle);
782         ok_hex_(create->dwExStyle, g_NcExpectExStyle);
783     }
784     break;
785     case WM_CREATE:
786     {
787         MDICREATESTRUCT mcs = {0};
788         CLIENTCREATESTRUCT ccs = { 0 };
789         LPCREATESTRUCT create = (LPCREATESTRUCT)lParam;
790         HWND hchild;
791         RECORD_MESSAGE(iwnd, message, SENT, 0, 0);
792         ok_hex_(create->style, g_ExpectStyle);
793         ok_hex_(create->dwExStyle, g_ExpectExStyle);
794 
795 
796         g_hwndMDIClient = CreateWindow("MDICLIENT", (LPCTSTR) NULL,
797                                        WS_CHILD | WS_CLIPCHILDREN | WS_VSCROLL | WS_HSCROLL,
798                                        0, 0, 0, 0, hWnd, (HMENU) 0xCAC, NULL, (LPSTR) &ccs);
799 
800         ShowWindow(g_hwndMDIClient, SW_SHOW);
801 
802 
803         mcs.szClass = "Test_Message_MDI_Window_Child2";
804         mcs.x = mcs.cx = CW_USEDEFAULT;
805         mcs.y = mcs.cy = CW_USEDEFAULT;
806         mcs.style = WS_MAXIMIZE;
807 
808         hchild = (HWND) SendMessage (g_hwndMDIClient, WM_MDICREATE, 0,
809             (LPARAM)&mcs);
810         ok(hchild == g_ChildWindow, "We are testing with %p instead of %p\n", g_ChildWindow, hchild);
811 
812     }
813     break;
814     case WM_NCCALCSIZE:
815     case WM_STYLECHANGING:
816     case WM_STYLECHANGED:
817     case WM_SIZE:
818         RECORD_MESSAGE(iwnd, message, SENT, wParam, 0);
819         break;
820     case WM_WINDOWPOSCHANGING:
821     case WM_WINDOWPOSCHANGED:
822         ok(wParam == 0,"expected wParam=0\n");
823         RECORD_MESSAGE(iwnd, message, SENT, ((WINDOWPOS*)lParam)->flags, 0);
824         break;
825     default:
826         RECORD_MESSAGE(iwnd, message, SENT, 0, 0);
827         break;
828     }
829     lRet = DefWindowProc(hWnd, message, wParam, lParam);
830     RECORD_MESSAGE(iwnd, message, SENT_RET, 0, 0);
831     return lRet;
832 }
833 
834 static LRESULT CALLBACK MSGChildProcMDI2(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
835 {
836     LRESULT lRet;
837     int iwnd = get_iwnd(hWnd);
838 
839     if(message > WM_USER || !iwnd || IsDWmMsg(message) || IseKeyMsg(message))
840         return DefMDIChildProc(hWnd, message, wParam, lParam);
841 
842     switch(message)
843     {
844     case WM_IME_SETCONTEXT:
845     case WM_IME_NOTIFY:
846     case WM_GETICON:
847     case WM_GETTEXT:
848         return DefMDIChildProc(hWnd, message, wParam, lParam);
849         break;
850     case WM_NCCREATE:
851     {
852         LPCREATESTRUCT create = (LPCREATESTRUCT)lParam;
853         RECORD_MESSAGE(iwnd, message, SENT, 0, 0);
854         ok_hex_(create->style, g_ChildNcExpectStyle);
855         ok_hex_(create->dwExStyle, g_ChildNcExpectExStyle);
856     }
857     break;
858     case WM_CREATE:
859     {
860         LPCREATESTRUCT create = (LPCREATESTRUCT)lParam;
861         RECORD_MESSAGE(iwnd, message, SENT, 0, 0);
862         ok_hex_(create->style, g_ChildExpectStyle);
863         ok_hex_(create->dwExStyle, g_ChildExpectExStyle);
864     }
865     break;
866     case WM_NCCALCSIZE:
867     case WM_STYLECHANGING:
868     case WM_STYLECHANGED:
869     case WM_SIZE:
870         RECORD_MESSAGE(iwnd, message, SENT, wParam, 0);
871         break;
872     case WM_WINDOWPOSCHANGING:
873     case WM_WINDOWPOSCHANGED:
874         ok(wParam == 0,"expected wParam=0\n");
875         RECORD_MESSAGE(iwnd, message, SENT, ((WINDOWPOS*)lParam)->flags, 0);
876         break;
877     default:
878         RECORD_MESSAGE(iwnd, message, SENT, 0, 0);
879         break;
880     }
881     lRet = DefMDIChildProc(hWnd, message, wParam, lParam);
882     RECORD_MESSAGE(iwnd, message, SENT_RET, 0, 0);
883     return lRet;
884 }
885 
886 
887 static MSG_ENTRY child_create_chain_MDI[] =
888 {
889     { 1, WM_GETMINMAXINFO, SENT },
890     { 1, WM_GETMINMAXINFO, SENT_RET },
891     { 1, WM_NCCREATE, SENT },
892     { 1, WM_NCCREATE, SENT_RET },
893     { 1, WM_NCCALCSIZE, SENT },
894     { 1, WM_NCCALCSIZE, SENT_RET },
895     { 1, WM_CREATE, SENT },
896         { 1, WM_PARENTNOTIFY, SENT },
897         { 1, WM_PARENTNOTIFY, SENT_RET },
898         { 2, WM_GETMINMAXINFO, SENT },
899         { 2, WM_GETMINMAXINFO, SENT_RET },
900         { 2, WM_NCCREATE, SENT },
901         { 2, WM_NCCREATE, SENT_RET },
902         { 2, WM_NCCALCSIZE, SENT },
903         { 2, WM_NCCALCSIZE, SENT_RET },
904         { 2, WM_CREATE, SENT },
905         { 2, WM_CREATE, SENT_RET },
906         { 2, WM_SIZE, SENT },
907         { 2, WM_SIZE, SENT_RET },
908         { 2, WM_MOVE, SENT },
909         { 2, WM_MOVE, SENT_RET },
910         { 2, WM_GETMINMAXINFO, SENT },
911         { 2, WM_GETMINMAXINFO, SENT_RET },
912         { 2, WM_WINDOWPOSCHANGING, SENT, SWP_FRAMECHANGED | SWP_NOACTIVATE | 0x8000 },
913         { 2, WM_GETMINMAXINFO, SENT },
914         { 2, WM_GETMINMAXINFO, SENT_RET },
915         { 2, WM_WINDOWPOSCHANGING, SENT_RET },
916         { 2, WM_NCCALCSIZE, SENT, 1 },
917         { 2, WM_NCCALCSIZE, SENT_RET },
918         { 2, WM_WINDOWPOSCHANGED, SENT, SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOREDRAW | 0x8800 },
919             { 2, WM_MOVE, SENT },
920             { 2, WM_MOVE, SENT_RET },
921             { 2, WM_SIZE, SENT, SIZE_MAXIMIZED },
922                 { 1, WM_WINDOWPOSCHANGING, SENT, SWP_NOSIZE | SWP_NOZORDER | SWP_NOMOVE | SWP_FRAMECHANGED | SWP_NOACTIVATE },
923                 { 1, WM_WINDOWPOSCHANGING, SENT_RET },
924                 { 1, WM_NCCALCSIZE, SENT, TRUE },
925                 { 1, WM_NCCALCSIZE, SENT_RET },
926                 { 1, WM_WINDOWPOSCHANGED, SENT, SWP_NOSIZE | SWP_NOZORDER | SWP_NOMOVE | SWP_NOREDRAW | SWP_FRAMECHANGED | SWP_NOACTIVATE | 0x1800 },
927                 { 1, WM_WINDOWPOSCHANGED, SENT_RET },
928             { 2, WM_SIZE, SENT_RET },
929         { 2, WM_WINDOWPOSCHANGED, SENT_RET },
930         { 2, WM_NCCALCSIZE, SENT, TRUE },
931         { 2, WM_NCCALCSIZE, SENT_RET },
932         { 2, WM_SHOWWINDOW, SENT },
933         { 2, WM_SHOWWINDOW, SENT_RET },
934         { 2, WM_WINDOWPOSCHANGING, SENT, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE },
935         { 2, WM_WINDOWPOSCHANGING, SENT_RET },
936         { 2, WM_CHILDACTIVATE, SENT },
937         { 2, WM_WINDOWPOSCHANGING, SENT, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE },
938         { 2, WM_WINDOWPOSCHANGING, SENT_RET },
939         { 2, WM_MDIACTIVATE, SENT },
940         { 2, WM_MDIACTIVATE, SENT_RET },
941         { 2, WM_CHILDACTIVATE, SENT_RET },
942         { 1, WM_WINDOWPOSCHANGING, SENT, SWP_NOSIZE | SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE | SWP_FRAMECHANGED },
943         { 1, WM_WINDOWPOSCHANGING, SENT_RET },
944         { 1, WM_NCCALCSIZE, SENT, TRUE },
945         { 1, WM_NCCALCSIZE, SENT_RET },
946         { 1, WM_WINDOWPOSCHANGED, SENT, SWP_NOSIZE | SWP_NOZORDER | SWP_NOMOVE | SWP_NOREDRAW | SWP_FRAMECHANGED | SWP_NOACTIVATE | 0x1800 },
947         { 1, WM_WINDOWPOSCHANGED, SENT_RET },
948     { 1, WM_CREATE, SENT_RET },
949     { 0, 0 },
950 };
951 
952 static MSG_ENTRY child_create_chain_MDI_below8[] =
953 {
954     { 1, WM_GETMINMAXINFO, SENT },
955     { 1, WM_GETMINMAXINFO, SENT_RET },
956     { 1, WM_NCCREATE, SENT },
957     { 1, WM_NCCREATE, SENT_RET },
958     { 1, WM_NCCALCSIZE, SENT },
959     { 1, WM_NCCALCSIZE, SENT_RET },
960     { 1, WM_CREATE, SENT },
961         { 1, WM_PARENTNOTIFY, SENT },
962         { 1, WM_PARENTNOTIFY, SENT_RET },
963         { 2, WM_GETMINMAXINFO, SENT },
964         { 2, WM_GETMINMAXINFO, SENT_RET },
965         { 2, WM_NCCREATE, SENT },
966         { 2, WM_NCCREATE, SENT_RET },
967         { 2, WM_NCCALCSIZE, SENT },
968         { 2, WM_NCCALCSIZE, SENT_RET },
969         { 2, WM_CREATE, SENT },
970         { 2, WM_CREATE, SENT_RET },
971         { 2, WM_SIZE, SENT },
972         { 2, WM_SIZE, SENT_RET },
973         { 2, WM_MOVE, SENT },
974         { 2, WM_MOVE, SENT_RET },
975         { 2, WM_GETMINMAXINFO, SENT },
976         { 2, WM_GETMINMAXINFO, SENT_RET },
977         { 2, WM_WINDOWPOSCHANGING, SENT, SWP_FRAMECHANGED | SWP_NOACTIVATE | 0x8000 },
978         { 2, WM_GETMINMAXINFO, SENT },
979         { 2, WM_GETMINMAXINFO, SENT_RET },
980         { 2, WM_WINDOWPOSCHANGING, SENT_RET },
981         { 2, WM_NCCALCSIZE, SENT, 1 },
982         { 2, WM_NCCALCSIZE, SENT_RET },
983         { 2, WM_WINDOWPOSCHANGED, SENT, SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOREDRAW | 0x8800 },
984             { 2, WM_MOVE, SENT },
985             { 2, WM_MOVE, SENT_RET },
986             { 2, WM_SIZE, SENT, SIZE_MAXIMIZED },
987                 { 1, WM_WINDOWPOSCHANGING, SENT, SWP_NOSIZE | SWP_NOZORDER | SWP_NOMOVE | SWP_FRAMECHANGED | SWP_NOACTIVATE },
988                 { 1, WM_WINDOWPOSCHANGING, SENT_RET },
989                 { 1, WM_NCCALCSIZE, SENT, TRUE },
990                 { 1, WM_NCCALCSIZE, SENT_RET },
991                 { 1, WM_WINDOWPOSCHANGED, SENT, SWP_NOSIZE | SWP_NOZORDER | SWP_NOMOVE | SWP_NOREDRAW | SWP_FRAMECHANGED | SWP_NOACTIVATE | 0x1800 },
992                 { 1, WM_WINDOWPOSCHANGED, SENT_RET },
993             { 2, WM_SIZE, SENT_RET },
994         { 2, WM_WINDOWPOSCHANGED, SENT_RET },
995         //{ 2, WM_NCCALCSIZE, SENT, TRUE },
996         //{ 2, WM_NCCALCSIZE, SENT_RET },
997         { 2, WM_SHOWWINDOW, SENT },
998         { 2, WM_SHOWWINDOW, SENT_RET },
999         { 2, WM_WINDOWPOSCHANGING, SENT, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE },
1000         { 2, WM_WINDOWPOSCHANGING, SENT_RET },
1001         { 2, WM_CHILDACTIVATE, SENT },
1002         { 2, WM_WINDOWPOSCHANGING, SENT, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE },
1003         { 2, WM_WINDOWPOSCHANGING, SENT_RET },
1004         { 2, WM_MDIACTIVATE, SENT },
1005         { 2, WM_MDIACTIVATE, SENT_RET },
1006         { 2, WM_CHILDACTIVATE, SENT_RET },
1007         { 1, WM_WINDOWPOSCHANGING, SENT, SWP_NOSIZE | SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE | SWP_FRAMECHANGED },
1008         { 1, WM_WINDOWPOSCHANGING, SENT_RET },
1009         { 1, WM_NCCALCSIZE, SENT, TRUE },
1010         { 1, WM_NCCALCSIZE, SENT_RET },
1011         { 1, WM_WINDOWPOSCHANGED, SENT, SWP_NOSIZE | SWP_NOZORDER | SWP_NOMOVE | SWP_NOREDRAW | SWP_FRAMECHANGED | SWP_NOACTIVATE | 0x1800 },
1012         { 1, WM_WINDOWPOSCHANGED, SENT_RET },
1013     { 1, WM_CREATE, SENT_RET },
1014     { 0, 0 },
1015 };
1016 
1017 static MSG_ENTRY child_create_chain_MDI_below8_nonsrv[] =
1018 {
1019     { 1, WM_GETMINMAXINFO, SENT },
1020     { 1, WM_GETMINMAXINFO, SENT_RET },
1021     { 1, WM_NCCREATE, SENT },
1022     { 1, WM_NCCREATE, SENT_RET },
1023     { 1, WM_NCCALCSIZE, SENT },
1024     { 1, WM_NCCALCSIZE, SENT_RET },
1025     { 1, WM_CREATE, SENT },
1026         { 1, WM_PARENTNOTIFY, SENT },
1027         { 1, WM_PARENTNOTIFY, SENT_RET },
1028         { 2, WM_GETMINMAXINFO, SENT },
1029         { 2, WM_GETMINMAXINFO, SENT_RET },
1030         { 2, WM_NCCREATE, SENT },
1031         { 2, WM_NCCREATE, SENT_RET },
1032         { 2, WM_NCCALCSIZE, SENT },
1033         { 2, WM_NCCALCSIZE, SENT_RET },
1034         { 2, WM_CREATE, SENT },
1035         { 2, WM_CREATE, SENT_RET },
1036         { 2, WM_SIZE, SENT },
1037         { 2, WM_SIZE, SENT_RET },
1038         { 2, WM_MOVE, SENT },
1039         { 2, WM_MOVE, SENT_RET },
1040         { 2, WM_GETMINMAXINFO, SENT },
1041         { 2, WM_GETMINMAXINFO, SENT_RET },
1042         { 2, WM_WINDOWPOSCHANGING, SENT, SWP_FRAMECHANGED | SWP_NOACTIVATE | 0x8000 },
1043         { 2, WM_GETMINMAXINFO, SENT },
1044         { 2, WM_GETMINMAXINFO, SENT_RET },
1045         { 2, WM_WINDOWPOSCHANGING, SENT_RET },
1046         { 2, WM_NCCALCSIZE, SENT, 1 },
1047         { 2, WM_NCCALCSIZE, SENT_RET },
1048         { 2, WM_WINDOWPOSCHANGED, SENT, SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOREDRAW | 0x8800 },
1049             { 2, WM_MOVE, SENT },
1050             { 2, WM_MOVE, SENT_RET },
1051             { 2, WM_SIZE, SENT, SIZE_MAXIMIZED },
1052                 { 1, WM_WINDOWPOSCHANGING, SENT, SWP_NOSIZE | SWP_NOZORDER | SWP_NOMOVE | SWP_FRAMECHANGED | SWP_NOACTIVATE },
1053                 { 1, WM_WINDOWPOSCHANGING, SENT_RET },
1054                 { 1, WM_NCCALCSIZE, SENT, TRUE },
1055                 { 1, WM_NCCALCSIZE, SENT_RET },
1056                 { 1, WM_WINDOWPOSCHANGED, SENT, SWP_NOSIZE | SWP_NOZORDER | SWP_NOMOVE | SWP_NOREDRAW | SWP_FRAMECHANGED | SWP_NOACTIVATE | 0x1800 },
1057                 { 1, WM_WINDOWPOSCHANGED, SENT_RET },
1058                 // +
1059                 { 1, WM_NCCALCSIZE, SENT, TRUE },
1060                 { 1, WM_NCCALCSIZE, SENT_RET },
1061                 // -
1062             { 2, WM_SIZE, SENT_RET },
1063         { 2, WM_WINDOWPOSCHANGED, SENT_RET },
1064         { 2, WM_NCCALCSIZE, SENT, TRUE },
1065         { 2, WM_NCCALCSIZE, SENT_RET },
1066         { 2, WM_SHOWWINDOW, SENT },
1067         { 2, WM_SHOWWINDOW, SENT_RET },
1068         { 2, WM_WINDOWPOSCHANGING, SENT, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE },
1069         { 2, WM_WINDOWPOSCHANGING, SENT_RET },
1070         { 2, WM_CHILDACTIVATE, SENT },
1071         { 2, WM_WINDOWPOSCHANGING, SENT, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE },
1072         { 2, WM_WINDOWPOSCHANGING, SENT_RET },
1073         { 2, WM_MDIACTIVATE, SENT },
1074         { 2, WM_MDIACTIVATE, SENT_RET },
1075         { 2, WM_CHILDACTIVATE, SENT_RET },
1076         { 1, WM_WINDOWPOSCHANGING, SENT, SWP_NOSIZE | SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE | SWP_FRAMECHANGED },
1077         { 1, WM_WINDOWPOSCHANGING, SENT_RET },
1078         { 1, WM_NCCALCSIZE, SENT, TRUE },
1079         { 1, WM_NCCALCSIZE, SENT_RET },
1080         { 1, WM_WINDOWPOSCHANGED, SENT, SWP_NOSIZE | SWP_NOZORDER | SWP_NOMOVE | SWP_NOREDRAW | SWP_FRAMECHANGED | SWP_NOACTIVATE | 0x1800 },
1081         { 1, WM_WINDOWPOSCHANGED, SENT_RET },
1082     { 1, WM_CREATE, SENT_RET },
1083     { 0, 0 },
1084 };
1085 
1086 static void Test_Messages_MDI_Child(void)
1087 {
1088     HWND hWnd;
1089 
1090     BOOL Below8 = !IsWindows8OrGreater();
1091     BOOL Below8NonServer = !IsWindows8OrGreater() && !IsWindowsServer();
1092 
1093     RegisterSimpleClass(MSGTestProcMDI2, L"Test_Message_MDI_Window_X2");
1094     RegisterSimpleClass(MSGChildProcMDI2, L"Test_Message_MDI_Window_Child2");
1095 
1096     g_ExpectStyle = g_NcExpectStyle = 0;
1097     g_ExpectExStyle = g_NcExpectExStyle = WS_EX_CLIENTEDGE;
1098     g_ChildExpectStyle = g_ChildNcExpectStyle = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_MAXIMIZE | WS_OVERLAPPEDWINDOW;
1099     g_ChildExpectExStyle = g_ChildNcExpectExStyle = WS_EX_WINDOWEDGE | WS_EX_MDICHILD;
1100     g_FaultLine = __LINE__ + 1;
1101     hWnd = CreateWindowExW(WS_EX_CLIENTEDGE, L"Test_Message_MDI_Window_X2", L"", 0, 10, 20,
1102                            200, 210, NULL, NULL, 0, NULL);
1103 
1104     ok(hWnd == g_TestWindow, "We are testing with %p instead of %p\n", g_TestWindow, hWnd);
1105     COMPARE_CACHE(Below8NonServer ? (child_create_chain_MDI_below8_nonsrv) : (Below8 ? child_create_chain_MDI_below8 : child_create_chain_MDI));
1106     DestroyWindow(hWnd);
1107     g_TestWindow = g_ChildWindow = NULL;
1108     EMPTY_CACHE();
1109 
1110     g_ExpectStyle = g_NcExpectStyle = WS_OVERLAPPEDWINDOW;
1111     g_ExpectExStyle = g_NcExpectExStyle = WS_EX_OVERLAPPEDWINDOW;
1112     g_ChildExpectStyle = g_ChildNcExpectStyle = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_MAXIMIZE | WS_OVERLAPPEDWINDOW;
1113     g_ChildExpectExStyle = g_ChildNcExpectExStyle = WS_EX_WINDOWEDGE | WS_EX_MDICHILD;
1114     g_FaultLine = __LINE__ + 1;
1115     hWnd = CreateWindowExW(WS_EX_CLIENTEDGE, L"Test_Message_MDI_Window_X2", L"", WS_OVERLAPPEDWINDOW, 10, 20,
1116                            200, 210, NULL, NULL, 0, NULL);
1117 
1118     ok(hWnd == g_TestWindow, "We are testing with %p instead of %p\n", g_TestWindow, hWnd);
1119     COMPARE_CACHE(Below8NonServer ? (child_create_chain_MDI_below8_nonsrv) : (Below8 ? child_create_chain_MDI_below8 : child_create_chain_MDI));
1120     DestroyWindow(hWnd);
1121     g_TestWindow = g_ChildWindow = NULL;
1122     EMPTY_CACHE();
1123 
1124     UnregisterClassW(L"Test_Message_Window_X2", NULL);
1125     UnregisterClassW(L"Test_Message_MDI_Window_Child2", NULL);
1126 }
1127 
1128 
1129 START_TEST(CreateWindowEx)
1130 {
1131     Test_Params();
1132     Test_Messages();
1133     Test_Messages_Child();
1134     Test_Messages_MDI();
1135     Test_Messages_MDI_Child();
1136 }
1137