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/w…
==============================================================================
--- 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/d…
==============================================================================
--- 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/w…
==============================================================================
--- 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;
}
/*