2009-10-15 93 views
0

在MFC中,是否有打開文件夾對話框?也就是說,不是選擇文件名,而是選擇文件夾名稱?理想情況下,我希望它是Visual Studio在瀏覽「項目位置」(創建新項目時)時的工作方式,它看起來非常像普通的文件對話框。但如果前者不存在,我可以使用vertical tree類型的接口之一。MFC打開文件夾對話框

+3

見:http://stackoverflow.com/questions/1304784/cfiledialog-browse-folders – 2009-10-15 04:06:49

回答

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的,我更喜歡BROWSEINFO bi = {0}; – 2009-10-15 15:34:46

+0

這並不完全是我所追求的,但這是我不得不使用的 - 看起來不存在沒有太多工作的替代方案。 – Smashery 2009-11-05 01:37:20