[ros-diffs] [weiden] 27707: Fix the dialog manager to ignore WS_EX_MDICHILD. See issue #2289 for more details.

weiden at svn.reactos.org weiden at svn.reactos.org
Tue Jul 17 15:52:36 CEST 2007


Author: weiden
Date: Tue Jul 17 17:52:36 2007
New Revision: 27707

URL: http://svn.reactos.org/svn/reactos?rev=27707&view=rev
Log:
Fix the dialog manager to ignore WS_EX_MDICHILD.
See issue #2289 for more details.

Modified:
    trunk/reactos/dll/win32/user32/include/window.h
    trunk/reactos/dll/win32/user32/windows/dialog.c
    trunk/reactos/dll/win32/user32/windows/window.c

Modified: trunk/reactos/dll/win32/user32/include/window.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/include/window.h?rev=27707&r1=27706&r2=27707&view=diff
==============================================================================
--- trunk/reactos/dll/win32/user32/include/window.h (original)
+++ trunk/reactos/dll/win32/user32/include/window.h Tue Jul 17 17:52:36 2007
@@ -48,3 +48,18 @@
 LRESULT FASTCALL IntCallWindowProcW(BOOL IsAnsiProc, WNDPROC WndProc,
                                     HWND hWnd, UINT Msg, WPARAM wParam,
                                     LPARAM lParam);
+
+HWND STDCALL
+User32CreateWindowEx(DWORD dwExStyle,
+		LPCSTR lpClassName,
+		LPCSTR lpWindowName,
+		DWORD dwStyle,
+		int x,
+		int y,
+		int nWidth,
+		int nHeight,
+		HWND hWndParent,
+		HMENU hMenu,
+		HINSTANCE hInstance,
+		LPVOID lpParam,
+		BOOL Unicode);

Modified: trunk/reactos/dll/win32/user32/windows/dialog.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/windows/dialog.c?rev=27707&r1=27706&r2=27707&view=diff
==============================================================================
--- trunk/reactos/dll/win32/user32/windows/dialog.c (original)
+++ trunk/reactos/dll/win32/user32/windows/dialog.c Tue Jul 17 17:52:36 2007
@@ -734,10 +734,11 @@
 
     if (unicode)
     {
-        hwnd = CreateWindowExW(template.exStyle, template.className, template.caption,
-                               template.style & ~WS_VISIBLE,
-                               rect.left, rect.top, rect.right, rect.bottom,
-                               owner, hMenu, hInst, NULL );
+        hwnd = User32CreateWindowEx(template.exStyle, template.className, template.caption,
+                                    template.style & ~WS_VISIBLE,
+                                    rect.left, rect.top, rect.right, rect.bottom,
+                                    owner, hMenu, hInst, NULL,
+                                    TRUE);
     }
     else
     {
@@ -756,10 +757,11 @@
             caption = HeapAlloc( GetProcessHeap(), 0, len );
             WideCharToMultiByte( CP_ACP, 0, template.caption, -1, caption, len, NULL, NULL );
         }
-        hwnd = CreateWindowExA(template.exStyle, class, caption,
-                               template.style & ~WS_VISIBLE,
-                               rect.left, rect.top, rect.right, rect.bottom,
-                               owner, hMenu, hInst, NULL );
+        hwnd = User32CreateWindowEx(template.exStyle, class, caption,
+                                    template.style & ~WS_VISIBLE,
+                                    rect.left, rect.top, rect.right, rect.bottom,
+                                    owner, hMenu, hInst, NULL,
+                                    FALSE);
         if (HIWORD(class)) HeapFree( GetProcessHeap(), 0, class );
         if (HIWORD(caption)) HeapFree( GetProcessHeap(), 0, caption );
     }

Modified: trunk/reactos/dll/win32/user32/windows/window.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/windows/window.c?rev=27707&r1=27706&r2=27707&view=diff
==============================================================================
--- trunk/reactos/dll/win32/user32/windows/window.c (original)
+++ trunk/reactos/dll/win32/user32/windows/window.c Tue Jul 17 17:52:36 2007
@@ -162,7 +162,6 @@
   WNDCLASSEXA wceA;
   WNDCLASSEXW wceW;
   HWND Handle;
