2010/05/18

SHBrowseForFolder 초기 경로 설정하기

SHBrowseForFolder 이용하여 폴더 선택 대화상자를 사용할 때, 초기 기본 경로를 설정하는 방법은 Callback 함수를 지정하여 대화상자가 초기화 메세지를 받아 기본 경로를 설정하는 메세지를 보내면 된다.


SHBrowseForFolder 함수를 호출 할 때, BrowseInfo 객체의 lpfn 에 Callback 함수를Flag 에 BIF_VALIDATE 를 지정해야 하고 lParam 에 기본 경로를 설정한다. lParam 에 설정하지 않고 직접 메세지 전달시 지정할 수도 있다.



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;
}

return 0; // Always return 0.
}


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

CString strPath = "초기 경로";
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)strPath.GetBuffer( strPath.GetLength() );

::ZeroMemory(szFolder, MAX_PATH);

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

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

m_strSaveFolder = szFolder;
}

<

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

No comments :

Post a Comment