윈도우 프로그래밍 시 주로 MFC 를 사용하는데 파일 선택 대화상자(CFileDialog)는 있지만 폴더 선택 대화상자는 없다.
그래서 Win32 API로 간단히 폴더 선택 대화상자를 만드는 방법이 있어서 정리해 본다.
void OnBnClickedSelectFile()
{
BROWSEINFO bi;
TCHAR szTemp[ MAX_PATH ] = { 0, };
TCHAR * pszPath = _T( "D:\\" );
::ZeroMemory( &bi, sizeof( BROWSEINFO ) );
bi.hwndOwner = hWnd;
bi.lpszTitle = _T( "파일이 저장될 폴더를 선택해 주세요." );
bi.ulFlags = BIF_NEWDIALOGSTYLE | BIF_EDITBOX | BIF_RETURNONLYFSDIRS
| BIF_STATUSTEXT | BIF_VALIDATE;
bi.lpfn = BrowseCallbackProc;
bi.lParam = (LPARAM)pszPath;
LPITEMIDLIST pItemIdList = ::SHBrowseForFolder( &bi );
if( ::SHGetPathFromIDList( pItemIdList, szTemp ) )
{
MessageBox( szTemp );
}
}
static int CALLBACK BrowseCallbackProc( HWND hWnd, UINT uMsg, LPARAM lParam,
LPARAM lpData )
{
switch( uMsg )
{
case BFFM_INITIALIZED: // 폴더 선택 대화상자를 초기화 할 때, 초기 경로 설정
{
::SendMessage( hWnd, BFFM_SETSELECTION, TRUE, (LPARAM)lpData );
}
break;
// BROWSEINFO 구조체의 ulFlags 값에 BIF_STATUSTEXT 가 설정된 경우 호출
// 단, BIF_NEWDIALOGSTYLE 가 설정되어 있을 경우 호출되지 않음
case BFFM_SELCHANGED: // 사용자가 폴더를 선택할 경우 대화상자에 선택된 경로 표시
{
TCHAR szPath[ MAX_PATH ] = { 0, };
::SHGetPathFromIDList( (LPCITEMIDLIST)lParam, szPath );
::SendMessage( hWnd, BFFM_SETSTATUSTEXT, 0, (LPARAM)szPath );
}
break;
// BROWSEINFO 구조체의 ulFlags 값에 BIF_VALIDATE 가 설정된 경우 호출
// BIF_EDITBOX 와 같이 설정된 경우만 호출됨
case BFFM_VALIDATEFAILED: // 에디터 콘트롤에서 폴더 이름을 잘못 입력한 경우 호출
{
::MessageBox( hWnd, _T( "해당 폴더를 찾을 수 없습니다." ), _T( "오류" ),
MB_ICONERROR | MB_OK );
}
break;
}
return 0;
}