파일 선택을 위한 클래스가 CFileDialog 이다.

한개의 파일만 선택할 경우

char szFilter[] = "Image (*.BMP, *.GIF, *.JPG) | *.BMP;*.GIF;*.JPG | All Files(*.*)|*.*||";

CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, szFilter);

if(IDOK == dlg.DoModal()) {

CString strPathName = dlg.GetPathName();

}

여러개의 파일을 복수 선택할 경우

dwFlagOFN_ALLOWMULTISELECT 설정한다.

선택된 여러 파일 리스트가 저장될 버퍼가 제공되야 한다.

만일 기본 버퍼 이상의 파일을 선택해 확인 버튼을 누른다면,

DoModal을 실행시켰을 때, IDCANCEL이 리턴되고, 파일 리스트가 넘어오지 않을 것이다.

char szFilter[] = "All Files(*.*) | *.* ||";
CFileDialog dlg(TRUE, NULL, NULL, OFN_ALLOWMULTISELECT, szFiilter);

dlg.m_ofn.lpstrInitialDir = _T("D:/"); // 오픈할때 초기 경로 지정
// 여기서 버퍼 크기 늘려줘야 함.

char strFile[4096] = { 0, }; CString fileName;
dlg.m_ofn.lpstrFile = strFile; dlg.m_ofn.lpstrFile = fileName.GetBuffer( 4096 );
dlg.m_ofn.nMaxFile = sizeof(strFile); dlg.m_ofn.nMaxFile = 4096

if (IDOK == dlg.DoModal()) {
for (POSITION pos=dlg.GetStartPosition(); pos != NULL;)
CString
strPathName =
dlg.GetNextPathName(pos);
}

파일 선택 필터

static TCHAR BASED_CODE szFilter[] = 
_T("Chart Files (*.xlc)|*.xlc|") _T("Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|")
_T("*.xlc; *.xls|All Files (*.*)|*.*||");

예제

void CMyClass::OnFileOpen() 
{
// szFilters is a text string that includes two file name filters:
// "*.my" for "MyType Files" and "*.*' for "All Files."
TCHAR szFilters[]= _T("MyType Files (*.my)|*.my|All Files (*.*)|*.*||");

// Create an Open dialog; the default file name extension is ".my".
CFileDialog fileDlg(TRUE, _T("my"), _T("*.my"),
OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, szFilters);

// Display the file dialog. When user clicks OK,

fileDlg.DoModal()

// returns IDOK.
if (fileDlg.DoModal() == IDOK)
{
CString pathName = fileDlg.GetPathName();

// Implement opening and reading file in here.
// Change the window's title to the opened file's title.

CString fileName = fileDlg.GetFileTitle();
SetWindowText(fileName);
}
}

============================================================================

CFileDialog dlgFile(TRUE);


CString fileName;
const int c_cMaxFiles = 100;
const int c_cbBuffSize = (c_cMaxFiles * (MAX_PATH + 1)) + 1;


dlgFile.GetOFN().lpstrFile = fileName.GetBuffer(c_cbBuffSize);
dlgFile.GetOFN().nMaxFile = c_cMaxFiles;

dlgFile.DoModal();


fileName.ReleaseBuffer();

============================================================================

CFileDialog::CFileDialog

explicit CFileDialog( BOOL bOpenFileDialog,
LPCTSTR lpszDefExt = NULL,
LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
LPCTSTR lpszFilter = NULL,
CWnd* pParentWnd = NULL,
DWORD dwSize = 0,
BOOL bVistaStyle = TRUE );

BOOL bOpenFileDialog
생성하는 다이얼로그 박스 타입을 지정해 주는 매개변수
TRUE => 파일열기 다이얼로그 박스
FALSE => 파일 저장 다이얼로그 박스

LPCTSTR lpszDefExt
기본 파일 확장자명(저장할 경우 사용)
만약 유저가 파일이름 상자 안에 확장자를 포함하지 않는 경우
lpszDefExt의 파일 확장자명을 자동으로 지정 함
NULL => 확장자명을 추가하지 않음

lpszFileName
시작할 때 파일이름 상자에 나타낼 이름 지정
NULL => 시작할 때 파일이름을 나타내지 않음


dwFlags
하나이상의 플래그를 사용하여 사용자가 원하는 다이얼로그 박스로 조합

많이 사용되는 플래그
OFN_ALLOWMULTISELECT 한번에 여러개의 파일들을 선택 가능하게 함
OFN_CREATEPROMPT 존재하지 않는 파일명을 입력했을 경우 새로 생성하겠냐는 대화상자 표시
OFN_EXPLOPER 열기나 저장하기를 윈도우 탐색기 스타일로 출력
OFN_FILEMUSTEXIST 기존에 존재하는 파일 이름만 입력할 수 있도록 함
OFN_HIDEREADONLY 읽기전용 파일은 출력하지 않음
OFN_LONGNAMES 긴 파일 이름을 사용할 수 있도록 함
OFN_OVERWRITEPROMPT 저장할려고 하는 파일명이 존재할 경우 덮어쓰겠냐는 대화 상자 표시
OFN_PATHMUSTEXIST 오직 유효한 경로나 파일명만을 입력(아님 경고 메세지 출력)

추가 플래그 참조 :
http://msdn.microsoft.com/ko-kr/library/ms646839(en-us,VS.85).aspx


lpszFilter
사용할 파일들이 걸러지도록 파일명들을 연속으로 나열 함

pParentWnd
부모나 소유자 윈도우의 파일 다이얼로그 박스의 포인터

dwSize
OPENFILENAME 구조체의 크기

Posted by pkss
,