2012년 3월 14일 수요일

[MFC] Win32 Console Application에서 CFileDialog 이용하기

제목 그대로 이다. Win32 Console Application에서 argument를 통해 파일명 입력이 귀찮은 경우, MFC에서와 같이 CFileDialog를 이용할 수 있다.

우선 Visual Studio(VS2010 기준으로 작성)를 실행한다.

새 프로젝트를 선택하고, "Win32 Console Application"을 선택한다. (그림 참고)



다음으로 Application Setting 창에서 Console application과 MFC를 선택한다. (그림 참고)


Finish를 선택하고, 자동으로 생성되는 파일에 다음과 같은 코드를 추가한다.

//stdafx.h에 추가
#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <fstream>
#include <cctype>
#include <conio.h>
#include <iomanip>
#include <afxdlgs.h>
#include <atlstr.h>


다음으로 cpp 파일에 다음과 같이 추가하면 끝!!
//_tmain 함수에 추가
CString szFileName = "";
CString szFilter = "Text Files(*.txt)|*.txt|All Files(*.*)|*.*";
char ch;
cout << "Open File 'y' or 'Y' ? ";
cin >> ch;
if((ch == 'y') || (ch == 'Y'))
{
 CWnd* pWnd = CWnd::FromHandle(GetForegroundWindow()); 
 CFileDialog dlg(TRUE, _T("*.txt"), _T("*.txt"), NULL, szFilter, pWnd);
 dlg.m_ofn.Flags |= OFN_FILEMUSTEXIST;
 dlg.m_ofn.lpstrTitle = _T("Read a text file");
 if(dlg.DoModal() == IDOK)
 {
  szFileName = dlg.GetPathName();
 }
}
cin.get();
if(szFileName.IsEmpty())
{
 szFileName = "ReadMe.txt";
}
ifstream in(szFileName, ios::in | ios::binary);
if(!in) {
 cout << "Cannot open input file.\n";
 cout << "Press any key to Exit!";
 while(!_kbhit())
  Sleep(2);
 return 1;
}

<실행 화면>



Console application으로 프로젝트를 설정한 이후에 Filedialog가 웬말이냐 라는 사람도 있겠지만, 가끔은 필요할 때도 있다.

※ 추가사항
반드시, 메인함수의 초기에 다음의 초기화 과정을 거쳐야 한다.

HMODULE hModule = ::GetModuleHandle(NULL);
if (hModule == NULL) return 1;
if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0)) return 1;


댓글 없음:

댓글 쓰기