Add a prototype for MDI message tests
Dmitry Timoshkov
dmitry at baikal.ru
Mon Jun 21 10:09:19 CDT 2004
Hello,
this test passes for me under Win95OSR2, Win98SE and Win2kSP4.
Changelog:
Dmitry Timoshkov <dmitry at codeweavers.com>
Add a prototype for MDI message tests.
--- cvs/hq/wine/dlls/user/tests/msg.c Sat Jun 19 03:51:22 2004
+++ wine/dlls/user/tests/msg.c Mon Jun 21 15:06:11 2004
@@ -739,6 +739,233 @@ static void ok_sequence(const struct mes
flush_sequence();
}
+/******************************** MDI test **********************************/
+
+/* CreateWindow for MDI frame window, initially visible */
+static const struct message WmCreateMDIframeSeq[] = {
+ { HCBT_CREATEWND, hook },
+ { WM_GETMINMAXINFO, sent },
+ { WM_NCCREATE, sent },
+ { WM_NCCALCSIZE, sent|wparam, 0 },
+ { WM_CREATE, sent },
+ { WM_SHOWWINDOW, sent|wparam, 1 },
+ { WM_WINDOWPOSCHANGING, sent|wparam, 0 },
+ { HCBT_ACTIVATE, hook },
+ { WM_QUERYNEWPALETTE, sent|wparam|lparam|optional, 0, 0 },
+ { WM_WINDOWPOSCHANGING, sent|wparam, 0 },
+ { WM_ACTIVATEAPP, sent|wparam, 1 },
+ { WM_NCACTIVATE, sent|wparam, 1 },
+ { WM_ACTIVATE, sent|wparam, 1 },
+ { HCBT_SETFOCUS, hook },
+ { WM_IME_SETCONTEXT, sent|wparam|defwinproc|optional, 1 },
+ { WM_SETFOCUS, sent|wparam|defwinproc, 0 },
+ { WM_WINDOWPOSCHANGED, sent|wparam, 0 },
+ { WM_SIZE, sent },
+ { WM_MOVE, sent },
+ { 0 }
+};
+/* CreateWindow for MDI client window, initially visible */
+static const struct message WmCreateMDIclientSeq[] = {
+ { HCBT_CREATEWND, hook },
+ { WM_NCCREATE, sent },
+ { WM_NCCALCSIZE, sent }, /*|wparam, 8 },*/
+ { WM_CREATE, sent },
+ { WM_SIZE, sent },
+ { WM_MOVE, sent },
+ { WM_PARENTNOTIFY, sent|wparam, WM_CREATE }, /* in MDI frame */
+ { WM_SHOWWINDOW, sent }, /*|wparam, 8 },*/
+ { WM_WINDOWPOSCHANGING, sent }, /*|wparam, 8 },*/
+ { WM_WINDOWPOSCHANGED, sent }, /*|wparam, 8 },*/
+ { 0 }
+};
+/* CreateWindow for MDI child window, initially visible */
+static const struct message WmCreateMDIchildSeq[] = {
+ { HCBT_CREATEWND, hook },
+ { WM_GETMINMAXINFO, sent },
+ { WM_NCCREATE, sent },
+ { WM_NCCALCSIZE, sent|wparam, 0 },
+ { WM_CREATE, sent },
+ { WM_SIZE, sent },
+ { WM_MOVE, sent },
+ { WM_PARENTNOTIFY, sent|wparam, WM_KILLFOCUS }, /* in MDI client */
+ { WM_SHOWWINDOW, sent|wparam, 1 },
+ { WM_WINDOWPOSCHANGING, sent|wparam, 0 },
+ { WM_WINDOWPOSCHANGED, sent|wparam, 0 },
+ { WM_MDIREFRESHMENU, sent/*|wparam|lparam, 0, 0*/ },
+ { WM_WINDOWPOSCHANGING, sent|wparam, 0 },
+ { WM_CHILDACTIVATE, sent|wparam|lparam, 0, 0 },
+ { WM_WINDOWPOSCHANGING, sent|wparam|defwinproc, 0 },
+ { WM_NCACTIVATE, sent|wparam|defwinproc, 1 },
+ { HCBT_SETFOCUS, hook }, /* in MDI client */
+ { WM_KILLFOCUS, sent }, /* in MDI frame */
+ { WM_IME_SETCONTEXT, sent|wparam|optional, 0 }, /* in MDI frame */
+ { WM_IME_SETCONTEXT, sent|wparam|optional, 8 }, /* in MDI client */
+ { WM_SETFOCUS, sent }, /* in MDI client */
+ { HCBT_SETFOCUS, hook },
+ { WM_KILLFOCUS, sent }, /* in MDI client */
+ { WM_IME_SETCONTEXT, sent|wparam|optional, 8 }, /* in MDI client */
+ { WM_IME_SETCONTEXT, sent|wparam|defwinproc|optional, 1 },
+ { WM_SETFOCUS, sent|defwinproc },
+ { WM_MDIACTIVATE, sent|defwinproc },
+ { 0 }
+};
+
+static HWND mdi_client;
+static WNDPROC old_mdi_client_proc;
+
+static LRESULT WINAPI mdi_client_hook_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ struct message msg;
+
+ /* do not log painting messages */
+ if (message != WM_PAINT &&
+ message != WM_ERASEBKGND &&
+ message != WM_NCPAINT &&
+ message != WM_GETTEXT)
+ {
+ trace("mdi client: %p, %04x, %08x, %08lx\n", hwnd, message, wParam, lParam);
+
+ msg.message = message;
+ msg.flags = sent|wparam|lparam;
+ msg.wParam = wparam;
+ msg.lParam = lparam;
+ add_message(&msg);
+ }
+
+ return CallWindowProcA(old_mdi_client_proc, hwnd, message, wParam, lParam);
+}
+
+static LRESULT WINAPI mdi_child_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ static long defwndproc_counter = 0;
+ LRESULT ret;
+ struct message msg;
+
+ /* do not log painting messages */
+ if (message != WM_PAINT &&
+ message != WM_ERASEBKGND &&
+ message != WM_NCPAINT &&
+ message != WM_GETTEXT)
+ {
+ trace("mdi child: %p, %04x, %08x, %08lx\n", hwnd, message, wParam, lParam);
+
+ msg.message = message;
+ msg.flags = sent|wparam|lparam;
+ if (defwndproc_counter) msg.flags |= defwinproc;
+ msg.wParam = wParam;
+ msg.lParam = lParam;
+ add_message(&msg);
+ }
+
+ defwndproc_counter++;
+ ret = DefMDIChildProcA(hwnd, message, wParam, lParam);
+ defwndproc_counter--;
+
+ return ret;
+}
+
+static LRESULT WINAPI mdi_frame_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ static long defwndproc_counter = 0;
+ LRESULT ret;
+ struct message msg;
+
+ /* do not log painting messages */
+ if (message != WM_PAINT &&
+ message != WM_ERASEBKGND &&
+ message != WM_NCPAINT &&
+ message != WM_GETTEXT)
+ {
+ trace("mdi frame: %p, %04x, %08x, %08lx\n", hwnd, message, wParam, lParam);
+
+ msg.message = message;
+ msg.flags = sent|wparam|lparam;
+ if (defwndproc_counter) msg.flags |= defwinproc;
+ msg.wParam = wParam;
+ msg.lParam = lParam;
+ add_message(&msg);
+ }
+
+ defwndproc_counter++;
+ ret = DefFrameProcA(hwnd, mdi_client, message, wParam, lParam);
+ defwndproc_counter--;
+
+ return ret;
+}
+
+static BOOL mdi_RegisterWindowClasses(void)
+{
+ WNDCLASSA cls;
+
+ cls.style = 0;
+ cls.lpfnWndProc = mdi_frame_wnd_proc;
+ cls.cbClsExtra = 0;
+ cls.cbWndExtra = 0;
+ cls.hInstance = GetModuleHandleA(0);
+ cls.hIcon = 0;
+ cls.hCursor = LoadCursorA(0, (LPSTR)IDC_ARROW);
+ cls.hbrBackground = GetStockObject(WHITE_BRUSH);
+ cls.lpszMenuName = NULL;
+ cls.lpszClassName = "MDI_frame_class";
+ if (!RegisterClassA(&cls)) return FALSE;
+
+ cls.lpfnWndProc = mdi_child_wnd_proc;
+ cls.lpszClassName = "MDI_child_class";
+ if (!RegisterClassA(&cls)) return FALSE;
+
+ if (!GetClassInfoA(0, "MDIClient", &cls)) assert(0);
+ old_mdi_client_proc = cls.lpfnWndProc;
+ cls.hInstance = GetModuleHandleA(0);
+ cls.lpfnWndProc = mdi_client_hook_proc;
+ cls.lpszClassName = "MDI_client_class";
+ if (!RegisterClassA(&cls)) assert(0);
+
+ return TRUE;
+}
+
+static void test_mdi_messages(void)
+{
+ CLIENTCREATESTRUCT client_cs;
+ HWND mdi_frame, mdi_child;
+
+ assert(mdi_RegisterWindowClasses());
+
+ flush_sequence();
+
+ trace("creating MDI frame window\n");
+ mdi_frame = CreateWindowExA(0, "MDI_frame_class", "MDI frame window",
+ WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX |
+ WS_MAXIMIZEBOX | WS_VISIBLE,
+ 100, 100, CW_USEDEFAULT, CW_USEDEFAULT,
+ GetDesktopWindow(), 0,
+ GetModuleHandleA(0), NULL);
+ assert(mdi_frame);
+ ok_sequence(WmCreateMDIframeSeq, "Create MDI frame window");
+
+ trace("creating MDI client window\n");
+ client_cs.hWindowMenu = 0;
+ client_cs.idFirstChild = 1;
+ mdi_client = CreateWindowExA(0, "MDI_client_class",
+ NULL,
+ WS_CHILD | WS_VISIBLE,
+ 0, 0, 0, 0,
+ mdi_frame, 0, GetModuleHandleA(0), &client_cs);
+ assert(mdi_client);
+ ok_sequence(WmCreateMDIclientSeq, "Create MDI client window");
+
+ trace("creating MDI child window\n");
+ mdi_child = CreateWindowExA(WS_EX_MDICHILD, "MDI_child_class", "MDI child",
+ WS_CHILD | WS_VISIBLE,
+ 0, 0, CW_USEDEFAULT, CW_USEDEFAULT,
+ mdi_client, 0, GetModuleHandleA(0), NULL);
+ assert(mdi_child);
+ ok_sequence(WmCreateMDIchildSeq, "Create MDI child window");
+
+ DestroyWindow(mdi_child);
+ DestroyWindow(mdi_frame);
+}
+/************************* End of MDI test **********************************/
+
static void test_WM_SETREDRAW(HWND hwnd)
{
DWORD style = GetWindowLongA(hwnd, GWL_STYLE);
@@ -1180,6 +1407,9 @@ static LRESULT CALLBACK cbt_hook_proc(in
!strcmp(buf, "TestPopupClass") ||
!strcmp(buf, "SimpleWindowClass") ||
!strcmp(buf, "TestDialogClass") ||
+ !strcmp(buf, "MDI_frame_class") ||
+ !strcmp(buf, "MDI_client_class") ||
+ !strcmp(buf, "MDI_child_class") ||
!strcmp(buf, "#32770"))
{
struct message msg;
@@ -1202,6 +1432,7 @@ START_TEST(msg)
assert(hCBT_hook);
test_messages();
+ test_mdi_messages();
UnhookWindowsHookEx(hCBT_hook);
}
More information about the wine-patches
mailing list