아래의 코드를 실행해주면 됩니다.
[code cpp]
ITEMIDLIST *pidlBrowse;
char pszPathname[MAX_PATH];
BROWSEINFO BrInfo;
BrInfo.hwndOwner = GetSafeHwnd();
BrInfo.pidlRoot = NULL;
memset( &BrInfo, 0, sizeof( BrInfo ) );
BrInfo.pszDisplayName = pszPathname;
BrInfo.lpszTitle = "타이틀"; //창에 표시될 안내문구
BrInfo.ulFlags = BIF_RETURNONLYFSDIRS;
pidlBrowse = ::SHBrowseForFolder( &BrInfo );
if(pidlBrowse != NULL){
SHGetPathFromIDList( pidlBrowse, pszPathname );
//pszPathname에 선택한 폴더 경로가 들어가 있습니다.
}
[/code]
2009/11/27 추가
만약 폴더선택창을 열고 나서 기본적으로 선택되어있는 폴더를 지정할 수 도 있습니다.
생각 같아서는 BROWSEINFO 구조체에 폴더경로만 딱 보내면 알아서 해주면 좋겠지만,
그렇지는 않다는거....
폴더 선택창을 열고 나서 콜백되는 함수를 구현해주어야 합니다.
1. 선택이 될 폴더 경로를 BROWSEINFO 구조체의 lParam에 담아놓습니다.
2. 폴더선택창이 열린 이후 호출될 함수를 구현합니다.
3. BROWSEINFO 구조체에 콜백함수 포인터를 지정합니다.
끗.
대충 아래와 같이 하면 됩니다.
[code cpp]
int CALLBACK FolderCallbackProc(HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData) {
//콜백 함수
if(uMsg == BFFM_INITIALIZED) {
SendMessage(hWnd, BFFM_SETSELECTION, TRUE, lpData);
}
return 0;
}
.....
......
.....
char [] defPath = "C:\\";
......
BrInfo.lParam = (LPARAM)defPath;
BrInfo.lpfn = FolderCallbackProc;
......
[/code]
요런식으로 하면 됩니다.
덧붙이자면,
폴더 선택 창에 [새 폴더 만들기] 버튼을 추가하려면
ulFlags에 BIF_USENEWUI 마스크를 추가해주면 됩니다.
이때 생성되는 폴더선택창은 크기조절이 가능합니다.
BIF_USENEWUI는 VC++ 6에서는 define이 안되어 있는것 같더군요.
값은 0x0050 입니다.
undefined가 뜨신다면 디파인을 직접 해주시거나 값 그대로 마스킹을 해주면 됩니다.
'Knowledge > C/C++/VC++' 카테고리의 다른 글
콘솔 입/출력 redirect (2) | 2007.09.07 |
---|---|
"SQLFetchScroll/SQLExtendedFetch를 호출하기 전에 바운드된 열이 없습니다" 에러 (0) | 2007.09.07 |
레지스트리 접근 (0) | 2007.05.04 |
파일 열기/저장 공용 다이얼로그 (0) | 2007.05.04 |
프로세스 구하기/kill하기 (0) | 2007.05.04 |