MFC에서 디렉토리도 선택가능한 다이알로그
[CODE type=cpp]static int CALLBACK BrowseCallbakProc(HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM pData)
{
switch(uMsg)
{
case BFFM_VALIDATEFAILED:
CString strText;
strText.Format("%s", reinterpret_cast<LPTSTR>(lParam));
AfxMessageBox(strText);
break;
}
return 0;
};
void CTest3Dlg::OnButton1()
{
ITEMIDLIST *pildBrowse;
char pszPathname[MAX_PATH];
LPITEMIDLIST pidl = NULL;
BROWSEINFO bInfo;
ZeroMemory( &bInfo, sizeof(BROWSEINFO) );
SHPathToPidl( CSIDL_DESKTOP, &pidl ); //이곳에 최상위 루트를 지정하시구요
// CSIDL_NETWORK,CSIDL_DESKTOP,CSIDL_RECENT
bInfo.hwndOwner = GetSafeHwnd();
bInfo.pidlRoot = pidl;
bInfo.pszDisplayName = pszPathname;
bInfo.lpszTitle = "디렉토리를 선택하세요";
bInfo.lpfn = BrowseCallbakProc; //에디트 박스에서 텍스트를 받아오기 위한 Callback 입니다.
bInfo.ulFlags = BIF_BROWSEINCLUDEFILES | BIF_EDITBOX | BIF_VALIDATE;
pildBrowse = ::SHBrowseForFolder(&bInfo);
if( pildBrowse != NULL )
{
SHGetPathFromIDList(pildBrowse, pszPathname);
CString m_strFolder = (LPCTSTR)pszPathname;
MessageBox( m_strFolder );
}
}
HRESULT CTest3Dlg::SHPathToPidl( LPCTSTR szPath, LPITEMIDLIST* ppidl )
{
LPSHELLFOLDER pShellFolder = NULL;
OLECHAR wszPath[MAX_PATH] = {0};
ULONG nCharsParsed = 0;
HRESULT hr = SHGetDesktopFolder( &pShellFolder );
if( FAILED(hr) )
return FALSE;
MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, szPath, -1, wszPath, MAX_PATH );
hr = pShellFolder->ParseDisplayName( NULL, NULL, wszPath, &nCharsParsed, ppidl, NULL );
pShellFolder->Release();
return hr;
}[/CODE]
{
switch(uMsg)
{
case BFFM_VALIDATEFAILED:
CString strText;
strText.Format("%s", reinterpret_cast<LPTSTR>(lParam));
AfxMessageBox(strText);
break;
}
return 0;
};
void CTest3Dlg::OnButton1()
{
ITEMIDLIST *pildBrowse;
char pszPathname[MAX_PATH];
LPITEMIDLIST pidl = NULL;
BROWSEINFO bInfo;
ZeroMemory( &bInfo, sizeof(BROWSEINFO) );
SHPathToPidl( CSIDL_DESKTOP, &pidl ); //이곳에 최상위 루트를 지정하시구요
// CSIDL_NETWORK,CSIDL_DESKTOP,CSIDL_RECENT
bInfo.hwndOwner = GetSafeHwnd();
bInfo.pidlRoot = pidl;
bInfo.pszDisplayName = pszPathname;
bInfo.lpszTitle = "디렉토리를 선택하세요";
bInfo.lpfn = BrowseCallbakProc; //에디트 박스에서 텍스트를 받아오기 위한 Callback 입니다.
bInfo.ulFlags = BIF_BROWSEINCLUDEFILES | BIF_EDITBOX | BIF_VALIDATE;
pildBrowse = ::SHBrowseForFolder(&bInfo);
if( pildBrowse != NULL )
{
SHGetPathFromIDList(pildBrowse, pszPathname);
CString m_strFolder = (LPCTSTR)pszPathname;
MessageBox( m_strFolder );
}
}
HRESULT CTest3Dlg::SHPathToPidl( LPCTSTR szPath, LPITEMIDLIST* ppidl )
{
LPSHELLFOLDER pShellFolder = NULL;
OLECHAR wszPath[MAX_PATH] = {0};
ULONG nCharsParsed = 0;
HRESULT hr = SHGetDesktopFolder( &pShellFolder );
if( FAILED(hr) )
return FALSE;
MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, szPath, -1, wszPath, MAX_PATH );
hr = pShellFolder->ParseDisplayName( NULL, NULL, wszPath, &nCharsParsed, ppidl, NULL );
pShellFolder->Release();
return hr;
}[/CODE]
- 표시 플래그
BIF_BROWSEFORCOMPUTER : 네트워크의 컴퓨터만 선택가능
BIF_BROWSEFORPRINTER : 프린터만 선택가능
BIF_BROWSEINCLUDEFILES : 파일도 표시
BIF_DONTGOBELOWDOMAIN : 네트워크의 컴퓨터를 표시하지 않는다
BIF_EDITBOX : 에디트 박스를 표시한다
BIF_RETURNFSANCESTORS : 네트워크의 컴퓨터만 선택가능
BIF_RETURNONLYFSDIRS : 폴더만 선택가능
BIF_STATUSTEXT : 스테이터스 텍스트를 표시한다
BIF_VALIDATE : 부정 입력시에, BFFM_VALIDATEFAILED 이벤트
출처 : 자바/Java/C/C++ 개발자모임 카페