VC++6.0 XP
CMainFrameクラスに自前のファイルオープンメソッドを追加したのですが、このあとド
キュメントクラスでどのようにして、読み込むか、わかりません。ご存知の方よろしく
おねがいします。
void CMainFrame::OnBitmapRead()
{
// TODO: この位置にコマンド ハンドラ用のコードを追加してください
CFileDialog wDialog (
TRUE, // TRUE: 開く FALSE: 閉じる
.bmp,
Untitled.bmp,
OFN_CREATEPROMPT,
Bitmap Files *.bmp | *.bmp,
NULL) ;
int result = wDialog.DoModal() ;
if (result == IDOK) {
CString wFileName = wDialog.GetPathName() ;
//ドキュメントクラスにつなげて、ドキュメントクラスで読み込みしたい。
AfxMessageBox(wFileName,MB_OK) ;
}
}
viewクラスでは、GetDocument()がつかえて、ドキュメントクラスのメソッドなどが使え
ますが、そのようなことができるのでしょうか?
なんでCMainFrameクラスにファイルオープンメソッドを追加しようと考えるのかなぁ。
素直にアプリケーションクラスのOnFileOpenをオーバーライドすればいいのに。
maruさん、レスありがとうございます。多種類のファイルをオープンし、それぞれ、違
う加工方法をとり、意味合いもちがうので、そうしたいのですが、面倒なことになりそ
うですね。
多種類のファイルを扱うなら、MDIにしてドキュメント種類毎にドキュメントテンプ
レートを準備、種類毎にそれぞれのテンプレートに管理させる。
(当然それぞれのテンプレート毎にビューもそのドキュメント種類毎に適したものに
する)
いずれににせよ、ドキュメントを管理するのはアプリケーションクラスであり、メイン
フレームではないので、CMainFrameクラスにファイルオープンメソッドを実装するのは
お門違い。
私なら、アプリケーションクラスのOnFileOpenをオーバーライドし、ファイル拡張子毎
異なるドキュメントテンプレートで処理を行う。
> viewクラスでは、GetDocument()がつかえて、ドキュメントクラスのメソッドなどが使え
> ますが、そのようなことができるのでしょうか?
そのようなメソッドが無いワケでは無いので一応紹介。
CFrameWnd::GetActiveDocument
http://msdn.microsoft.com/ja-jp/library/cdc4chb3.aspx
CView::GetDocument() で返されるドキュメントクラスは一意だが、コレは「現在アク
ティブなビューに結び付けられている」ドキュメントクラスを返す点に注意。
maruさん、gakさん、レスポンスありがとうございます。
質問が分岐しちゃいますが、アプリケーションクラスのOnFileOpenをオーバーライドし
た場合、なにかしないと、ドキュメントクラスのSerialize(CArchive& ar)は、呼ばれな
いです。どうしたらよろしいのでしょうか?ご存知でしたら、よろしくおねがいしま
す。読み込みメソッドは、ドキュメントクラスに書くのが妥当だとおもいますが・・
maruさん、どうもありがとうございました。たすかりました。
OpenDocumentFile(fd.GetPathName());をよびだすことにより、ドキュメントクラスをよ
びだすことができました。
void CTest9App::OnFileOpen()
{
// TODO: この位置にコマンド ハンドラ用のコードを追加してください
CFileDialog fd(
TRUE, //開く
", //デフォルトの拡張子
", //デフォルトのファイル名
OFN_FILEMUSTEXIST|
OFN_HIDEREADONLY|
OFN_LONGNAMES, //フラグ
テキスト (*.TXT)|*.TXT|
ドキュメント (*.DOC)|*.DOC|
全てのファイル(*.*)|*.*||, //フィルタ
NULL //親ウィンドウ
);
// fd.m_ofn.lpstrInitialDir=(LPCSTR)C:\\temp; //初期ディレクトリ
if(fd.DoModal()==IDOK){
OpenDocumentFile(fd.GetPathName());
}
}