フォルダ指定ダイアグラムの使用 †ファイルでなく、フォルダを選択するダイアグラムを使用する。 制約 †.NET関数・MFCを使用しないこと。 #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 ); // 正常終了 // } 参考ページ †http://kwi.cocolog-nifty.com/blog/2006/03/bcb_case_83d1.html |