• 締切済み

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

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についてのドキュメントマネージャーも分ける必要があるのでしょうか? ご教授よろしくお願いします

  • houka
  • お礼率50% (1/2)

みんなの回答

  • 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

  • templateクラスの宣言と定義を、別々のファイルに分けたい

    こんばんは。 templateを利用したクラスについての質問です。 通常、テンプレートクラスのメンバ関数は、その定義部分をインライン展開するべき、とのことですが… なんとかして宣言部と定義部を別々のファイルに分ける事は出来ないでしょうか? テンプレート変数をクラス内で共有したいため、テンプレート関数ではなく、テンプレートクラスで上記の事を実現したいのです。 「コンパイラによっては、インライン関数でなければならない」という記述を見かけたので、 コンパイラによってはインライン関数でなくても構わないのでしょうか? 開発環境は WindowsXP-SP2 VisualStudio2005-SP1 C++コンソールアプリケーションです。

  • 複数のビュー表示について

    MFCプログラミングをしています。 AppWizardでMDI(SDI)アプリを作成しました。 今、1つのドキュメント(データ)に対して、 2つのビューを作らなくてはなりません。 (2つ目はOpenGL表示) フレームウィンドウを生成して Create関数のコーディングまでは、 何とか書けましたが、 実行すると、異常終了していまします。 というのも、 新しいウィンドウとドキュメント、ビューの 関連づけがされていないからだと思います。 ウィザードで作られる場合は、 フレームウィンドウとドキュメント、ビューの 関連づけはドキュメントテンプレートを 使っているようですが、 実行後に独自に作る場合は どのようにすれば良いか分からず、困り果てています。 どなたかご指導又はヒントをよろしくお願い致します。

  • MDIで同時起動するドキュメント数の制限方法

    次の開発環境でWindowsアプリを作成するにあたり、 アプリケーションの種類をMDIとします。  WindowsXP Professional  Visual Studio.NET 2002  VC++ MFC そこで、質問なのですがMDIで同時起動する ドキュメント数を制限する方法はありますか。 例えば、ウィンドウ内で開くドキュメント数を 4つまでに制限する。 .NET上での設定なのか、コード上で行うのか。 または、参照するサイトやサンプルプログラム、 書籍、ヒントとなる関数やコードなど、なんでも よろしいのでご存じなことを教えて頂けないで しょうか。

  • C++のテンプレート関数やテンプレートクラスをC#で利用するには?

    C++で作成したテンプレート関数やテンプレートクラス をC#で利用したいと考えております。 テンプレート関数やクラスを明示的実体化してコンパイルし、 C++/CLIでラップすればC#でも使えるという話を聞きました。 テンプレートでない通常の関数やクラスの場合は、 http://www.atmarkit.co.jp/fdotnet/special/vcppinvista01/vcppinvista01_01.html で紹介されているのを見つけたのですが、 テンプレート関数やクラスの場合 具体的にC++/CLI側でどのように記述すればよいか分かりません。 例えば、 ---- [test.h] template <class Type1> class Test{ public:   Type1 x;   template <class Type2>   Type1 func(Type2 y){ ... } }; ----- のようなクラスがあった場合、どうすればよいでしょうか。 明示的な実体化の方法とC++/CLIで明示的実体化した関数やクラスが どのような名前になるのかが分かれば上記サイトの方法で いけるのではないかと思っているのですが…。 環境はVisual Studio2005(or 2008)です。 よろしくお願いいたします。

  • メンバ関数テンプレートの仮想関数。

    VC8.0言語処理系でメンバ関数テンプレートを仮想関数にしたらエラーになりました。 これは、VC8.0言語処理系の対応なのでしょうか? それともC++言語系の仕様なのでしょうか? 今回、メンバ関数の一部にイテレータを使用していまして、その関係で一部の関数がテンプレートになっています。 そして、基底クラスでは実装せず、派生先で実装を強制する純粋仮想関数としたのですが、この処理がコンパイルエラーとなっています。 メンバ関数の参照などを考えたのですが、どうも巧くコンパイルでき無そうです。 この処理が出来ないことは設計段階で把握していなかったので、これが出来ないとすると設計のし直し(テンプレートの廃止など)をしなくてはいけません。 詳しい方がいらっしゃいましたら、お願いします。

  • VisualC++ドキュメント/ビューアキテクチャについて

    ものの本には『データはドキュメントクラスで管理し、ビュークラスではそこからデータをもらってくる』とし、データをドキュメントクラスのメンバ変数で作ることを推奨しているのですが、 データをファイルから読み込み、ビュークラスで表示、加工するようなアプリケーションにおいて、 (a) データをドキュメントクラスのメンバ変数(public)で作る、 (b) データを外部変数で作りどこからでも参照変更できるようにする、 でどう違うのでしょうか。 c/c++初心者です。よろしくお願いします。

  • C++ 画像処理

    C++で画像処理を行おうと思っています。 当初jpegの入出力を試す予定でしたが、検索しても出てくるのがbmpばかりで標準関数はjpegに対応していないのかなと思いました。 C++の画像処理全般に関して詳しく紹介しているサイトや本などはありませんでしょうか。

  • 無料テンプレートのファイルがうまく表示されない

    お世話になります。 fc2無料ホームページを作成中です。 こちら↓のFlash素材無料テンプレートのひとつを http://nikukyu-punch.com/template/yado2_blue/index.html 指定の場所にダウンロード&保存 「WinZip試用版」にて圧縮解凍しました。 保存されたファイル「yado2」を開くと 2つのファイルと幾つかのjpg画像とhtmlドキュメントがあります。 jpg画像は開くと画像が見えますが、 テンプレートトップページのhtmlドキュメントを開くとこんな感じ↓で C:\Documents and Settings\Administrator\Local Settings\Temp\wz6791\yado2_blue\index.html 見本と異なり、画像スペース枠はあるものの画像はなく 文字や文章も無機質に縦列されているだけで 画像貼付も文章を修正することもできません。 ちなみにfalsh playerもダウンロード済です。 また、fc2ホームページのファイルマネージャーの ディレクトリ、ファイルにもアップロードすることができません。 質問1: このテンプレートを通常にアップロードする方法、 質問2: fc2ホームページ文章を書き込める方法 以上の方法を教えて下さい。 なお、ホームページビルダーなどのソフトを使わないで編集を希望しており、 メモ帳で編集しようとしましたが、 保存先のファイルを開けてもyado2のファイルが表示されません。 よろしくお願い致します。

  • テンプレート?

    バッジを制作するためにイラレをテンプレート化したいのですが以下のデータ作成説明文がよくわからず困っています >デザイン作成で使用されるアプリケーションを開いてダウンロードしたPDFファイルを開いて下さい。 その際、正確にテンプレートの作業を行って下さい。 画像の場合、解像度が300dpi以上であるか確認してください。 前項の作業が終りましたらテンプレートの外円を残して内円のみを削除して下さい。 pdfデータをイラレでテンプレート化するとは具体的にどのような作業をすればいいのでしょうか?普通に外円をトレースすればいいのでしょうか?

  • EXEL fileの印刷結果をBMPファイルにしたい。

    EXELで印刷するテンプレート(A4)があります。印刷後スキャナで取り込んでBMPにすることはできますがダイレクトにBMPファイルに出力することは可能でしょうか。EXELはあまり使いませんが画像ソフトはよく使用します。JPEGでも結構です。よろしくお願いします。

専門家に質問してみよう