컴퓨터/프로그래밍2011. 1. 20. 11:16
윈도우 프로그래밍 시 주로 MFC 를 사용하는데 파일 선택 대화상자(CFileDialog)는 있지만 폴더 선택 대화상자는 없다.

그래서 Win32 API로 간단히 폴더 선택 대화상자를 만드는 방법이 있어서 정리해 본다.


01.void OnBnClickedSelectFile()
02.{
03.    BROWSEINFO bi;
04. 
05.    TCHAR szTemp[ MAX_PATH ] = { 0, };
06. 
07.    TCHAR * pszPath = _T( "D:\\" );
08. 
09.    ::ZeroMemory( &bi, sizeof( BROWSEINFO ) );
10. 
11.    bi.hwndOwner    = hWnd;
12.    bi.lpszTitle    = _T( "파일이 저장될 폴더를 선택해 주세요." );
13.    bi.ulFlags      = BIF_NEWDIALOGSTYLE | BIF_EDITBOX | BIF_RETURNONLYFSDIRS
14.                        | BIF_STATUSTEXT | BIF_VALIDATE;
15.    bi.lpfn         = BrowseCallbackProc;
16.    bi.lParam       = (LPARAM)pszPath;
17. 
18.    LPITEMIDLIST pItemIdList = ::SHBrowseForFolder( &bi );
19. 
20.    if( ::SHGetPathFromIDList( pItemIdList, szTemp ) )
21.    {
22.        MessageBox( szTemp );
23.    }
24.}
25. 
26.static int CALLBACK BrowseCallbackProc( HWND hWnd, UINT uMsg, LPARAM lParam,
27.                                        LPARAM lpData )
28.{
29.    switch( uMsg )
30.    {
31.    case BFFM_INITIALIZED:      // 폴더 선택 대화상자를 초기화 할 때, 초기 경로 설정
32.        {
33.            ::SendMessage( hWnd, BFFM_SETSELECTION, TRUE, (LPARAM)lpData );
34.        }
35.        break;
36. 
37.    // BROWSEINFO 구조체의 ulFlags 값에 BIF_STATUSTEXT 가 설정된 경우 호출
38.    // 단, BIF_NEWDIALOGSTYLE 가 설정되어 있을 경우 호출되지 않음
39.    case BFFM_SELCHANGED:       // 사용자가 폴더를 선택할 경우 대화상자에 선택된 경로 표시
40.        {
41.            TCHAR szPath[ MAX_PATH ] = { 0, };
42. 
43.            ::SHGetPathFromIDList( (LPCITEMIDLIST)lParam, szPath );
44.            ::SendMessage( hWnd, BFFM_SETSTATUSTEXT, 0, (LPARAM)szPath );
45.        }
46.        break;
47. 
48.    // BROWSEINFO 구조체의 ulFlags 값에 BIF_VALIDATE 가 설정된 경우 호출
49.    // BIF_EDITBOX 와 같이 설정된 경우만 호출됨
50.    case BFFM_VALIDATEFAILED:   // 에디터 콘트롤에서 폴더 이름을 잘못 입력한 경우 호출
51.        {
52.            ::MessageBox( hWnd, _T( "해당 폴더를 찾을 수 없습니다." ), _T( "오류" ),
53.                MB_ICONERROR | MB_OK );
54.        }
55.        break;
56.    }
57. 
58.    return 0;
59.}
Posted by jungtae17