Using MRU on 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);
}



Comments

  • How to delete a item of recent file list?

    Posted by Legacy on 08/21/2001 12:00am

    Originally posted by: Cherry

    When select a file from recent file list.
    But the file wat changed by others and not the format I need.
    So I want to delete this file from recent file list.
    I know add a file is AddToRecentFileList(LPCTSTR lpszPathName), but how to delete one?
    Thank you!

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

Top White Papers and Webcasts

  • Speed. Agility. Flexibility. There are the big drivers behind most organizations' move to the cloud for their test/dev environments. Freed from the shackles of physical, on-premises infrastructures means test/dev teams can be incredibly fast, both in standing up and tearing down test beds. They can manage version control and they can share work between teams faster ever than below. Read this white paper to learn how your business can respond faster to the rapidly changing needs of customers with a cloud-based …

  • This IDC study assists senior IT leaders in assessing the current state of their hybrid cloud management processes, governance models, technologies, and skills to identify gaps and create a road map for better aligning the organization's management model and tools with the emerging needs of complex, dynamic self-service hybrid cloud environments. This IDC MaturityScape identifies five maturity stages for hybrid cloud management based on a set of specific people, process, and technology dimensions and outcomes. …

Most Popular Programming Stories

More for Developers

RSS Feeds

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