MFCのMDIで複数ファイルを開くには

[戻る]
ネオパラ 2006/10/11(水) 03:13:09
はじめまして。
環境はVC7です。

MFCのMDIで複数のファイルを開くにはどうしたらいいですか。
OnOpenFileをオーバーライドして、ファイル名をメンバ変数で保持しておけばいいのか
な、と考えているのですが間違ってますか。
どうか助言をお願いします。

επιστημη 2006/10/11(水) 08:42:42
何に困っているのかわかりません。
WizardでMDI/CEditViewを選ぶだけで簡単なMDIエディタ(の雛形)を
作ってくれますが、これじゃダメなんですか?

ネオパラ 2006/10/11(水) 08:52:29
書き方を間違えました。
MFCのMDIで「ひとつのビューに」複数のファイルを開くにはどうしたらいいです
か。

エディタをつくるわけではないので、CEditViewを使うつもりはありません。
(編集ツールなので、ある意味エディタですが)

Blue 2006/10/11(水) 09:00:15
いくつも1つのビューに表示させるのでしょうか?
それだと結構大変なようですが。

2,3であれば、CSplitterWndを使ったビューを持てばできるかと。
ただ、なんでMDIをつかうのかわかりませんけど。(SDIでいいのでは?)

※CSplitterWndについては検索すればサンプルがゴロゴロ出てきます。(但しSDI)

ネオパラ 2006/10/11(水) 09:20:29
回答ありがとうございます。
ファイルというのは3次元データでして、OpenGLでひとつのビューにまとめて表示しよ
うと考えています。
それをひとつの"塊"とすると、異なるビューで別の"塊"も表示したいため、MDIのほうが
都合よいです。

επιστημη 2006/10/11(水) 10:40:23
> MFCのMDIで「ひとつのビューに」複数のファイルを開くにはどうしたらいいです
か。

やっぱり何に困ってるんだかわかりません。 
好きなだけfopenでもなんでもやりゃいーじゃん、て思う。

おと 2006/10/11(水) 12:06:57
> MFCのMDIで「ひとつのビューに」複数のファイルを開くにはどうしたらいいです
か。

MDIの各VIEWにファイルをそれぞれ表示させる方法は知っているのですか
MDIを使っているならそれでことたりると思うけど
επιστημηさんのおっさはるように 
やっぱり何に困ってるんどかわからない

PATIO 2006/10/11(水) 13:16:22
複数のファイルがワンセットになって一つの塊を表現しているのなら
それらがワンセットになっている事がわかる手段が必要でしょうね。
少なくとも標準のFileOpen処理では1ファイルを指定するインターフェイスしかないので
そのインターフェイスに乗っかって解決する手段を考えるか、
今のインターフェイスをオーバーライドして全く新しく実装するかしないと駄目でしょう。
今のインターフェイスに乗っかるのであれば、必要なファイル群を記述したファイルを
作成してそのファイルを読み込んで必要な一連のファイルのパスを取得して
それぞれOpenしてデータ展開するとかになりますかねぇ。
代表になるファイル名から他の必要なファイル名を編集で作成できるのであれば、
どれでも良いので代表になるファイルの拡張子を決めてそのファイルを指定させれば、
芋づる式に他のファイル名もわかるでしょう。
この場合でも各ファイルのパスさえわかれば、読み込みそのものはfopenでもCFileでも
使ってなんとかかるでしょう。
一つのドキュメントクラスで複数のファイルで保持している情報を全て保持するように
すれば、多分行けるんじゃないでしょうか。
この辺はファイルの構成もわからないので何ともいえませんけれど。
複数のファイルで一つのドキュメントを構成していると考えれば、
一つのドキュメントクラスで複数のファイルを扱ってもおかしくないのでは?

この辺は考え方一つなので一面的に捕らえないで見方を変えてみる事をお勧めします。

PATIO 2006/10/11(水) 13:18:26
ううっ、誤字。

誤)
使ってなんとかかるでしょう。

正)
使ってなんとかなるでしょう。

Ryo 2006/10/11(水) 13:22:22
MFCで用意されてる「開く」を利用するのではなく
自分なりの「塊を開く」ためのプログラムを組む必要があるので
使用してる言語の基礎を知らぬまま、MFCにたよってすすめられるのもこのあたりが限界

今やりたいことも、OpenGLも一度おいといて、
C言語(++)でのファイルの読み込み方を勉強するのが一番確実

PATIO 2006/10/11(水) 15:52:17
> 使用してる言語の基礎を知らぬまま、MFCにたよってすすめられるのもこのあたりが限界

C++言語の基礎がわかっていないのなら言語の基礎からやった方がいいですよ。
C++がわかってないとMFCを使いこなすのは無理ですし。
できれば、ウインドウの制御が出てこないコンソールプログラムで勉強するのが
お勧めです。ウインドウ制御の部分で悩まないで済む分だけC++言語の勉強に専念できます。

実際の話、VC++の入門書を使ってC++言語の勉強とMFCの勉強とIDEの使い方の勉強を
同時にやろうとしても無理がありますからね。
あせって先を急ぐよりもきちんと足回りを固める事をお勧めします。

ネオパラ 2006/10/11(水) 21:07:43
回答ありがとうございます。
また説明不足でした。
ひとつの塊という表現がまずかったです。
ビューに表示するのは必ずしも毎回同じではありません。
ビューを車に例えると、タイヤだけを見たいときもあるし、ドアや屋根も見たいときが
あります。
そしてビューは車種ということになります。

