Adding a Customozied 'More Windows...' Dialog to an MDI Application

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 :
    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)
      pWnd = pWnd->GetWindow (GW_HWNDNEXT);
     // The count is zero. exit.
     if ( nCount == 0 )
     // 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
      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 ) == 
         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.
                               AFX_IDM_FIRST_MDICHILD + DEFAULT_NUMBER_OF_MDIS,
                               "&Windows..." );
        // Done the processing.
  • Override OnCommand and replace it with the following code:
  • 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;
      // 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);


Download demo project - 22 Kb


  • There are no comments yet. Be the first to comment!

Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Anthony Christie, the Chief Marketing Officer for Level Communications, is responsible for customer experience, worldwide marketing and product management. In this informative asset, he shares his insights into why a private network connection to cloud-bases applications is the right decision for your enterprise. Download now to find out more.

  • Moving from an on-premises environment to Office 365 does not remove the need to plan for disruptions or reduce the business risk requirements for protecting email services. If anything, some risks increase with a move to the cloud. Read how to ease the transition every business faces if considering or already migrating to cloud email. This white paper discusses: Setting expectations when migrating to Office 365 Understanding the implications of relying solely on Exchange Online security Necessary archiving …

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date