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]



- 표시 플래그

BIF_BROWSEFORCOMPUTER : 네트워크의 컴퓨터만 선택가능
BIF_BROWSEFORPRINTER : 프린터만 선택가능
BIF_BROWSEINCLUDEFILES : 파일도 표시
BIF_DONTGOBELOWDOMAIN : 네트워크의 컴퓨터를 표시하지 않는다
BIF_EDITBOX : 에디트 박스를 표시한다
BIF_RETURNFSANCESTORS : 네트워크의 컴퓨터만 선택가능
BIF_RETURNONLYFSDIRS : 폴더만 선택가능
BIF_STATUSTEXT : 스테이터스 텍스트를 표시한다
BIF_VALIDATE : 부정 입력시에, BFFM_VALIDATEFAILED 이벤트

출처 : 자바/Java/C/C++ 개발자모임 카페


Powered by Tattertools