-  MDICREATESTRUCTA mdi;
 
 #if 0
   DbgPrint("[window] User32CreateWindowEx style %d, exstyle %d, parent %d\n", dwStyle, dwExStyle, hWndParent);
@@ -192,76 +191,6 @@
     {
       ControlsInitialized = ControlsInit(ClassName.Buffer);
     }
-
-  if (dwExStyle & WS_EX_MDICHILD)
-  {
-      POINT mPos[2];
-      UINT id = 0;
-  /* lpParams of WM_[NC]CREATE is different for MDI children.
-   * MDICREATESTRUCT members have the originally passed values.
-   *
-   * Note: we rely on the fact that MDICREATESTRUCTA and MDICREATESTRUCTW
-   * have the same layout.
-   */
-      mdi.szClass = (LPCSTR)lpClassName;
-      mdi.szTitle = (LPCSTR)lpWindowName;
-      mdi.hOwner = hInstance;
-      mdi.x = x;
-      mdi.y = y;
-      mdi.cx = nWidth;
-      mdi.cy = nHeight;
-      mdi.style = dwStyle;
-      mdi.lParam = (LPARAM)lpParam;
-
-      lpParam = (LPVOID)&mdi;
-
-      if (GetWindowLongW(hWndParent, GWL_STYLE) & MDIS_ALLCHILDSTYLES)
-      {
-        if (dwStyle & WS_POPUP)
-        {
-           DPRINT1("WS_POPUP with MDIS_ALLCHILDSTYLES is not allowed\n");
-           return(0);
-        }
-        dwStyle |= (WS_CHILD | WS_CLIPSIBLINGS);
-      }
-      else
-      {
-        dwStyle &= ~WS_POPUP;
-        dwStyle |= (WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CAPTION |
-                WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX);
-      }
-
-      HWND top_child = GetWindow(hWndParent, GW_CHILD);
-
-      if (top_child)
-      {
-        /* Restore current maximized child */
-        if((dwStyle & WS_VISIBLE) && IsZoomed(top_child))
-        {
-           DPRINT("Restoring current maximized child %p\n", top_child);
-           SendMessageW( top_child, WM_SETREDRAW, FALSE, 0 );
-           ShowWindow(top_child, SW_RESTORE);
-           SendMessageW( top_child, WM_SETREDRAW, TRUE, 0 );
-        }
-      }
-    
-      MDI_CalcDefaultChildPos(hWndParent, -1, mPos, 0, &id);
-
-      if (!(dwStyle & WS_POPUP)) hMenu = (HMENU)id;
-
-      if (dwStyle & (WS_CHILD | WS_POPUP))
-      {
-         if (x == CW_USEDEFAULT || x == CW_USEDEFAULT16)
-         {
-            x = mPos[0].x;
-            y = mPos[0].y;
-         }
-         if (nWidth == CW_USEDEFAULT || nWidth == CW_USEDEFAULT16 || !nWidth)
-             nWidth = mPos[1].x;
-         if (nHeight == CW_USEDEFAULT || nHeight == CW_USEDEFAULT16 || !nHeight)
-             nHeight = mPos[1].y;
-      }
-  }
 
   if (Unicode)
     RtlInitUnicodeString(&WindowName, (PCWSTR)lpWindowName);
