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/
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를 통해 함수를 호출해서 사용을 한다.
정상적으로 잘 작동 되는 것을 확인 했다.
'MFC' 카테고리의 다른 글
CFileDialog의 Title 이름 변경하는 방법 (0) | 2024.01.16 |
---|---|
MFC 단축키 Accelerator 리소스 추가 (0) | 2024.01.16 |
UpdateData() 함수 Param 의미 (0) | 2023.07.07 |
ON_CONTROL_RANGE를 이용해서 같은 이벤트 처리를 한 함수로 해결 방법 (0) | 2023.07.05 |
HEX CString to BYTE array (0) | 2023.05.08 |