2009-10-15 7 views
0

MFC에서 폴더 열기 대화 상자가 있습니까? 즉, 파일 이름을 선택하는 대신 폴더 이름을 선택합니다. 이상적으로는 Visual Studio에서 일반적인 프로젝트 대화 상자와 매우 흡사하게 보이는 "프로젝트 위치"(새 프로젝트를 만들 때)를 탐색 할 때이 방법을 사용하고 싶습니다. 그러나 전 존재하지 않는 경우 vertical tree 인터페이스 중 하나를 사용하여 수행 할 수 있습니다.MFC 폴더 열기 대화 상자

+3

참조 : http://stackoverflow.com/questions/1304784/cfiledialog-browse-folders –

답변

4

이 코드는 열린 폴더 대화 상자를 표시합니다.이 대화 상자는 웹의 어딘가에서 가져 왔지만 실제로 모르겠습니다.

CString szSelectedFolder = _T(""); 

// This is the recommended way to select a directory 
// in Win95 and NT4. 
BROWSEINFO bi; 
memset((LPVOID)&bi, 0, sizeof(bi)); 
TCHAR szDisplayName[_MAX_PATH]; 
szDisplayName[0] = '\0'; 
bi.hwndOwner = GetSafeHwnd(); 
bi.pidlRoot = NULL; 
bi.pszDisplayName = szDisplayName; 
bi.lpszTitle = _T("Select a folder"); 
bi.ulFlags = BIF_RETURNONLYFSDIRS; 
// Set the callback function 
bi.lpfn = BrowseCallbackProc; 

LPITEMIDLIST pIIL = ::SHBrowseForFolder(&bi); 
TCHAR szReturnedDir[_MAX_PATH]; 

BOOL bRet = ::SHGetPathFromIDList(pIIL, (TCHAR*)&szReturnedDir); 
if (bRet) 
{ 
    if (szReturnedDir != _T("")) 
    { 
     szSelectedFolder = szReturnedDir; 
    } 

    LPMALLOC pMalloc; 
    HRESULT HR = SHGetMalloc(&pMalloc); 
    pMalloc->Free(pIIL); 
    pMalloc->Release(); 
} 

하기이 콜백 함수를 구현해야합니다 :

TCHAR szInitialDir[_MAX_PATH]; 

// Set the initial path of the folder browser 
int CALLBACK BrowseCallbackProc(HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData) 
{ 
    // Look for BFFM_INITIALIZED 
    if (uMsg == BFFM_INITIALIZED) 
    { 
     SendMessage(hWnd, BFFM_SETSELECTION, TRUE, (LPARAM)szInitialDir); 
    } 
    return 0; 
} 
+0

대신의 memset 함수를, I BROWSEINFO를 선호합니다. bi = {0}; –

+0

그것은 내가 뭘했는지는 알 수 없지만, 내가 사용해야 할 것은 너무 많은 일을하지 않고 대안이 존재하는 것처럼 보이지 않는다. – Smashery

관련 문제