フォルダを指定する

ファイルを指定する場合とは別にフォルダを指定したい場合がある。
フォルダのファイルを全て指定したい場合など。
まず、ボタンを押したらフォルダ選択ダイアログを開くようにボタンのハンドルに以下のように入力する。
 

void CRenamesDlg::OnButton1()
{
 // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
 CString FolderName = GetFolder();
}
 

次はコールバック関数の作成。これはフォルダを選択するダイアログの最初のフォルダを設定するためのもの。
これがないと常にマイドキュメントからの選択になる。
 

// フォルダ指定ダイアログを指定したフォルダから始めるためのコールバック関数
int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData)
{
 if(uMsg==BFFM_INITIALIZED){
  SendMessage(hwnd,BFFM_SETSELECTION,(WPARAM)TRUE,lpData);
 }
 return 0;
}
 

最後にフォルダ選択ダイアログの属性を設定してダイアログをひらき、選択したフォルダをCStringで返す
メンバ関数を追加する。
 

// フォルダを選択するための関数 戻り値=フルパス
CString CRenamesDlg::GetFolder()
{
LPITEMIDLIST pIDlist; //アイテムリストを入れるための構造体
char pszReturnPath[MAX_PATH]; //フルパスを返すためのバッファ(MAX_PATH分とっておく)
char lpszRootDir[] = "j:\\写真";//フォルダの参照ダイアログの初期パス
 
// ダイアログの属性を設定する
BROWSEINFO bi;
bi.hwndOwner = NULL;
bi.pidlRoot = NULL;
bi.pszDisplayName = NULL;
bi.lpszTitle = NULL;
bi.ulFlags = BIF_RETURNONLYFSDIRS;
bi.lpfn = (BFFCALLBACK)BrowseCallbackProc;
bi.lParam = (LPARAM)lpszRootDir;
bi.iImage = 0;
 
pIDlist = SHBrowseForFolder( &bi ); // ダイアログを呼び出す
 
if( pIDlist == NULL){
 // フォルダを指定していなければ空の文字列
 lstrcpy( pszReturnPath, "");
}
else {
 // フォルダを指定していれば ITEMIDLIST からフルパスを得る
 SHGetPathFromIDList( pIDlist, pszReturnPath);
}
//ITEMIDLIST の開放
CoTaskMemFree( pIDlist );
CString ret = pszReturnPath;
return ret;
}