Fix the dialog manager to ignore WS_EX_MDICHILD.

See issue #2289 for more details.

svn path=/trunk/; revision=27707
This commit is contained in:
Thomas Bluemel 2007-07-17 13:52:36 +00:00
parent 14e9f977d9
commit d68854511a
3 changed files with 211 additions and 114 deletions

View file

@ -48,3 +48,18 @@ SCROLL_HitTest( HWND hwnd, INT nBar, POINT pt, BOOL bDragging );
LRESULT FASTCALL IntCallWindowProcW(BOOL IsAnsiProc, WNDPROC WndProc, LRESULT FASTCALL IntCallWindowProcW(BOOL IsAnsiProc, WNDPROC WndProc,
HWND hWnd, UINT Msg, WPARAM wParam, HWND hWnd, UINT Msg, WPARAM wParam,
LPARAM lParam); 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);

View file

@ -734,10 +734,11 @@ static HWND DIALOG_CreateIndirect( HINSTANCE hInst, LPCVOID dlgTemplate,
if (unicode) if (unicode)
{ {
hwnd = CreateWindowExW(template.exStyle, template.className, template.caption, hwnd = User32CreateWindowEx(template.exStyle, template.className, template.caption,
template.style & ~WS_VISIBLE, template.style & ~WS_VISIBLE,
rect.left, rect.top, rect.right, rect.bottom, rect.left, rect.top, rect.right, rect.bottom,
owner, hMenu, hInst, NULL ); owner, hMenu, hInst, NULL,
TRUE);
} }
else else
{ {
@ -756,10 +757,11 @@ static HWND DIALOG_CreateIndirect( HINSTANCE hInst, LPCVOID dlgTemplate,
caption = HeapAlloc( GetProcessHeap(), 0, len ); caption = HeapAlloc( GetProcessHeap(), 0, len );
WideCharToMultiByte( CP_ACP, 0, template.caption, -1, caption, len, NULL, NULL ); WideCharToMultiByte( CP_ACP, 0, template.caption, -1, caption, len, NULL, NULL );
} }
hwnd = CreateWindowExA(template.exStyle, class, caption, hwnd = User32CreateWindowEx(template.exStyle, class, caption,
template.style & ~WS_VISIBLE, template.style & ~WS_VISIBLE,
rect.left, rect.top, rect.right, rect.bottom, rect.left, rect.top, rect.right, rect.bottom,
owner, hMenu, hInst, NULL ); owner, hMenu, hInst, NULL,
FALSE);
if (HIWORD(class)) HeapFree( GetProcessHeap(), 0, class ); if (HIWORD(class)) HeapFree( GetProcessHeap(), 0, class );
if (HIWORD(caption)) HeapFree( GetProcessHeap(), 0, caption ); if (HIWORD(caption)) HeapFree( GetProcessHeap(), 0, caption );
} }

View file

@ -162,7 +162,6 @@ User32CreateWindowEx(DWORD dwExStyle,
WNDCLASSEXA wceA; WNDCLASSEXA wceA;
WNDCLASSEXW wceW; WNDCLASSEXW wceW;
HWND Handle; HWND Handle;
MDICREATESTRUCTA mdi;
#if 0 #if 0
DbgPrint("[window] User32CreateWindowEx style %d, exstyle %d, parent %d\n", dwStyle, dwExStyle, hWndParent); DbgPrint("[window] User32CreateWindowEx style %d, exstyle %d, parent %d\n", dwStyle, dwExStyle, hWndParent);
@ -193,76 +192,6 @@ User32CreateWindowEx(DWORD dwExStyle,
ControlsInitialized = ControlsInit(ClassName.Buffer); 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) if (Unicode)
RtlInitUnicodeString(&WindowName, (PCWSTR)lpWindowName); RtlInitUnicodeString(&WindowName, (PCWSTR)lpWindowName);
else else
@ -284,8 +213,8 @@ User32CreateWindowEx(DWORD dwExStyle,
{ {
wceW.cbSize = sizeof(WNDCLASSEXW); wceW.cbSize = sizeof(WNDCLASSEXW);
if(GetClassInfoExW(hInstance, (LPCWSTR)lpClassName, &wceW) && wceW.lpszMenuName) 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 else
@ -317,13 +246,6 @@ User32CreateWindowEx(DWORD dwExStyle,
DbgPrint("[window] NtUserCreateWindowEx() == %d\n", Handle); DbgPrint("[window] NtUserCreateWindowEx() == %d\n", Handle);
#endif #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) if(!Unicode)
{ {
RtlFreeUnicodeString(&WindowName); RtlFreeUnicodeString(&WindowName);
@ -354,19 +276,98 @@ CreateWindowExA(DWORD dwExStyle,
HINSTANCE hInstance, HINSTANCE hInstance,
LPVOID lpParam) LPVOID lpParam)
{ {
return User32CreateWindowEx(dwExStyle, MDICREATESTRUCTA mdi;
lpClassName, HWND hwnd;
lpWindowName,
dwStyle, if (dwExStyle & WS_EX_MDICHILD)
x, {
y, POINT mPos[2];
nWidth, UINT id = 0;
nHeight,
hWndParent, /* lpParams of WM_[NC]CREATE is different for MDI children.
hMenu, * MDICREATESTRUCT members have the originally passed values.
hInstance, */
lpParam, mdi.szClass = lpClassName;
FALSE); 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 @@ CreateWindowExW(DWORD dwExStyle,
HINSTANCE hInstance, HINSTANCE hInstance,
LPVOID lpParam) LPVOID lpParam)
{ {
return User32CreateWindowEx(dwExStyle, MDICREATESTRUCTW mdi;
(LPCSTR) lpClassName, HWND hwnd;
(LPCSTR) lpWindowName,
dwStyle, if (dwExStyle & WS_EX_MDICHILD)
x, {
y, POINT mPos[2];
nWidth, UINT id = 0;
nHeight,
hWndParent, /* lpParams of WM_[NC]CREATE is different for MDI children.
hMenu, * MDICREATESTRUCT members have the originally passed values.
hInstance, */
lpParam, mdi.szClass = lpClassName;
TRUE); 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;
} }
/* /*