• 締切済み

複数のドキュメントテンプレートを作成してから....

MFCプログラミングにおいてMDIアプリケーションを作っています このアプリケーションではbmpやjpegなど、複数の画像のビューワーの役割をさせようと思っています CMainAppの派生クラスC**AppのIintInstance関数内で CMultiDocTemplate* pDocTemplate; を削除し C**Appのパブリックメンバ変数として CMultiDocTemplate* m_ptTemplate1; //bmp用 CMultiDocTemplate* m_ptTemplate2; //jpeg用 として定義しなおし 最後に AddSocTemplate(m_ptTemplate1); AddSocTemplate(m_ptTemplate2); を行いました ここまではなんとか出来たのですが、この次の段階で困っています アプリケーションを立ち上げてから [開く]で画像ファイル(bmpかjpeg)を開いた場合、 その動作を順に見て見ると CWinApp::onFileNew関数内  m_pDocManager->OnFileNew(); ↓ CDocManager::OnFileNew関数内 CDocTemplate* pTemplate= (CDocTemplate*)m_templateList.GetHead(); となっていました これだとbmpを選んでもjpegを選んでも GetHead関数によって、ドキュメントテンプレートは m_ptTemplate2になってしまいます これを避けるためにはやはり、 [開く]からbmpを選んだ場合とjpegを選んだ場合とで メッセージを変えて、 bmpならOnFileBmpNew関数へ jpegならOnFileJpegNew関数へ飛ぶように C**Appで独自のメンバ関数を作るべきでしょうか? またどのようにしてm_pDocManagerのどの位置にm_ptTemplate1とm_pTemplate2が格納されているか特定することができるのでしょうか? ここまでの疑問はbmp、jpegについてドキュメントテンプレートを分けて、 そのテンプレートをリスト管理するドキュメントマネージャーは同じものを使っていましたが、 もしかして、bmp、jpegについてのドキュメントマネージャーも分ける必要があるのでしょうか? ご教授よろしくお願いします

みんなの回答

  • MASATO3
  • ベストアンサー率60% (27/45)
回答No.2

> >CMultiDocTemplateオブジェクトをnewで生成している部分のコード ご提示のコードですが、 m_pDocTemplate2とm_pDocTemplateとm_pDocTemplate1が混ざっています。 最初の方がm_pDocTemplate1で、最後の方がm_pDocTemplate2となっていると仮定して 話を進めます。 > CDocManager::OnFileNew関数内に入ったときに >  CDocTemplate* pTemplate=   >   (CDocTemplate*)m_templateList.GetHead(); > この記述で新規作成するドキュメントのドキュメントリストが指定されるわけですが、 そこは本当にそう動いてますか? その後の if (m_templateList.GetCount() > 1) から始まるブロックの中で、 pTemplateは別の値に置き換えられていませんか? また、CMultiViewSingleDocTemplateのコンストラクタの引数が 全て同じ値なのが気になります。少なくとも第一引数は別の値になるのが普通だと思います。 第一引数はドキュメントの拡張子などを指定する重要なパラメータですので、良く調べることをお勧めします。

houka
質問者

お礼

コメントありがとうございます。 記述に間違いがあって、混乱させてしまって申し訳ないです; CMultiViewSingleDocTemplateのコンストラクタの引数の意味を考えたことがなかったので、もう一度調べ直してみます。ご指摘ありがとうございます。MFCを使っての開発ははじめてなので色々とまどいもありますが、ドキュメント/ビュー構造はとても面白いと思ってまして、日々精進したいと思います。

すると、全ての回答が全文表示されます。
  • MASATO3
  • ベストアンサー率60% (27/45)
回答No.1

> [開く]で画像ファイル(bmpかjpeg)を開いた場合、 CWinApp::OnFileNewが呼び出されるのは[開く]ではなく[新規作成]の場合です。 [開く]の場合はCWinApp::OnFileOpenが呼び出されます。 OnFileOpenが呼び出されれば、その後呼び出されるのは CDocManager::OnFileOpenですので、 > ドキュメントテンプレートはm_ptTemplate2になってしまいます ということはありません。 違うところを追いかけているように思えます。確認してみて下さい。 また、以下の情報を教えて頂けると、より詳しいことが分かるかもしれません。 ・MFC(あるいは開発環境の)バージョン ・CMultiDocTemplateオブジェクトをnewで生成している部分のコード ・そのnewの第一引数に与えているリソースIDが示す文字列

houka
質問者

補足

ご回答ありがとうございます。 [開く]ではなく、[新規作成]の場合の話でした、まぎらわしくてすみません。 今回最終的に作りたいのがビューワーだけでなく、画像を保存できるようにしたいので、新規作成でもbmpかjpegを選べるようにしたいと考えています。 そこで[新規作成]で動きをみていっていたので、こちらの話で質問を進めさせてください; MFCバージョンはVisual Studio .Netです。 >CMultiDocTemplateオブジェクトをnewで生成している部分のコード CMultiViewSingleDocTemplate* m_pDocTemplate2; pDocTemplate = new CMultiViewSingleDocTemplate(   IDR_MDITESTYPE,   RUNTIME_CLASS(CSingleDocMdiDoc),   RUNTIME_CLASS(CChildFrame),   RUNTIME_CLASS(CSingleDocMdiView)); AddDocTemplate(m_pDocTemplate1); CMultiViewSingleDocTemplate* m_pDocTemplate2; pDocTemplate = new CMultiViewSingleDocTemplate(   IDR_MDITESTYPE,   RUNTIME_CLASS(CSingleDocMdiDoc),   RUNTIME_CLASS(CChildFrame),   RUNTIME_CLASS(CSingleDocMdiView)); AddDocTemplate(m_pDocTemplate2); > ドキュメントテンプレートはm_ptTemplate2になってしまいます これは上記のようにInitInstanceで  AddDocTemplate(m_pDocTemplate1);  AddDocTemplate(m_pDocTemplate2); の順に呼び出しているのでAddDocTemlate関数内の  m_pDocManager->AddDocTemplate(pTemplate); この部分でm_pDocManagerにpTemplateを追加しています。 つまりm_pDocManagerのリスト内は (m_pDocTemplate2, m_pDcoTemplte1)のアドレスが入っています。 なので、[新規作成]から CDocManager::OnFileNew関数内に入ったときに  CDocTemplate* pTemplate=     (CDocTemplate*)m_templateList.GetHead(); この記述で新規作成するドキュメントのドキュメントリストが指定されるわけですが、 GetHeadでドキュメントリストが指定されるのでm_pDocManagerのリストの先頭に格納されているm_pDocTemplate2が指定されてしまいます。

すると、全ての回答が全文表示されます。

関連するQ&A