フォルダ選択ダイアログ

フォルダ選択ダイアログは、MFCでは用意されていません。
SHBrowseForFolder APIを利用することで、扱うことが可能です。
void CxxxDlg::FolderSelectDlg(LPCTSTR pszDefFolder, CString &strResultDir){
    BROWSEINFO bi;
    TCHAR szDir[MAX_PATH];
    LPITEMIDLIST lpItemList;
    LPMALLOC pMalloc;

    // Shell の標準のアロケータを取得
    if(!SUCCEEDED(SHGetMalloc(&pMalloc))){
        return;
    }

    // BROWSEINFO 構造体を埋める
    memset(&bi, 0, sizeof(bi));
    bi.hwndOwner      = m_hWnd;  // オーナーウィンドウハンドルを設定
    bi.pidlRoot       = 0;
    bi.pszDisplayName = 0;
    bi.lpszTitle      = "フォルダ選択";
    bi.ulFlags        = BIF_RETURNONLYFSDIRS;
    //ダイアログを開いた際のフォルダを指定する場合は、コールバック関数を利用します。
    //bi.lpfn         = BrowseCallbackProc;
    //bi.lParam       = (LPARAM)pszDefFolder;
    bi.lpfn           = NULL;
    bi.lParam         = 0;

    // フォルダの参照ダイアログボックスの表示
    lpItemList = SHBrowseForFolder(&bi);

    if(pidl){
        // PIDL をファイルシステムのパスに変換
        if(SHGetPathFromIDList(lpItemList, szDir)){
            strResultDir = szDir;
        }

        // SHBrowseForFolder によって割り当てられた PIDL を解放
        pMalloc->Free(lpItemList);
    }

    // Shell のアロケータを開放
    pMalloc->Release();

}

int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lp, LPARAM pData){
    switch (uMsg){
    case BFFM_INITIALIZED:
        //第4引数には、BROWSEINFOのlParamで設定した値が渡されてくる。
        ::SendMessage(hwnd, BFFM_SETSELECTION, TRUE, pData);
        break;
    default:
        break;
    }
    return 0;
}