In the WM_MDISETMENU handler use an existing frame menu if the passed
value is 0. Visio expects that separator in the Window menu has ID 0. Cope with a destroyed menu handle in WM_MDIREFRESHMENU handler.
This commit is contained in:
parent
8941c0bc05
commit
b9e56b9b99
|
@ -320,9 +320,10 @@ static LRESULT MDISetMenu( HWND hwnd, HMENU hmenuFrame,
|
||||||
MDI_RefreshMenu(ci);
|
MDI_RefreshMenu(ci);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
ci->hWindowMenu = hmenuWindow;
|
||||||
ci->add_pos = GetMenuItemCount(hmenuWindow);
|
ci->add_pos = GetMenuItemCount(hmenuWindow);
|
||||||
|
}
|
||||||
ci->hWindowMenu = hmenuWindow;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hmenuFrame)
|
if (hmenuFrame)
|
||||||
|
@ -341,8 +342,12 @@ static LRESULT MDISetMenu( HWND hwnd, HMENU hmenuFrame,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
INT nItems = GetMenuItemCount(ci->hFrameMenu) - 1;
|
INT nItems;
|
||||||
UINT iId = GetMenuItemID(ci->hFrameMenu, nItems);
|
UINT iId;
|
||||||
|
|
||||||
|
ci->hFrameMenu = GetMenu(hwndFrame);
|
||||||
|
nItems = GetMenuItemCount(ci->hFrameMenu) - 1;
|
||||||
|
iId = GetMenuItemID(ci->hFrameMenu, nItems);
|
||||||
|
|
||||||
if( !(iId == SC_RESTORE || iId == SC_CLOSE) )
|
if( !(iId == SC_RESTORE || iId == SC_CLOSE) )
|
||||||
{
|
{
|
||||||
|
@ -365,7 +370,6 @@ static LRESULT MDISetMenu( HWND hwnd, HMENU hmenuFrame,
|
||||||
*/
|
*/
|
||||||
static LRESULT MDI_RefreshMenu(MDICLIENTINFO *ci)
|
static LRESULT MDI_RefreshMenu(MDICLIENTINFO *ci)
|
||||||
{
|
{
|
||||||
HMENU hFrameMenu;
|
|
||||||
UINT i, count, visible;
|
UINT i, count, visible;
|
||||||
WCHAR buf[MDI_MAXTITLELENGTH];
|
WCHAR buf[MDI_MAXTITLELENGTH];
|
||||||
|
|
||||||
|
@ -374,6 +378,12 @@ static LRESULT MDI_RefreshMenu(MDICLIENTINFO *ci)
|
||||||
if (!ci->hWindowMenu)
|
if (!ci->hWindowMenu)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (!IsMenu(ci->hWindowMenu))
|
||||||
|
{
|
||||||
|
WARN("Window menu handle %p is no more valid\n", ci->hWindowMenu);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
count = GetMenuItemCount(ci->hWindowMenu);
|
count = GetMenuItemCount(ci->hWindowMenu);
|
||||||
for (i = ci->add_pos; i < count; i++)
|
for (i = ci->add_pos; i < count; i++)
|
||||||
RemoveMenu(ci->hWindowMenu, ci->add_pos, MF_BYPOSITION);
|
RemoveMenu(ci->hWindowMenu, ci->add_pos, MF_BYPOSITION);
|
||||||
|
@ -393,7 +403,8 @@ static LRESULT MDI_RefreshMenu(MDICLIENTINFO *ci)
|
||||||
if (IsWindowVisible(ci->child[i]))
|
if (IsWindowVisible(ci->child[i]))
|
||||||
{
|
{
|
||||||
if (!visible)
|
if (!visible)
|
||||||
AppendMenuW(ci->hWindowMenu, MF_SEPARATOR, -1, NULL);
|
/* Visio expects that separator has id 0 */
|
||||||
|
AppendMenuW(ci->hWindowMenu, MF_SEPARATOR, 0, NULL);
|
||||||
|
|
||||||
visible++;
|
visible++;
|
||||||
|
|
||||||
|
@ -403,6 +414,7 @@ static LRESULT MDI_RefreshMenu(MDICLIENTINFO *ci)
|
||||||
buf[1] = '0' + visible;
|
buf[1] = '0' + visible;
|
||||||
buf[2] = ' ';
|
buf[2] = ' ';
|
||||||
InternalGetWindowText(ci->child[i], buf + 3, sizeof(buf)/sizeof(WCHAR) - 3);
|
InternalGetWindowText(ci->child[i], buf + 3, sizeof(buf)/sizeof(WCHAR) - 3);
|
||||||
|
TRACE("Adding %u %s\n", id, debugstr_w(buf));
|
||||||
AppendMenuW(ci->hWindowMenu, MF_STRING, id, buf);
|
AppendMenuW(ci->hWindowMenu, MF_STRING, id, buf);
|
||||||
|
|
||||||
if (ci->child[i] == ci->hwndActiveChild)
|
if (ci->child[i] == ci->hwndActiveChild)
|
||||||
|
@ -410,9 +422,7 @@ static LRESULT MDI_RefreshMenu(MDICLIENTINFO *ci)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
hFrameMenu = ci->hFrameMenu;
|
return (LRESULT)ci->hFrameMenu;
|
||||||
|
|
||||||
return (LRESULT)hFrameMenu;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -482,6 +492,8 @@ static LRESULT MDIDestroyChild( HWND parent, MDICLIENTINFO *ci,
|
||||||
{
|
{
|
||||||
UINT i;
|
UINT i;
|
||||||
|
|
||||||
|
TRACE("# of managed children %u\n", ci->nActiveChildren);
|
||||||
|
|
||||||
if( child == ci->hwndActiveChild )
|
if( child == ci->hwndActiveChild )
|
||||||
{
|
{
|
||||||
MDI_SwitchActiveChild(parent, child, TRUE);
|
MDI_SwitchActiveChild(parent, child, TRUE);
|
||||||
|
@ -510,19 +522,19 @@ static LRESULT MDIDestroyChild( HWND parent, MDICLIENTINFO *ci,
|
||||||
memcpy(new_child + i, ci->child + i + 1, (ci->nActiveChildren - i - 1) * sizeof(HWND));
|
memcpy(new_child + i, ci->child + i + 1, (ci->nActiveChildren - i - 1) * sizeof(HWND));
|
||||||
HeapFree(GetProcessHeap(), 0, ci->child);
|
HeapFree(GetProcessHeap(), 0, ci->child);
|
||||||
ci->child = new_child;
|
ci->child = new_child;
|
||||||
|
|
||||||
|
ci->nActiveChildren--;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ci->nActiveChildren--;
|
|
||||||
|
|
||||||
TRACE("child destroyed - %p\n",child);
|
|
||||||
|
|
||||||
if (flagDestroy)
|
if (flagDestroy)
|
||||||
{
|
{
|
||||||
MDI_PostUpdate(GetParent(child), ci, SB_BOTH+1);
|
MDI_PostUpdate(GetParent(child), ci, SB_BOTH+1);
|
||||||
DestroyWindow(child);
|
DestroyWindow(child);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TRACE("child destroyed - %p\n", child);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue