윈도우 프로그래밍 시 주로 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.
}
'컴퓨터 > 프로그래밍' 카테고리의 다른 글
OpenMP 소개 (0) | 2011.04.02 |
---|---|
MS SQL Server 테이블 수정 명령어 (0) | 2011.04.01 |
UNICODE, ANSI 인코딩 변환 (0) | 2011.01.27 |
std::string 과 std::wstring 의 상호 변환 (1) | 2011.01.21 |
좌표 축 회전 공식 (Direct X 의 왼손 좌표계) (0) | 2011.01.16 |