Using MRU on a submenu 

The following contains a method for putting MRU's on a separate submenu. 

After studying Todd C. Gleason's method for implementing MRU's on a submenu MRU's, I ended up taking a slightly different approach. Namely, a helper function to handle the application's OnUpdateFileMruFile1(CCmdUI* pCmdUI) function. 

CRecentFileList::UpdateMenu() seems to work OK if there's another item on the submenu before the MRU. So we insert such an item, update the menu, and then remove the inserted menu. 

The update function seems to be called under various circumstances. 

m_pMenu != 0 && m_pSubMenu != 0 -- popup menu opened up but not the submenu

Don't do anything 

m_pMenu != 0 && m_pSubMenu == 0 -- Opening the submenu

Fix up then menu 

m_pMenu == 0 && m_pSubMenu == 0 -- We've clicked on menu

Don't do anything 

//////////////////////////////////////////////////////////////////////

// SubmenuMRU.h

//

#ifndef _SUBMENUMRU_H_

#define _SUBMENUMRU_H_

class SubmenuMRU

{

public:

  static void Handle_OnUpdateFileMruFile1(CCmdUI* pCmdUI, CRecentFileList* pRecentFileList);

};

#endif

//////////////////////////////////////////////////////////////////////

// SubmenuMRU.cpp

//

#include 

#include 

#include "SubmenuMRU.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

void SubmenuMRU::Handle_OnUpdateFileMruFile1(CCmdUI* pCmdUI, CRecentFileList* pRecentFileList)

{

if (pRecentFileList == NULL) // no MRU files

pCmdUI->Enable(FALSE);

else

    {

        if (pCmdUI->m_pMenu && !pCmdUI->m_pSubMenu) // Only do something if we're the submenu

        {

            // Insert a separator so that CRecentFileList::UpdateMenu() will behave

            pCmdUI->m_pMenu->InsertMenu(0, MF_SEPARATOR | MF_BYPOSITION);

            pCmdUI->m_nIndex++;

            pCmdUI->m_nIndexMax++;

            pRecentFileList->UpdateMenu(pCmdUI); // Update the menu

            // Get rid of the separator we just inerted

            pCmdUI->m_pMenu->DeleteMenu(0, MF_BYPOSITION);

            pCmdUI->m_nIndex--;

            pCmdUI->m_nIndexMax--;

        }

    }

}

//////////////////////////////////////////////////////////////////////

// Snippet from test program's MenuTest.rc

//

IDR_MAINFRAME MENU PRELOAD DISCARDABLE 

BEGIN

    POPUP "&File"

    BEGIN

...

        POPUP "Recent &Files"

        BEGIN

            MENUITEM "Recent File", ID_FILE_MRU_FILE1, GRAYED

        END

        MENUITEM SEPARATOR

        MENUITEM "E&xit", ID_APP_EXIT

    END

...

END

//////////////////////////////////////////////////////////////////////

// Snippet from test program's MenuTest.cpp

//

#include "SubmenuMRU.h"

BEGIN_MESSAGE_MAP(CMenuTestApp, CWinApp)

...

ON_UPDATE_COMMAND_UI(ID_FILE_MRU_FILE1, OnUpdateFileMruFile1)

END_MESSAGE_MAP()

void CMenuTestApp::OnUpdateFileMruFile1(CCmdUI* pCmdUI) 

{

    // TODO: Add your command update UI handler code here

    SubmenuMRU::Handle_OnUpdateFileMruFile1(pCmdUI, m_pRecentFileList);

}

Date Posted: November 11, 1998