Getting rid of Window List from MDI applications
Posted
by Sushil Saxena
on August 6th, 1998
The MDI apps typically have a list of open windows. The list is appended to a menu item which is 1 position to the left of the right most menu item.
This is just ONE (simpler?) way of getting rid of it. There are other methods which duplicate some MFC code in application and then suppress WM_MDIREFRESHMENU message send.
I have not noticed any side effects of this. But use it at your own risk.
1. Define a popup menu item under the menu item which is one position left to the rightmost menu item. For example, given the following layout, add an item under "Windows".
File Edit View Windows Help Dummy
2. Add a Menu Update Handler:
void MyApp::OnUpdateDummy(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if (!m_pMainWnd)
{
return;
}
CMenu* pMenu = m_pMainWnd->GetMenu();
ASSERT(pMenu);
// CMenu* pWindowList = pMenu->GetSubMenu(4); //or 3? or 5?
CMenu* pWindowList =
((CMDIFrameWnd*)AfxGetMainWnd())->GetWindowMenuPopup(pMenu->m_hMenu);
ASSERT (pWindowList);
CCmdUI item;
item.m_pMenu = pWindowList;
item.m_nIndexMax = pWindowList->GetMenuItemCount();
item.m_nIndex = 0;
//loop thru all menu items
for (;item.m_nIndex < item.m_nIndexMax; item.m_nIndex++)
{
item.m_nID = pWindowList->GetMenuItemID(item.m_nIndex);
switch(item.m_nID)
{
case ID_DUMMY:
//do whatever
item.Enable(TRUE);
break;
default:
pWindowList->DeleteMenu(item.m_nID, MF_BYCOMMAND);
break;
}
}
}

Comments
Getting rid of Window List from MDI applications
Posted by Legacy on 03/04/1999 12:00amOriginally posted by: Serguei Batchila
"The MDI apps typically have a list of open windows. The list is appended to a menu item which is 1 position to the left of the right most menu item." That's not true. List is appended to submenu which has at least one item with ID between AFX_IDM_WINDOW_FIRST and AFX_IDM_WINDOW_LAST. See the source code of function CMDIFrameWnd::GetWindowMenuPopup(HMENU hMenuBar), file "WINMDI.CPP" from MFC sources. AFX_IDM_WINDOW_### constants are defined in "AFXRES.H". By the way, all standard commands from "Window" submenu (ID_WINDOW_CASCADE, ID_WINDOW_TILE_HORZ and so on) are between AFX_IDM_WINDOW_FIRST and AFX_IDM_WINDOW_LAST. That's why you have window list in "Window" submenu.
The easiest way to get rid of Window List is
1. to override virtual function CMDIFrameWnd::GetWindowMenuPopup(HMENU hMenuBar):
CMyMDIFrameWnd::GetWindowMenuPopup(HMENU hMenuBar)
{
return NULL;
}
2. or remove these commands from "Window" menu:
ID_WINDOW_NEW
ID_WINDOW_ARRANGE
ID_WINDOW_CASCADE
ID_WINDOW_TILE_HORZ
ID_WINDOW_TILE_VERT
ID_WINDOW_SPLIT
and make sure you do not have commands in "Window" menu with IDs between 0xE130(AFX_IDM_WINDOW_FIRST) and 0xE13F(AFX_IDM_WINDOW_LAST)
I think the first way is better
ReplyGetting rid of Window List from MDI applications, part II
Posted by Legacy on 01/22/1999 12:00amOriginally posted by: M. van Leeuwen
Reply