MFC에서 디렉토리도 선택가능한 파일 열기 다이얼로그(대화상자, DialogBox)

Windows 2010/01/28 08:55
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;
}

- 다이얼로그 표시

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

Trackback 1 : Comment 0
◀ PREV : [1] : ... [42] : [43] : [44] : [45] : [46] : [47] : [48] : [49] : [50] : ... [125] : NEXT ▶