フォルダ指定ダイアログを使う

初期フォルダを指定するにはコールバック関数が必要と、めんどくさいよ。

// 初期フォルダ指定コールバック関数
TCHAR BrowseCallbackProc_buff[1024]=_T("c:\\");
int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData)
{
    if(uMsg==BFFM_INITIALIZED){

    // フォルダ指定
        SendMessage(hwnd,BFFM_SETSELECTION,(WPARAM)TRUE,(LPARAM)BrowseCallbackProc_buff);
    }
    return 0;
}

ダイアログ表示

 // TODO: ここにコントロール通知ハンドラー コードを追加します。
 CString wsResult = L"";

 BROWSEINFO   bi;
 LPITEMIDLIST pidlRoot;   // ブラウズのルートPIDL
 LPITEMIDLIST pidlBrowse; // ユーザーが選択したPIDL

 TCHAR lpBuffer[MAX_PATH];

 // ダイアログ表示時のルートフォルダのPIDLを取得
 SHGetSpecialFolderLocation(NULL,CSIDL_DESKTOP,&pidlRoot);

 // BROWSEINFO構造体の初期値設定
 // ※BROWSEINFO構造体の各メンバの詳細説明もヘルプを参照
 bi.hwndOwner = NULL;
 bi.pidlRoot = pidlRoot;
 bi.pszDisplayName = (TCHAR*)lpBuffer;
 bi.lpszTitle = _T("フォルダを選択して下さい");
 bi.ulFlags = 0;
 bi.lpfn = BrowseCallbackProc;
 bi.lParam = 0;

 // フォルダ選択ダイアログの表示 
 pidlBrowse = SHBrowseForFolder(&bi);
 if (pidlBrowse != NULL) {  
  // PIDL形式の戻り値のファイルシステムのパスに変換
  wchar_t wcBuffer[MAX_PATH];
  if (SHGetPathFromIDListW(pidlBrowse, wcBuffer)) {
   // 取得成功
   wsResult = wcBuffer;
   // SetDlgItemTextW(this->m_hWnd,IDC_EDIT_FONTPATH,wcBuffer); // テキストボックスに入力
  }else{
   MessageBox(_T("フォルダの指定に失敗しました。"),_T("エラー"),MB_OK);
  }
 }

ネタ元