電子書籍の厳選無料作品が豊富!

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についてのドキュメントマネージャーも分ける必要があるのでしょうか?

ご教授よろしくお願いします

A 回答 (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のコンストラクタの引数が
全て同じ値なのが気になります。少なくとも第一引数は別の値になるのが普通だと思います。
第一引数はドキュメントの拡張子などを指定する重要なパラメータですので、良く調べることをお勧めします。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/06/12 12:46

> [開く]で画像ファイル(bmpかjpeg)を開いた場合、


CWinApp::OnFileNewが呼び出されるのは[開く]ではなく[新規作成]の場合です。

[開く]の場合はCWinApp::OnFileOpenが呼び出されます。
OnFileOpenが呼び出されれば、その後呼び出されるのは
CDocManager::OnFileOpenですので、
> ドキュメントテンプレートはm_ptTemplate2になってしまいます
ということはありません。

違うところを追いかけているように思えます。確認してみて下さい。

また、以下の情報を教えて頂けると、より詳しいことが分かるかもしれません。
・MFC(あるいは開発環境の)バージョン
・CMultiDocTemplateオブジェクトをnewで生成している部分のコード
・そのnewの第一引数に与えているリソースIDが示す文字列

この回答への補足

ご回答ありがとうございます。
[開く]ではなく、[新規作成]の場合の話でした、まぎらわしくてすみません。
今回最終的に作りたいのがビューワーだけでなく、画像を保存できるようにしたいので、新規作成でも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が指定されてしまいます。

補足日時:2005/06/11 14:24
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!