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
반응형