【VC++】フォルダ選択ダイアログを表示する
<機能>
フォルダ選択ダイアログを表示してエディットボックスにパスを表示します
<使い方>
- MFCアプリケーションのダイアログベースでプロジェクトを作成
- パスを表示するエディットボックス(IDC_EDITPATH)、フォルダ選択ボタン(IDC_BTNSEL)を配置
- エディットボックスにCString型のメンバ変数(m_csPath)を追加
- 構成プロパティ > 全般 > 文字セット で「マルチバイト文字セットを使用する」を選択
<イメージ>
BROWSEINFO構造体にBIF_NEWDIALOGSTYLE(新規フォルダ作成できる)を指定した場合とBIF_RETURNONLYFSDIRS(ファイルシステムのディレクトリのみ選択できる)を指定した場合のダイアログ
他にもいろいろオプションがありますので試してみてください
msdnは英語ページしかないみたいです
//ヘッダーファイルかどこかでプロトタイプ宣言する
//プロトタイプ宣言
BOOL SelectFolder(HWND hWnd, LPCTSTR lpDefFolder, LPTSTR lpSelectPath, UINT iFlg, CString ttl);
int CALLBACK BrowseCallbackProc(HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData);
//プロトタイプ宣言
BOOL SelectFolder(HWND hWnd, LPCTSTR lpDefFolder, LPTSTR lpSelectPath, UINT iFlg, CString ttl);
int CALLBACK BrowseCallbackProc(HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData);
//InitDialogでエディットボックスの初期化を行う
BOOL CSelectFolderTestDlg::OnInitDialog()
{
//~省略~
BOOL CSelectFolderTestDlg::OnInitDialog()
{
//~省略~
//エディットボックスの初期化
m_csPath = "";
UpdateData(FALSE);
m_csPath = "";
UpdateData(FALSE);
//~省略~
}
}
/*******************************************************
[フォルダ選択]ボタン押下イベント
*******************************************************/
void CSelectFolderTestDlg::OnBnClickedBtnsel()
{
char cDirSel[MAX_LEN] = { '¥0' };
UpdateData(TRUE);
[フォルダ選択]ボタン押下イベント
*******************************************************/
void CSelectFolderTestDlg::OnBnClickedBtnsel()
{
char cDirSel[MAX_LEN] = { '¥0' };
UpdateData(TRUE);
//フォルダ選択ダイアログオプション:
//BIF_NEWDIALOGSTYLE(新規フォルダ作成できる)
//BIF_RETURNONLYFSDIRS(ファイルシステムのディレクトリのみ選択できる)
if (SelectFolder(this->m_hWnd, m_csPath, cDirSel, BIF_RETURNONLYFSDIRS, "XXXフォルダーを選択してください"))
{
m_csPath = cDirSel;
UpdateData(FALSE);
}
}
//BIF_NEWDIALOGSTYLE(新規フォルダ作成できる)
//BIF_RETURNONLYFSDIRS(ファイルシステムのディレクトリのみ選択できる)
if (SelectFolder(this->m_hWnd, m_csPath, cDirSel, BIF_RETURNONLYFSDIRS, "XXXフォルダーを選択してください"))
{
m_csPath = cDirSel;
UpdateData(FALSE);
}
}
/*******************************************************
フォルダを指定(SelectFolder)
引数(IN):
hWnd ウインドウハンドル
lpDefFolder デフォルトで表示するフォルダパス
iFlg ダイアログオプション
ttl ダイアログのタイトルテキスト
引数(OUT):
lpSelectPath 選択されたフォルダパス
*******************************************************/
BOOL SelectFolder(HWND hWnd, LPCTSTR lpDefFolder, LPTSTR lpSelectPath, UINT iFlg, CString ttl)
{
LPMALLOC pMalloc;
BOOL brtn = FALSE;
フォルダを指定(SelectFolder)
引数(IN):
hWnd ウインドウハンドル
lpDefFolder デフォルトで表示するフォルダパス
iFlg ダイアログオプション
ttl ダイアログのタイトルテキスト
引数(OUT):
lpSelectPath 選択されたフォルダパス
*******************************************************/
BOOL SelectFolder(HWND hWnd, LPCTSTR lpDefFolder, LPTSTR lpSelectPath, UINT iFlg, CString ttl)
{
LPMALLOC pMalloc;
BOOL brtn = FALSE;
//IMallocインターフェイスへのポインタを取得
if (SUCCEEDED(SHGetMalloc(&pMalloc)))
{
BROWSEINFO brows;
ITEMIDLIST *pIDlist;
if (SUCCEEDED(SHGetMalloc(&pMalloc)))
{
BROWSEINFO brows;
ITEMIDLIST *pIDlist;
//BROWSEINFO構造体の初期化
memset(&brows, NULL, sizeof(brows));
//BROWSEINFO構造体に値をセット
brows.hwndOwner = hWnd;
brows.pszDisplayName = lpSelectPath;
brows.lpszTitle = ttl;
brows.lParam = (LPARAM)lpDefFolder;
brows.pidlRoot = NULL;
brows.ulFlags = iFlg;
brows.lpfn = &BrowseCallbackProc;
brows.iImage = (int)NULL;
memset(&brows, NULL, sizeof(brows));
//BROWSEINFO構造体に値をセット
brows.hwndOwner = hWnd;
brows.pszDisplayName = lpSelectPath;
brows.lpszTitle = ttl;
brows.lParam = (LPARAM)lpDefFolder;
brows.pidlRoot = NULL;
brows.ulFlags = iFlg;
brows.lpfn = &BrowseCallbackProc;
brows.iImage = (int)NULL;
//フォルダ選択ダイアログの表示
pIDlist = SHBrowseForFolder(&brows);
pIDlist = SHBrowseForFolder(&brows);
if (pIDlist == NULL)
//何も選択されなければデフォルトフォルダを返す
strcpy_s(lpSelectPath, MAX_LEN, lpDefFolder);
else {
//ITEMIDLIST からフルパスを得る
SHGetPathFromIDList(pIDlist, lpSelectPath);
brtn = TRUE;
//ITEMIDLIST の開放
pMalloc->Free(pIDlist);
}
pMalloc->Release();
}
return brtn;
}
//何も選択されなければデフォルトフォルダを返す
strcpy_s(lpSelectPath, MAX_LEN, lpDefFolder);
else {
//ITEMIDLIST からフルパスを得る
SHGetPathFromIDList(pIDlist, lpSelectPath);
brtn = TRUE;
//ITEMIDLIST の開放
pMalloc->Free(pIDlist);
}
pMalloc->Release();
}
return brtn;
}
int CALLBACK BrowseCallbackProc(HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
switch (uMsg)
{
case BFFM_INITIALIZED:
//初期化処理(初期表示フォルダ指定)
SendMessage(hWnd, BFFM_SETSELECTION, (WPARAM)TRUE, lpData);
break;
case BFFM_SELCHANGED:
//フォルダ選択ダイアログでフォルダが選択された時に処理が必要であればここに記載
TRACE("フォルダが選択されました¥r¥n");
break;
}
return 0;
}
{
switch (uMsg)
{
case BFFM_INITIALIZED:
//初期化処理(初期表示フォルダ指定)
SendMessage(hWnd, BFFM_SETSELECTION, (WPARAM)TRUE, lpData);
break;
case BFFM_SELCHANGED:
//フォルダ選択ダイアログでフォルダが選択された時に処理が必要であればここに記載
TRACE("フォルダが選択されました¥r¥n");
break;
}
return 0;
}
よろしければポチッと押してください