結局何が聞きたかったかというと、MFCで用意されてる「開く」ではひとつのファイルし
か選択できません。
複数のファイルを選択するには、OnFileOpenでCFileDialogを使うべきですか?というこ
とでした。
そして選択されたファイル名を保持するには、メンバ変数に保存しておけばいいです
か?です。
これは追加ですが、こういう場合はドキュメントクラスは使わないほうがよいですか?
当初はドキュメントクラスは使わないので無視すればいいかなって思ってました。
これらは自分の中ではほぼ固まっていた案でしたが、本当にこれでいいのかな?と思っ
たため助言をいただこうと質問してみました。
よろしくお願いします。

aharen [HomePage] 2006/10/12(木) 07:47:39
>MFCで用意されてる「開く」ではひとつのファイルしか選択できません。

そうです つまり既製品です マルチ的な選択はできないとおもいます

>CFileDialogを使うべきですか?ということでした。

"べき"かどうかは別にして方法のひとつです

>メンバ変数に保存しておけばいいですか?です。

メンバ変数あるいはグローバル変数にいれておけばよいでしょう
要するに目的の処理がおわるまで保持できる変数であればよいでしょう

>ドキュメントクラスは使わないほうがよいですか?

ドキュメントクラスは使わないというよりは
既製品である「開く」は適していないということでしょう
処理によってはドキュメントクラスとビュークラスを頻繁に
やりとりするときもあるのでドキュメントクラスを使うかどうかは
作っている本人でないとわからない

>本当にこれでいいのかな?と思ったため助言をいただこうと質問してみました。

方法はいくつかあります
(一部分似たような処理はやったことありますが)
(1)最初は
   CFileDialogを複数回使って目的のファイルパス達を取得し
   ファイル達を開いてその後の処理をやっていました
(2)上記の方法は結構不便だったので
  (2.1)必要なファイル達はひとつのディレクトリにおさめる
  (2.2)ボタン押してファイルリストをエディトボクスに取得する
  (2.3)その中からファイル達を選択し別のボタンで
       選択したファイル達を別のボックスにうつす
  (2.4)別のボタンを押し選択したファイル達を使って
       目的の描画あるいは表示処理をする
ざっとこんなふうでした
そのほかにもいろいろ考えられると思います

要するにmustではなくて
スピード、操作性、美的感覚などから観て
ご自分に適した方法でやればよいと思う

PATIO 2006/10/12(木) 12:01:57
ドキュメントクラスに関しては私は既に前のレスポンスで書いているので
そちらを見てください。2006/10/11(水) 13:16:22の奴です。

>MFCで用意されてる「開く」ではひとつのファイルしか選択できません。
>複数のファイルを選択するには、OnFileOpenでCFileDialogを使うべきですか?
>ということでした。
>そして選択されたファイル名を保持するには、メンバ変数に保存しておけばいいですか?
>です。

これもやり方一つだと思いますけれど。
これに関連する事も既にレスポンス済みです。(2006/10/11(水) 13:16:22の書き込み)

一ついえる事はCWinApp::OnFileOpenを乗っ取って自前で複数ファイル名を取得するように
したとしても本来の流れの処理からは外れてしまうのでDOC−VIEWアーキテクチャに
どう繋げて行くのかまで理解していないとうまくいかなそうだなということです。
実際にCFileDialogを出してドキュメントクラスのシリアライズに繋がる実装がある所は
CWinAppではないのでうまく繋がるかどうかはその辺りの実装をきちんと理解して行う
必要があります。

今の一つのファイルを指定するインターフェイスでうまく処理できないかどうかの検討を
するべきではないでしょうか。

PATIO 2006/10/12(木) 12:13:59
追伸:
前の書き込みの最後の表現はいまひとつだったので訂正。

一つのファイルを指定するインターフェイスで解決する手段がないか考えてみるのも
一つの方法だと思います。DOC-VIEWアーキテクチャを無視してプログラムを作成するのも
また、一つの方法ですね。
どれが良いのかは多分御本人が決めるしかないので御随意にと言うところでしょうか。

例えばですが、
各部品を一纏めに管理する仕組みを考えた上でその中の部品毎に表示/非表示を
切り替えられるようなインターフェイスを提供するのも一つの解決法でしょう。
やりようによっては方法はいくらでもあると思いますよ。

r 2006/10/12(木) 15:24:04
CxxxApp::OnOpenFile()の中で、
1.OFN_ALLOWMULTISELECT指定のCFileDialogを使って複数ファイル選択させる。
2.一時ファイルを作成し、選択ファイル名の一覧をそこに保存する。
3.作成した一時ファイル名を使ってCWinApp::OpenDocumentFile()を呼び出す。
4.作成した一時ファイルを削除。

3.の中でCxxxDoc::Serialize()が呼び出されるので、そこで一時ファイルから選択ファ
イル一覧を取り出し、各ファイルを読んでCxxxDocに記憶する。

という流れでやればDoc-Viewを利用して比較的簡単にできそうな気がしますが...

PATIO 2006/10/12(木) 16:43:00
なるほど、一旦ファイルに落とせば何とかなりそうですね。
自分でそういう仕組みを考えてはと言いながらそこまで考えていませんでした。

CWinApp::OnOpenFile以降の流れをきちんと追って行けば確かにそれでできそうです。
同様のケースの場合に参考にさせていただきます。

古いスレッドには追加発言できません。