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/wi... ============================================================================== --- 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/di... ============================================================================== --- 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/wi... ============================================================================== --- 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; }
/*