開発環境 : MFC, VS2005(VC++)
CFileDialogで「ファイルを開く」ダイアログを作成しています。
ダイアログを開いたときにリストボックスでファイルを選択しておきたいのですが、
どうしたらよいのでしょうか。
ご存知の方いらっしゃいましたらよろしくお願い致します。
CFileDialogの3番目ですね。
詳しくは、MSDN CD をよく見ましょう。
キ-ワ-ドに入力すればすぐでるよ.
すみません。説明不足でした。
複数のファイルを選択したいのです。
複数選択する方法を探しているのですがありますか?
CFileDialogの3番目にファイル名をいれれば、「ファイル名」欄にファイル名は表示されま
したが、上のリストボックスでファイル名が反転しません。
また、
1.CFileDialog を表示。
2.CFileDialogに追加したボタンをおしたら、処理を実行。(CFileDialogは表示したま
ま)
3.処理が終わったら、複数のファイルを選択する
ということもしたいのですが、どうしたらできるのでしょうか。
よろしくお願いします。
五番目に指定すればいいんじゃないですか?
「*.cpp」等でいいんですよね。
書き込みありがとうございます。
5番目は「ファイルの種類」欄に書かれるFilterですよね?
ここは設定してあります。
ディレクトリが指定してあり、そのフォルダに
1.cpp, 2.cpp, 3.cpp・・・・10.cpp
の10個のファイルがあるとします。
このうち、1.cpp, 2.cpp, 3.cppの3つのファイルを
クリックして選ぶと、「ファイル名」欄に
1.cpp 2.cpp 3.cpp
と書かれていて、
かつ、アイコンが反転してるような状態になりますよね。
ダイアログ起動時にこの状態にしたいのです。
よろしくお願いします。
> ユーザーが複数のファイルを選択できるようにするには、
> DoModal を呼び出す前に OFN_ALLOWMULTISELECT フラグを設定します。
> この場合、複数のファイル名のリストを格納できるようなバッファを用意する
> 必要があります。
> この処理を行うには、まず CFileDialog のコンストラクタを呼び出し、
> m_ofn.lpstrFile に用意したバッファを指すポインタを設定してから、
> DoModal を呼び出します。さらに m_ofn.lpstrFile で指定した
> バッファの文字数を m_ofn.nMaxFile に設定する必要があります。
って書いてありますね。
m_ofn.lpstrFile や、m_ofn.nMaxFileを設定しないといけないみたいですね。
こういうことはやってみたことないですね。
あらかじめ、m_ofn.lpstrFileのバッファにファイル名を書き込んでおけばいいように
思いますが。
この方法でいいといえるものはないです。
OFN_ALLOWMULTISELECT で検索すれば出てきます。
例えば下記は参考になるかな。
http://akky.cjb.net/mfc/manyfile.html
杏の里さん、書き込みありがとうございます。
説明が下手で本当にすみません。
これは、ユーザーがダイアログ上でクリックしたファイル名を取得する方法ですよね。
ダイアログを開いたときにすでにファイルが選択された状態にしておきたいのです。
(アイコンが反転していて、「ファイル名」欄にファイル名が書かれている状態)
ITOさんがおっしゃるように
>あらかじめ、m_ofn.lpstrFileのバッファにファイル名を書き込んでおけばいいように
思いますが。
m_ofn.lpstrFileに\1.cpp\ \2.cpp\ \3.cpp\"を代入すると
ダイアログが表示されなくなります。
できないんでしょうか・・・。
CString dir_name, fileName;
CMyFileDialog cfDrg( TRUE, NULL, NULL, OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST |
OFN_ALLOWMULTISELECT, _T(cpp Files (*.cpp) |*.cpp | All Files (*.*) | *.*||),
NULL);
cfDrg.m_ofn.lpstrInitialDir = (LPCTSTR)dir_name;
cfDrg.GetOFN().lpstrFile = fileName.GetBuffer(MAX_FILE);
cfDrg.GetOFN().nMaxFile = MAX_FILE;
if( cfDrg.DoModal() == IDOK){
}
> できないんでしょうか・・・。
どうも難しいみたいですね。
存知な方よろしくお願いします。
> http://kumei.ne.jp/c_lang/sdk3/sdk_275.htm
CFileDialogを継承してメンバー変数なりに
選択したいファイル名を渡しておきます。
ファイルが表示された時点で(OnNotifyのCDN_FOLDERCHANGE以降?)
リスト部syslistview32のハンドルを取得して
CListCtrl::FindItemとCListCtrl::SetItemStateで
選択すればできそうです。
#include <dlgs.h>//lst2
BOOL Cxxxx::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
switch ( ( ( LPOFNOTIFY )lParam) -> hdr.code ) {
case CDN_FOLDERCHANGE:
LVFINDINFO info;
int nIndex;
// syslistview32のハンドル取得(ここ分からなかったのでこぴぺ)
HWND shelldll_defview=::GetDlgItem( GetParent()->m_hWnd, lst2 );
HWND syslistview32=::GetDlgItem( shelldll_defview, 1 );
CListCtrl* wnd = (CListCtrl*)CWnd::FromHandle( syslistview32 );
// 複数ファイルのときはループ
info.flags = LVFI_PARTIAL|LVFI_STRING;
info.psz = m_str;
nIndex=wnd->FindItem(&info);
wnd->SetItemState(nIndex, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED |
LVIS_FOCUSED);
break;
}
正しいコードかどうかはともかく、やりたいのはこゆことでしょうか?
と さん、書き込みありがとうございます。
そうです、そうです。
できるんですね。
ちょっとやってみたらなぜかフォルダ名が反転してしまいました。
wnd->SetItemState(nIndex, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED |
LVIS_FOCUSED);
wnd->SetFocus(); // ←ぬけてました。
break;
>ちょっとやってみたらなぜかフォルダ名が反転してしまいました。
ファイル名の完全一致の条件を入れないとだめみたいですね。
FindItemの第2引数を使って
GetItemTextとファイル名が一致するまでループ
みたいな処理も必要かもしれません。
ありがとうございました。
と さんの教えてくださった方法でやってみます。
説明不足でお手数かけてすみませんでした。