''[[FrontPage]]''
* フォルダ指定ダイアグラムの使用 [#ke409d04]
ファイルでなく、フォルダを選択するダイアグラムを使用する。~
** 制約 [#m00946ea]
.NET関数・MFCを使用しないこと。~
~
&color(#FF0000,){以下のソースファイルは、ファイルハンドル、フォルダ名格納先アドレスを引数とする副関数を仮想して記述している。};~
プリプロセッサ部は参考までに
#include <shlobj.h> // for SHBrowseForFolder //
#include <stdio.h> // for snprintf //
// //
#define RET_OK 0 // //
#define RET_NG -1 // //
// //
char FolderDlg( HWND hWnd, TCHAR* de_folderName ) // //
{ // //
LPMALLOC lpMalloc = NULL; // for SHGetMalloc //
if( !SUCCEEDED(SHGetMalloc( &lpMalloc ) ) ) // LPITEMIDLISTの解放 //
{ // SHGetMallocに失敗 //
return ( RET_NG ); // 処理終了 //
} // //
// //
char di_folderName[_MAX_PATH]; // ショートフォルダ名 //
BROWSEINFO info = { 0 }; // for SHBrowseForFolder //
info.hwndOwner = hWnd; // 親ウィンドウのハンドル //
info.pidlRoot = CSIDL_DESKTOP; // ダイアログの初期指定ディレクトリ //
info.pszDisplayName = di_folderName; // ショートフォルダ名の受け取り //
info.lpszTitle = "StyleMod"; // ダイアログのタイトル //
info.ulFlags = BIF_EDITBOX | BIF_STATUSTEXT | // オプション //
BIF_RETURNONLYFSDIRS | BIF_RETURNFSANCESTORS; // //
info.lpfn = FDlgProc; // プロシージャのアドレス //
// //
LPITEMIDLIST itemList = SHBrowseForFolder( &info ); // フォルダ指定ダイアログの呼び出し //
if( NULL == itemList ) // 戻り値判定 //
{ // キャンセルされた場合 //
lpMalloc->Release(); // LPITEMIDLISTを解放する //
return(RET_NG); // 処理終了 //
} // //
// //
char lName[_MAX_PATH]; // ロングフォルダ名 //
if( SHGetPathFromIDList( itemList, lName ) ) // ロングフォルダ名の取得 //
{ // //
snprintf( de_folderName, strlen(lName), lName ); // char型でセキュリティ重視。改良の余地あり //
} // //
else // //
{ // ロングフォルダ名の取得に失敗した場合 //
return ( RET_NG ); // 処理終了 //
// snprintf(de_folderName, strlen(di_folderName), di_folderName); // または、ショートフォルダ名を返す //
} // //
// //
lpMalloc->Free( itemList ); // LPITEMIDLISTの領域を解放する //
lpMalloc->Release(); // //
// //
return ( RET_OK ); // 正常終了 //
}
int CALLBACK FDlgProc(HWND hwnd, UINT msg, LPARAM lParam, LPARAM lpData) // フォルダ指定用プロシージャ //
{ // //
switch(msg){ // メッセージにより分岐 //
case BFFM_INITIALIZED: // ダイアログ初期化時 //
break; // //
// //
case BFFM_SELCHANGED: // フォルダ選択時 //
{ // //
char selected[MAX_PATH]; // 選択中フォルダのロングフォルダ名 //
// //
if( SHGetPathFromIDList( ( LPITEMIDLIST ) lParam, selected ) ) // 選択中フォルダのロング名を取得する //
{ // SHGetPathFromIDListに成功した場合 //
SendMessage( hwnd, BFFM_SETSTATUSTEXT, 0, (LPARAM)selected ); // ダイアログに表示 //
} // //
else // //
{ // ロングパス取得に失敗した場合 //
EnableWindow( GetDlgItem( hwnd, IDOK ), FALSE ); // OKボタンを押せなくする //
break; // 再選択待ち //
} // //
} // //
} // //
// //
return ( RET_OK ); // 正常終了 //
}
*** 参考ページ [#qe4eb22a]
http://kwi.cocolog-nifty.com/blog/2006/03/bcb_case_83d1.html~