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 :
  • #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;
       }
      }
     }
    }
    
  • 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;
      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);
    }
    

Downloads

Download demo project - 22 Kb


Comments

  • 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

  • Live Event Date: April 21, 2015 @ 1:00 p.m. ET / 10:00 a.m. PT For mid-sized companies, the challenge of serving people and providing better service is forcing a re-evaluation of their contact centers to improve customer experiences. While these growing enterprises are driving much of the market's innovation, they must remain nimble in how they operate, and be very responsive to customer needs. This upcoming eSeminar reveals five ways mid-size organizations can gain needed agility and examines how delivering …

  • Data integrity and ultra-high performance dictate the success and growth of many companies. One of these companies is BridgePay Network Solutions, a recently launched and rapidly growing financial services organization that allows merchants around the world to process millions of daily credit card transactions. Due to the nature of their business, their IT team needed to strike the perfect balance between meeting regulatory-mandated data security measures with the lowest possible levels of latency and …

Most Popular Programming Stories

More for Developers

RSS Feeds

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