VisualStudio 2005 VC++を使用して開発しています。
タイトルにもあるようにフォルダ選択ダイアログについて質問があります。
現在、フォルダ選択ダイアログは表示することは出来たのですが、デフォルトで
任意のフォルダを指定したいのですが、うまくいっていません。
何かよい方法がありましたら教えて下さい。
また、選択されたフォルダ内にある複数のファイルをそれぞれの表示ウインドに表示さ
せたいのですが、ファイル名不特定なので拡張だけで判断して表示させるということは
できるのでしょうか?
ソースを記載します。
void SAMPLEDlg::OnBnClickedButton1()
{
BROWSEINFO bInfo;
LPITEMIDLIST pIDList;
TCHAR path[512];
//フォルダ選択ダイアログ 準備
bInfo.hwndOwner = AfxGetMainWnd()->m_hWnd; //親ウインドウのハンドル
bInfo.pidlRoot = NULL; //デフォルトパス(NULL:デスクトップ)
bInfo.pszDisplayName = path; //選択されたパス受け取り用バッファ
bInfo.lpszTitle = _T(フォルダの選択); //ダイアログに表示するタイトル
bInfo.ulFlags = BIF_EDITBOX;
bInfo.lpfn = NULL; // BrowseCallbackProc関数のポインタ
bInfo.lParam = 0; // コールバック関数に渡す値
//フォルダ選択ダイアログ 表示
pIDList = ::SHBrowseForFolder(&bInfo);
if(pIDList == NULL)
{
//キャンセル時
}else{
//選択時
if(!::SHGetPathFromIDList(pIDList, path))
{
//エラー時
AfxMessageBox(フォルダを選択できません);
}else{
CString FName = (C:\\test\\%d\\*.avi,bInfo.pszDisplayName);
WIN32_FIND_DATA FileData;
//AVIファイルの検索
HANDLE hFind = FindFirstFile(FName, &FileData);
if(hFind == INVALID_HANDLE_VALUE){
AfxMessageBox(動画ファイルはありません);
}else{
AfxMessageBox(ファイルを発見しました);
// AVIファイルを開く
hAVIWnd = MCIWndCreate(GetDlgItem(IDC_MOVIE)
->m_hWnd,AfxGetInstanceHandle(),MCIWNDF_NOMENU|MCIWNDF_NOOPEN|WS_MAXIMIZE
|WS_VISIBLE|WS_CHILD,FName);
}
//txtファイルの検索
~省略~
FindClose(hFind);
}
// 最後にpIDListのポイントしているメモリを開放します
::CoTaskMemFree( pIDList );
}
}
という具合です。
長々と申し訳ないのですが宜しくお願いします。
ソースを一部抜粋します
>void SAMPLEDlg::OnBnClickedButton1()
>{
> ・
> ・
> bInfo.lpfn = NULL; // BrowseCallbackProc関数のポインタ
> ・
> ・
>}
とありますがNULLがされていますが、これでは初期フォルダを指定できません。
BROWSEINFO や BrowseCallbackProcを検索してみてください。
グーグル様は教えてくれます。
「デフォルトで任意のフォルダを指定したいのですが」とは、
ダイアログ表示時に特定のフォルダを選択状態にしたい。という事かな。
下記はどうかな?
http://www.ne.jp/asahi/yamashita/programming/tips/1.html
「ファイル名不特定なので拡張だけで判断して」とは、
ある拡張子でファイルを検索したい、例えば、*.txt を検索したい。という事かな。
下記の関数群はどうかな?
FindFirstFile()
FindNextFile()
FindClose()
ドルドルさん、杏の里さん
返信ありがとうございます。
ドルドルさん
>>BROWSEINFO や BrowseCallbackProcを検索してみてください。
検索してみましたが、どこでフォルダを指定しているのでしょうか?
厚かましいことを言って申し訳ないのですが、自分のソースにいれるとしたらどうした
らよいのでしょうか?
杏の里さん
>>「ファイル名不特定なので拡張だけで判断して」とは、
>>ある拡張子でファイルを検索したい、例えば、*.txt を検索したい。という事かな。
その通りです。
FindFirstFile()は自分のソースでも使用しています。
それで拡張子だけでファイル検索は可能なのでしょうか?
フォルダ選択ダイアログで検索するとたくさんヒットするので
一つ一つ確認して行けば、詳しいHPもありますよ。
例
http://www.ne.jp/asahi/yamashita/programming/tips/1.html
PATIOさん返信有難うございます。
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 bInfo;
LPITEMIDLIST pIDList;
TCHAR path[512];
//フォルダ選択ダイアログ 準備
bInfo.hwndOwner = AfxGetMainWnd()->m_hWnd; //親ウインドウのハンドル
bInfo.pidlRoot = NULL; //デフォルトパス(NULL:デスクトップ)
bInfo.pszDisplayName = path; //選択されたパス受け取り用バッファ
bInfo.lpszTitle = _T(フォルダの選択); //ダイアログに表示するタイトル
bInfo.ulFlags = BIF_EDITBOX;
bInfo.lpfn = callback; // BrowseCallbackProc関数のポインタ
bInfo.lParam = (LPARAM)C:\\BLOOD; // コールバック関数に渡す値
~省略~
としたところ
error C2601: 'callback' : ローカル関数の定義が正しくありません。となってしまい
ました。
int CALLBACK callback(HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData)をヘッ
ダーファイルで宣言しないといけないのでしょうか?
まずは、HELPでC2601を調べるべきですね。
アウトプットウインドウのエラー表示がされている行にカーソルを持っていって
F1キーを押せば説明が出ると思いますよ。
関数の定義をする為の基本的な部分が理解できていない様な気がします。
その部分が怪しいのであれば、きちんとC++言語の文法を体系的に勉強する事を
お勧めします。
一般的にはC++言語の入門書を使って学習すると良いと思います。
その際、ウインドウを表示するプログラムで勉強するのではなく、
コンソールプログラムで純粋に文法の勉強をするようにした方が
色々悩まなくてすむのでよろしいのではないかと思います。
>検索してみましたが、どこでフォルダを指定しているのでしょうか?
>厚かましいことを言って申し訳ないのですが、自分のソースにいれるとしたらどうした
>らよいのでしょうか
”BrowseCallbackProc”検索してみたら PATIOさんが教えられているページなどたく
さんサンプルが見つかりましたよ。
>int CALLBACK callback(HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData) {
> ・
> ・
> ・
>}
ヨッピーさんの書かれているソースに問題はなさそうな感じです。エラーに関しては
前述したサンプルページなどで解決できるかと思いますよ。ついでなのでCALLBACK関数
についても調べてみたらもっと理解が深まると思いますよ。がんばってください
皆様色々と有難うございました。
サンプルソースなどを見て解決することができました。
初心者でまだまだな部分が多々あるのでこれから勉強していきたいと思います。