フォルダ選択ダイアログを表示する.
BROWSEINFO bi;
LPSTR lpBuffer;
LPITEMIDLIST pidlRoot; // ブラウズのルートPIDL
LPITEMIDLIST pidlBrowse; // ユーザーが選択したPIDL
LPMALLOC lpMalloc = NULL;
HRESULT hr = SHGetMalloc(&lpMalloc);
if(FAILED(hr)) return;
// ブラウズ情報受け取りバッファ領域の確保
if ((lpBuffer = (LPSTR) lpMalloc->Alloc(_MAX_PATH)) == NULL) {
return;
}
// ダイアログ表示時のルートフォルダのPIDLを取得
// ※以下はデスクトップをルートとしている。デスクトップをルートとする
// 場合は、単に bi.pidlRoot に0を設定するだけでもよい。その他の特
// 殊フォルダをルートとする事もできる。詳細はSHGetSpecialFolderLoca
// tionのヘルプを参照の事。
if (!SUCCEEDED(SHGetSpecialFolderLocation( hWnd,
CSIDL_DESKTOP,
&pidlRoot)) {
lpMalloc->Free(lpBuffer);
return;
}
// BROWSEINFO構造体の初期値設定
// ※BROWSEINFO構造体の各メンバの詳細説明もヘルプを参照
bi.hwndOwner = hWnd;
bi.pidlRoot = pidlRoot;
bi.pszDisplayName = lpBuffer;
bi.lpszTitle = "フォルダを選択して下さい";
bi.ulFlags = 0;
bi.lpfn = 0;
bi.lParam = 0;
// フォルダ選択ダイアログの表示
pidlBrowse = SHBrowseForFolder(&bi);
if (pidlBrowse != NULL) {
// PIDL形式の戻り値のファイルシステムのパスに変換
if (SHGetPathFromIDList(pidlBrowse, lpBuffer)) {
// 取得成功
・
・
・
}
// SHBrowseForFolderの戻り値PIDLを解放
lpMalloc->Free(pidlBrowse);
}
// クリーンアップ処理
lpMalloc->Free(pidlRoot);
lpMalloc->Free(lpBuffer);
lpMalloc->Release();
ダイアログ表示時に特定のフォルダを選択状態にするには,コールバック関数を定義して,BROWSEINFO 構造体の初期設定を以下のようにする.
int CALLBACK callback(HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData) {
if(uMsg == BFFM_INITIALIZED) {
SendMessage(hWnd, BFFM_SETSELECTION, (WPARAM)TRUE, lpData);
}
return 0;
}
// BROWSEINFO構造体の初期値設定
・
・
・
bi.lpfn = callback; // コールバック関数のアドレスを設定
bi.lParam = (LPARAM)"C:\\HogeHoge"; // 指定したいパスを設定
現在指定されているパスを取得するには,コールバック関数にて BFFM_SELCHANGED を処理する.
if( uMsg == BFFM_SELCHANGED ) {
if( SHGetPathFromIDList((LPCITEMIDLIST)lParam, lpPath) ) {
SendMessage(hWnd, BFFM_SETSTATUSTEXT, 0, (LPARAM)lpPath);
}
}
とすれば lpPath にパスが取得される.
OK ボタンのキャプションを変更するには,BFFM_INITIALIZED にて
SetWindowText( GetDlgItem( hwnd, IDOK), "OKOK");
などとする.
(BFFM_SETOKTEXT というメッセージもある)
参照
クラス内コールバック関数
フォルダ選択ダイアログにてフォルダの作成
SHBrowseForFolder(フォルダ選択ダイアログ)にボタン追加
SHBrowseForFolderでルートフォルダの指定