Program Language/API | MFC

[MFC] ID_FILE_OPEN 재정의

야곰야곰+책벌레 2021. 11. 15. 09:47
728x90
반응형

Frame이 있는 프로젝트를 실행할 때, 기본적으로 제공하는 ID_FILE_OPEN의 경우, 이벤트를 실행하면 파일 다이얼로그가 열리고 해당 경로는 Document의 OpenDocumentFile를 호출하게 된다. 이때 읽을 파일의 확장자나 기능으로 추가하기 위해서는 재정의를 할 필요가 있다.

 

BEGIN_MESSAGE_MAP(CTaskViewApp, CWinAppEx)
	ON_COMMAND(ID_APP_ABOUT, &CTaskViewApp::OnAppAbout)
	// Standard file based document commands
	ON_COMMAND(ID_FILE_NEW, &CWinAppEx::OnFileNew)
	ON_COMMAND(ID_FILE_OPEN, &CWinAppEx::OnFileOpen)
END_MESSAGE_MAP()

기본적으로 위와 같이 만들어져 있다. 이때 App 클래스에 이벤트를 추가하면,

BEGIN_MESSAGE_MAP(CTaskViewApp, CWinAppEx)
	ON_COMMAND(ID_APP_ABOUT, &CTaskViewApp::OnAppAbout)
	// Standard file based document commands
	ON_COMMAND(ID_FILE_NEW, &CWinAppEx::OnFileNew)
	//ON_COMMAND(ID_FILE_OPEN, &CWinAppEx::OnFileOpen) // 주석처리해야함
	ON_COMMAND(ID_FILE_OPEN, &CTaskViewApp::OnFileOpen)
END_MESSAGE_MAP()

ON_COMMAND(ID_FILE_OPEN, &CTaskViewApp::OnFileOpen) 이 추가되는데, 해당 함수는 동작하지 않는다. 그렇기 때문에 CWinAppEx::OnFileOpen 부분을 주석 처리해줘야 한다.

 

그리고 새롭게 만들어진 함수에 재정의 하면 된다.

void CTaskViewApp::OnFileOpen()
{
	// 파일 형식 콤보박스에 등록할 필터를 정의한다. (*.*, *.cpp, *.txt)
	wchar_t filter[] = L"All Files (*.*)|*.*|XML Files (*.xml)|*.xml||";

	// TRUE -> 열기대화상자, "xml" -> 사용자가 확장자 없이 파일명만 입력했을때 자동으로 추가될 확장자명이다.
	// "*.xml" 파일이름 에디트에 출력될 기본 문자열이다. 
	CFileDialog fileDlg(TRUE, L"xml", L"*.xml", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_NOCHANGEDIR, filter, NULL);

	// 파일 형식 콤보박스에 나열된 필터들 중에서 2번째 항목(*.xml)을 선택한다.
	fileDlg.m_ofn.nFilterIndex = 2;

	if (fileDlg.DoModal() == IDOK) {
		// 선택된 파일의 경로명을 이용하여 도큐먼트 정보를 재구성한다.
		OpenDocumentFile(fileDlg.GetPathName());
	}
}
728x90
반응형