@@ -284,8 +213,8 @@
     {
        wceW.cbSize = sizeof(WNDCLASSEXW);
        if(GetClassInfoExW(hInstance, (LPCWSTR)lpClassName, &wceW) && wceW.lpszMenuName)
-       {DbgPrint("LoadingMenu 0x%p %d\n", wceW.lpszMenuName, IS_INTRESOURCE(wceW.lpszMenuName));
-       hMenu = LoadMenuW(hInstance, wceW.lpszMenuName);DbgPrint("Loaded menu: 0x%p\n", hMenu);
+       {
+       hMenu = LoadMenuW(hInstance, wceW.lpszMenuName);
        }
     }
     else
@@ -317,13 +246,6 @@
   DbgPrint("[window] NtUserCreateWindowEx() == %d\n", Handle);
 #endif
 
-   if ((dwStyle & WS_VISIBLE) && (dwExStyle & WS_EX_MDICHILD) && Handle != (HWND)0)
-   {
-      SendMessageW(hWndParent, WM_MDIREFRESHMENU, 0, 0);
-      SetWindowPos(Handle, HWND_TOP, 0, 0, 0, 0, SWP_SHOWWINDOW |
-                                                SWP_NOMOVE | SWP_NOSIZE);
-   }
-
   if(!Unicode)
   {
     RtlFreeUnicodeString(&WindowName);
@@ -354,19 +276,98 @@
 		HINSTANCE hInstance,
 		LPVOID lpParam)
 {
-   return User32CreateWindowEx(dwExStyle,
-                               lpClassName,
-                               lpWindowName,
-                               dwStyle,
-                               x,
-                               y,
-                               nWidth,
-                               nHeight,
-                               hWndParent,
-                               hMenu,
-                               hInstance,
-                               lpParam,
-                               FALSE);
+    MDICREATESTRUCTA mdi;
+    HWND hwnd;
+
+    if (dwExStyle & WS_EX_MDICHILD)
+    {
+        POINT mPos[2];
+        UINT id = 0;
+
+        /* lpParams of WM_[NC]CREATE is different for MDI children.
+        * MDICREATESTRUCT members have the originally passed values.
+        */
+        mdi.szClass = lpClassName;
+        mdi.szTitle = lpWindowName;
+        mdi.hOwner = hInstance;
+        mdi.x = x;
+        mdi.y = y;
+        mdi.cx = nWidth;
+        mdi.cy = nHeight;
+        mdi.style = dwStyle;
+        mdi.lParam = (LPARAM)lpParam;
+
+        lpParam = (LPVOID)&mdi;
+
+        if (GetWindowLongW(hWndParent, GWL_STYLE) & MDIS_ALLCHILDSTYLES)
+        {
+            if (dwStyle & WS_POPUP)
+            {
+                DPRINT1("WS_POPUP with MDIS_ALLCHILDSTYLES is not allowed\n");
+                return(0);
+            }
+            dwStyle |= (WS_CHILD | WS_CLIPSIBLINGS);
+        }
+        else
+        {
+            dwStyle &= ~WS_POPUP;
+            dwStyle |= (WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CAPTION |
+                WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX);
+        }
+
+        HWND top_child = GetWindow(hWndParent, GW_CHILD);
+
+        if (top_child)
+        {
+            /* Restore current maximized child */
+            if((dwStyle & WS_VISIBLE) && IsZoomed(top_child))
+            {
+                DPRINT("Restoring current maximized child %p\n", top_child);
+                SendMessageW( top_child, WM_SETREDRAW, FALSE, 0 );
+                ShowWindow(top_child, SW_RESTORE);
+                SendMessageW( top_child, WM_SETREDRAW, TRUE, 0 );
+            }
+        }
+
+        MDI_CalcDefaultChildPos(hWndParent, -1, mPos, 0, &id);
+
+        if (!(dwStyle & WS_POPUP)) hMenu = (HMENU)id;
+
+        if (dwStyle & (WS_CHILD | WS_POPUP))
+        {
+            if (x == CW_USEDEFAULT || x == CW_USEDEFAULT16)
+            {
+                x = mPos[0].x;
+                y = mPos[0].y;
+            }
+            if (nWidth == CW_USEDEFAULT || nWidth == CW_USEDEFAULT16 || !nWidth)
+                nWidth = mPos[1].x;
+            if (nHeight == CW_USEDEFAULT || nHeight == CW_USEDEFAULT16 || !nHeight)
+                nHeight = mPos[1].y;
+        }
+    }
+
+    hwnd = User32CreateWindowEx(dwExStyle,
+                                lpClassName,
+                                lpWindowName,
+                                dwStyle,
+                                x,
+                                y,
+                                nWidth,
+                                nHeight,
+                                hWndParent,
+                                hMenu,
+                                hInstance,
+                                lpParam,
+                                FALSE);
+
+    if ((dwStyle & WS_VISIBLE) && (dwExStyle & WS_EX_MDICHILD) && hwnd != (HWND)0)
+    {
+        SendMessageW(hWndParent, WM_MDIREFRESHMENU, 0, 0);
+        SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE);
+    }
+
+    return hwnd;
 }
 
 
