폴더선택창 열기

|

아래의 코드를 실행해주면 됩니다.

[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가 뜨신다면 디파인을 직접 해주시거나 값 그대로 마스킹을 해주면 됩니다.

And