2010/05/18

SHBrowseForFolder 폴더 선택시 대화상자에 선택된 경로 보여주기

SHBrowseForFolder 이용한 폴더 선택시 대화상자에서 사용자가 폴더를 선택할 때마다 선택된 경로를 대화 상자에 뿌려 주기 위해서는 SHBrowseForFolder 함수를 호출 할 때 넘겨주는 BrowseInfo 객체의 Flag 에 BIF_STATUSTEXT 를 추가하고 Callback 함수를 지정하여 Callback 함수에서 BFFM_SELCHANGED 메세지를 받아서 처리하면 된다.



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;

// 사용자가 폴더를 선택할 경우 대화상자에 선택된 경로 표시
case BFFM_SELCHANGED:
{
TCHAR szText[MAX_PATH] = {0};
SHGetPathFromIDList( (LPCITEMIDLIST)lParam, szText );
SendMessage(hwnd, BFFM_SETSTATUSTEXT, 0, (LPARAM)szText );
}
break;
}

return 0; // Always return 0.
}


void CDlgCopy::OnBnClicked()
{
LPITEMIDLIST pidlBrowse;
WCHAR szFolder[MAX_PATH];

CString strInit = "초기 경로";
BROWSEINFO brInfo;

::ZeroMemory(&brInfo, sizeof(BROWSEINFO));
brInfo.hwndOwner = m_hWnd;
brInfo.pidlRoot = NULL;
brInfo.pszDisplayName = szFolder;
brInfo.lpszTitle = _T("Copy Folder");
brInfo.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT | BIF_VALIDATE;
brInfo.lpfn = BrowseCallbackProc;
brInfo.lParam = (LPARAM)strInit.GetBuffer( strInit.GetLength() );

::ZeroMemory(szFolder, MAX_PATH);

pidlBrowse = ::SHBrowseForFolder(&brInfo);
strInit.ReleaseBuffer();

if ( pidlBrowse != NULL )
{
::SHGetPathFromIDList(pidlBrowse, szFolder);
}
else
{
return;
}

m_strSaveFolder = szFolder;
}




<

Original Post : http://neodreamer-dev.tistory.com/441

No comments :

Post a Comment