MFC에서 디렉토리도 선택가능한 파일 열기 다이얼로그(대화상자, DialogBox)
Windows 2010/01/28 08:55{
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;
}
- 다이얼로그 표시
CBrowseFolderDialog dlg;
if( dlg.DoModal() != IDOK )
{
return;
}
- 선택 문자열의 취득
선택을 실시한 뒤, GetSelectStr()로 선택한 풀 패스를 취득할 수 있습니다.
(1) 문자열의 경우(CString로 취득)
CString str;
dlg.GetSelectStr(str);
(2) 문자열의 경우 (char로 취득)
char szBuf[100];
dlg.GetSelectStr(szBuf,100);
(3) 선택 문자열만이나, 컴퓨터명을 선택했을 경우
CString str;
dlg.GetSelectStr(str,FALSE);
- 커스터마이즈
생성자에서, 표시 플래그, 타이틀(아래의 문자열), 루트 폴더.
DoModa() 호출시에, 초기 선택 폴더(CSIDL치나 풀 패스)를 지정할 수 있습니다.
- 표시 플래그
BIF_BROWSEFORCOMPUTER 네트워크의 컴퓨터만 선택가능
BIF_BROWSEFORPRINTER 프린터만 선택가능
BIF_BROWSEINCLUDEFILES 파일도 표시
BIF_DONTGOBELOWDOMAIN 네트워크의 컴퓨터를 표시하지 않는다
BIF_EDITBOX 에디트 박스를 표시한다
BIF_RETURNFSANCESTORS 네트워크의 컴퓨터만 선택가능
BIF_RETURNONLYFSDIRS 폴더만 선택가능
BIF_STATUSTEXT 스테이터스 텍스트를 표시한다
BIF_VALIDATE 부정 입력시에, BFFM_VALIDATEFAILED 이벤트
- 루트 폴더, 초기 선택 폴더
CSIDL값으로 설정합니다.(SHGetSpecialFolderLocation() 참조)
(CSIDL_NETWORK,CSIDL_DESKTOP,CSIDL_RECENT등 )
커스터마이즈의 예
(컴퓨터의 참조로, 타이틀에 「컴퓨터를 선택해 주세요」로 하고,
루트 폴더를 데스크탑, 표시했을 때에 「마이 네트워크」를 선택하도록 지정)
CBrowseFolderDialog dlg(BIF_BROWSEFORCOMPUTER,"컴퓨터를 선택해 주세요",CSIDL_DESKTOP);
dlg.DoModal(CSIDL_NETWORK);
'Windows' 카테고리의 다른 글
| 랜덤값 구하기 (0) | 2010/01/28 |
|---|---|
| 레지스트리에 값 저장 하고 불러오기 간단한 함수 (0) | 2010/01/28 |
| MFC에서 디렉토리도 선택가능한 파일 열기 다이얼로그(대화상자, DialogBox) (0) | 2010/01/28 |
| TRACE, TRACE0, TRACE1 ..., ATLTRACE, ASSERT, AfxDebugBreak 등의 디버깅 매크로 & 함수 (0) | 2010/01/21 |
| IE8에서 ActiveX 디버깅 하기, 세션별 쿠키값 따로 저장하기 (0) | 2010/01/11 |
| Visual Stdio 버전 검사 _MSCVER 매크로 이용 (0) | 2010/01/11 |

BrowseFolderDialog.cpp