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:
Dmitry Timoshkov 2004-01-26 20:14:59 +00:00 committed by Alexandre Julliard
parent 8941c0bc05
commit b9e56b9b99
1 changed files with 25 additions and 13 deletions

View File

@ -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;
} }