본문 바로가기
MFC

최근 열어본 파일 MRU Menu Items 처리 커스텀 방법

by leo21c 2024. 1. 15.
SMALL

MFC의 Main Menu에 "최근 열어본 파일" 리스트를 표시하고 그 리스트를 선택 했을 때 Doc의 OnOpenDocument(LPCTSTR lpszPathName) 함수가 호출된다. 

 

MFC 프레임워크에서 처리를 하기 때문에 OnOpenDocument(LPCTSTR lpszPathName) 함수 전에 CDocTemplate을 선택 한다거나 다른 작업을 하려면 아래와 같은 방식으로 처리를 하면 된다.

 

내가 이 작업을 하게 된 이유는 프로그램 내부 버전 별로 CDocTemplate을 어려게 사용을 하는데 자동을 OnOpenDocument(LPCTSTR lpszPathName) 함수가 호출되니 원하는 CDocTemplate으로 표시가 되지 않는 문제가 있었다.

 

참고로 CDocTemplate을 선택하는 방법은 아래와 같다.


POSITION pos = m_pDocManager->GetFirstDocTemplatePosition();
CDocTemplate* pTemplate = NULL;
pTemplate = m_pDocManager->GetNextDocTemplate(pos);
pTemplate = m_pDocManager->GetNextDocTemplate(pos);
pTemplate = m_pDocManager->GetNextDocTemplate(pos);

위와 같이 GetNextDocTemplate 함수를 이용해서 추가한 CDocTemplate을 찾아서 사용을 한다.

 

MRU Menu를 처리하기 위해서 자료를 찾다 보니 아래와 같이 좋은 샘플 자료가 있었다.

https://jeffpar.github.io/kbarchive/kb/243/Q243751/

 

Q243751: HOWTO: Add Command Handlers for MRU Menu Items in MFC App

An Archive of Early Microsoft KnowledgeBase Articles

jeffpar.github.io


  BEGIN_MESSAGE_MAP(CMRUApp, CWinApp)
	ON_COMMAND_RANGE(ID_FILE_MRU_FILE1, ID_FILE_MRU_FILE16, &CMRUApp::OnMRUFileHandler)
  END_MESSAGE_MAP()
  
  //m_pRecentFileList에서 ID_FILE_MRU_FILE1 ~ ID_FILE_MRU_FILE16 사이의 파일 경로를 찾아 
  //OpenDocument 실행. 실해 하면 List에서 삭제.
  void CMRUApp::MyMRUFileHandler(UINT i)
  {
      ASSERT_VALID(this);
      ASSERT(m_pRecentFileList != NULL);

      ASSERT(i >= ID_FILE_MRU_FILE1);
      ASSERT(i < ID_FILE_MRU_FILE1 + (UINT)m_pRecentFileList->GetSize());

      CString strName, strCurDir, strMessage;
      int nIndex = i - ID_FILE_MRU_FILE1;
      ASSERT((*m_pRecentFileList)[nIndex].GetLength() != 0);

     strName.Format("MRU: open file (%d) '%s'.\n", (nIndex) + 1,(LPCTSTR)(*m_pRecentFileList)[nIndex]);

     if (OpenDocumentFile((*m_pRecentFileList)[nIndex]) == NULL)
  	m_pRecentFileList->Remove(nIndex);
     AfxMessageBox(strName);
  }

 

C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30133\atlmfc\include\afxres.h

afxres.h 헤더에 아래와 같이 define이 되어져 있다.

#define ID_FILE_MRU_FIRST               0xE110
#define ID_FILE_MRU_FILE1               0xE110          // range - 16 max
#define ID_FILE_MRU_FILE2               0xE111
#define ID_FILE_MRU_FILE3               0xE112
#define ID_FILE_MRU_FILE4               0xE113
#define ID_FILE_MRU_FILE5               0xE114
#define ID_FILE_MRU_FILE6               0xE115
#define ID_FILE_MRU_FILE7               0xE116
#define ID_FILE_MRU_FILE8               0xE117
#define ID_FILE_MRU_FILE9               0xE118
#define ID_FILE_MRU_FILE10              0xE119
#define ID_FILE_MRU_FILE11              0xE11A
#define ID_FILE_MRU_FILE12              0xE11B
#define ID_FILE_MRU_FILE13              0xE11C
#define ID_FILE_MRU_FILE14              0xE11D
#define ID_FILE_MRU_FILE15              0xE11E
#define ID_FILE_MRU_FILE16              0xE11F
#define ID_FILE_MRU_LAST                0xE11F

 


위와 같이 ON_COMMAND_RANGE를 통해 함수를 호출해서 사용을 한다.

정상적으로 잘 작동 되는 것을 확인 했다.

LIST