@@ -387,19 +388,98 @@
 		HINSTANCE hInstance,
 		LPVOID lpParam)
 {
-   return User32CreateWindowEx(dwExStyle,
-                               (LPCSTR) lpClassName,
-                               (LPCSTR) lpWindowName,
-                               dwStyle,
-                               x,
-                               y,
-                               nWidth,
-                               nHeight,
-                               hWndParent,
-                               hMenu,
-                               hInstance,
-                               lpParam,
-                               TRUE);
+    MDICREATESTRUCTW mdi;
+    HWND hwnd;
+
+    if (dwExStyle & WS_EX_MDICHILD)
+    {
+        POINT mPos[2];
+        UINT id = 0;
+
+        /* lpParams of WM_[NC]CREATE is different for MDI children.
+        * MDICREATESTRUCT members have the originally passed values.
+        */
+        mdi.szClass = lpClassName;
+        mdi.szTitle = lpWindowName;
+        mdi.hOwner = hInstance;
+        mdi.x = x;
+        mdi.y = y;
+        mdi.cx = nWidth;
+        mdi.cy = nHeight;
+        mdi.style = dwStyle;
+        mdi.lParam = (LPARAM)lpParam;
+
+        lpParam = (LPVOID)&mdi;
+
+        if (GetWindowLongW(hWndParent, GWL_STYLE) & MDIS_ALLCHILDSTYLES)
+        {
+            if (dwStyle & WS_POPUP)
+            {
+                DPRINT1("WS_POPUP with MDIS_ALLCHILDSTYLES is not allowed\n");
+                return(0);
+            }
+            dwStyle |= (WS_CHILD | WS_CLIPSIBLINGS);
+        }
+        else
+        {
+            dwStyle &= ~WS_POPUP;
+            dwStyle |= (WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CAPTION |
+                WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX);
+        }
+
+        HWND top_child = GetWindow(hWndParent, GW_CHILD);
+
+        if (top_child)
+        {
+            /* Restore current maximized child */
+            if((dwStyle & WS_VISIBLE) && IsZoomed(top_child))
+            {
+                DPRINT("Restoring current maximized child %p\n", top_child);
+                SendMessageW( top_child, WM_SETREDRAW, FALSE, 0 );
+                ShowWindow(top_child, SW_RESTORE);
+                SendMessageW( top_child, WM_SETREDRAW, TRUE, 0 );
+            }
+        }
+
+        MDI_CalcDefaultChildPos(hWndParent, -1, mPos, 0, &id);
+
+        if (!(dwStyle & WS_POPUP)) hMenu = (HMENU)id;
+
+        if (dwStyle & (WS_CHILD | WS_POPUP))
+        {
+            if (x == CW_USEDEFAULT || x == CW_USEDEFAULT16)
+            {
+                x = mPos[0].x;
+                y = mPos[0].y;
+            }
+            if (nWidth == CW_USEDEFAULT || nWidth == CW_USEDEFAULT16 || !nWidth)
+                nWidth = mPos[1].x;
+            if (nHeight == CW_USEDEFAULT || nHeight == CW_USEDEFAULT16 || !nHeight)
+                nHeight = mPos[1].y;
+        }
+    }
+
+    hwnd = User32CreateWindowEx(dwExStyle,
+                                (LPCSTR) lpClassName,
+                                (LPCSTR) lpWindowName,
+                                dwStyle,
+                                x,
+                                y,
+                                nWidth,
+                                nHeight,
+                                hWndParent,
+                                hMenu,
+                                hInstance,
+                                lpParam,
+                                TRUE);
+
+    if ((dwStyle & WS_VISIBLE) && (dwExStyle & WS_EX_MDICHILD) && hwnd != (HWND)0)
+    {
+        SendMessageW(hWndParent, WM_MDIREFRESHMENU, 0, 0);
+        SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE);
+    }
+
+    return hwnd;
 }
 
 /*




More information about the Ros-diffs mailing list