CFileDialog の初期画面でファイルを選択するには? – プログラミング – Home

CFileDialog の初期画面でフ...
 
通知
すべてクリア

[解決済] CFileDialog の初期画面でファイルを選択するには?


有
 有
(@有)
ゲスト
結合: 16年前
投稿: 6
Topic starter  

開発環境 : MFC, VS2005(VC++)

CFileDialogで「ファイルを開く」ダイアログを作成しています。
ダイアログを開いたときにリストボックスでファイルを選択しておきたいのですが、
どうしたらよいのでしょうか。
 ご存知の方いらっしゃいましたらよろしくお願い致します。


引用未解決
トピックタグ
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

CFileDialogの3番目ですね。
詳しくは、MSDN CD をよく見ましょう。
キ-ワ-ドに入力すればすぐでるよ.


返信引用
有
 有
(@有)
ゲスト
結合: 16年前
投稿: 6
Topic starter  

すみません。説明不足でした。

複数のファイルを選択したいのです。
複数選択する方法を探しているのですがありますか?

CFileDialogの3番目にファイル名をいれれば、「ファイル名」欄にファイル名は表示されま
したが、上のリストボックスでファイル名が反転しません。

また、
 1.CFileDialog を表示。
 2.CFileDialogに追加したボタンをおしたら、処理を実行。(CFileDialogは表示したま
ま)
 3.処理が終わったら、複数のファイルを選択する
ということもしたいのですが、どうしたらできるのでしょうか。

よろしくお願いします。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

五番目に指定すればいいんじゃないですか?
「*.cpp」等でいいんですよね。


返信引用
有
 有
(@有)
ゲスト
結合: 16年前
投稿: 6
Topic starter  

書き込みありがとうございます。

5番目は「ファイルの種類」欄に書かれるFilterですよね?
ここは設定してあります。

ディレクトリが指定してあり、そのフォルダに
1.cpp, 2.cpp, 3.cpp・・・・10.cpp
の10個のファイルがあるとします。

このうち、1.cpp, 2.cpp, 3.cppの3つのファイルを
クリックして選ぶと、「ファイル名」欄に
1.cpp 2.cpp 3.cpp
と書かれていて、
かつ、アイコンが反転してるような状態になりますよね。

ダイアログ起動時にこの状態にしたいのです。

よろしくお願いします。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

> ユーザーが複数のファイルを選択できるようにするには、
> DoModal を呼び出す前に OFN_ALLOWMULTISELECT フラグを設定します。
> この場合、複数のファイル名のリストを格納できるようなバッファを用意する
> 必要があります。
> この処理を行うには、まず CFileDialog のコンストラクタを呼び出し、
> m_ofn.lpstrFile に用意したバッファを指すポインタを設定してから、
> DoModal を呼び出します。さらに m_ofn.lpstrFile で指定した
> バッファの文字数を m_ofn.nMaxFile に設定する必要があります。
って書いてありますね。
m_ofn.lpstrFile や、m_ofn.nMaxFileを設定しないといけないみたいですね。
こういうことはやってみたことないですね。
あらかじめ、m_ofn.lpstrFileのバッファにファイル名を書き込んでおけばいいように
思いますが。
この方法でいいといえるものはないです。


返信引用
杏の里
 杏の里
(@杏の里)
ゲスト
結合: 17年前
投稿: 7
 

OFN_ALLOWMULTISELECT で検索すれば出てきます。
例えば下記は参考になるかな。
http://akky.cjb.net/mfc/manyfile.html


返信引用
有
 有
(@有)
ゲスト
結合: 16年前
投稿: 6
Topic starter  

杏の里さん、書き込みありがとうございます。
説明が下手で本当にすみません。

これは、ユーザーがダイアログ上でクリックしたファイル名を取得する方法ですよね。

ダイアログを開いたときにすでにファイルが選択された状態にしておきたいのです。
(アイコンが反転していて、「ファイル名」欄にファイル名が書かれている状態)

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){
}


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

> できないんでしょうか・・・。
どうも難しいみたいですね。
存知な方よろしくお願いします。
> http://kumei.ne.jp/c_lang/sdk3/sdk_275.htm


返信引用
と
 と
(@と)
ゲスト
結合: 20年前
投稿: 33
 

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;
}

正しいコードかどうかはともかく、やりたいのはこゆことでしょうか?


返信引用
有
 有
(@有)
ゲスト
結合: 16年前
投稿: 6
Topic starter  

と さん、書き込みありがとうございます。
そうです、そうです。

できるんですね。
ちょっとやってみたらなぜかフォルダ名が反転してしまいました。


返信引用
と
 と
(@と)
ゲスト
結合: 20年前
投稿: 33
 

wnd->SetItemState(nIndex, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED |
LVIS_FOCUSED);

wnd->SetFocus(); // ←ぬけてました。
break;


返信引用
と
 と
(@と)
ゲスト
結合: 20年前
投稿: 33
 

>ちょっとやってみたらなぜかフォルダ名が反転してしまいました。

ファイル名の完全一致の条件を入れないとだめみたいですね。

FindItemの第2引数を使って
GetItemTextとファイル名が一致するまでループ
みたいな処理も必要かもしれません。


返信引用
有
 有
(@有)
ゲスト
結合: 16年前
投稿: 6
Topic starter  

ありがとうございました。
と さんの教えてくださった方法でやってみます。

説明不足でお手数かけてすみませんでした。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました