To add a customized windows dialog to the windows
menu, you just have to take only two following steps in the
mainframe class…
- Override InitPopupMenu and replace it with the following code :
#define DEFAULT_NUMBER_OF_MDIS 9 void CMainFrame::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu ) { CMDIFrameWnd::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu); // If the number of active windows is zero, the window submenu // probably does'nt esists. If you have the window submenu present // even in zero child windows, remove this code. int nCount = 0; CWnd * pWnd = GetWindow (GW_CHILD); ASSERT (pWnd); pWnd = pWnd->GetWindow (GW_CHILD); while (pWnd) { nCount++; pWnd = pWnd->GetWindow (GW_HWNDNEXT); } // The count is zero. exit. if ( nCount == 0 ) return; // If it's a system menu, we don't need to handle that... if ( !bSysMenu ) { // The default handler places the "more windows" command in the // submenu which contains IDs between AFX_IDM_FIRST_MDICHILD and // AFX_IDM_LAST_MDICHILD, so check the popup for occurence of // AFX_IDM_FIRST_MDICHILD. int nLength = pPopupMenu->GetMenuItemCount(); for ( int i = 0; i < nLength; i++ ) { if ( pPopupMenu->GetMenuItemID( i ) == AFX_IDM_FIRST_MDICHILD ) { // Found. If the last item is already the "more windows" // command than remove it. if ( pPopupMenu->GetMenuItemID( nLength - 1 ) == AFX_IDM_FIRST_MDICHILD + DEFAULT_NUMBER_OF_MDIS ) { pPopupMenu->DeleteMenu( nLength - 1, MF_BYPOSITION ); } // Add our own window command. // Note : The ID must be - ( AFX_IDM_FIRST_MDICHILD + // ( total number of entries in window list supported ) ). // This saves us to make any default handler for the // command, as the default procedure itself // handles the command and sends it to the mainframe class. pPopupMenu->AppendMenu(MF_ENABLED|MF_STRING, AFX_IDM_FIRST_MDICHILD + DEFAULT_NUMBER_OF_MDIS, "&Windows..." ); // Done the processing. return; } } } }
BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam) { // If the command is "more windows" command call our // own customized dialog if ( wParam == AFX_IDM_FIRST_MDICHILD + 9 ) { // Replace CWindowDlg with your own class CWindowDlg dlgWindowDlg; dlgWindowDlg.DoModal(); // OK. We handled the command so return true, // as we don't want the default handler to // handle this command too. return TRUE; } return CMDIFrameWnd::OnCommand(wParam, lParam); }