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件)
- 最新から表示
- 回答順に表示
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のコンストラクタの引数が
全て同じ値なのが気になります。少なくとも第一引数は別の値になるのが普通だと思います。
第一引数はドキュメントの拡張子などを指定する重要なパラメータですので、良く調べることをお勧めします。
コメントありがとうございます。
記述に間違いがあって、混乱させてしまって申し訳ないです;
CMultiViewSingleDocTemplateのコンストラクタの引数の意味を考えたことがなかったので、もう一度調べ直してみます。ご指摘ありがとうございます。MFCを使っての開発ははじめてなので色々とまどいもありますが、ドキュメント/ビュー構造はとても面白いと思ってまして、日々精進したいと思います。
No.1
- 回答日時:
> [開く]で画像ファイル(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が指定されてしまいます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) EXCELマクロでandroidタブレットから取りんだJPEGファイルをうまくセルに貼り付けられない 2 2022/07/31 15:03
- その他(プログラミング・Web制作) uwscとWinShotを使いスクリーンショットを撮る 1 2022/06/30 21:15
- Visual Basic(VBA) ChatGPTに作らせたい Excel VBA 1 2023/04/05 19:56
- その他(プログラミング・Web制作) uwscのCHKING関数の画像の認識がうまくいかない。 1 2022/06/18 20:55
- PDF PDFに精通した方に質問。JPEGファイル群を一つのPDFファイルにするときの容量変化について 6 2023/07/23 19:06
- 画像編集・動画編集・音楽編集 jpgが拡張子の画像を探しています 2 2023/04/06 10:03
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- 一眼レフカメラ 「Imaging Edge」を手動起動せず、ARWファイルを最高画質JPEGへ変換する方法は? 2 2022/08/05 11:38
- Excel(エクセル) EXCELのグラフを画像(JPG形式)で保存、通常実行がうまく行かない。ステップインはうまく行く 3 2022/08/30 12:06
- 写真 log撮影について。今まで、9割がた映像ではなく写真をlog撮影でとってきました。 映像ではlogの 3 2023/07/04 23:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
LISTBOXの内容が更新されま...
-
C#でフォームのオブジェクト名...
-
Object型からDouble型へのキャスト
-
COMコンポーネントって何?
-
ワイルドカード<?>と型パラメー...
-
Excelで =EMBED("Acrobat Docu...
-
エプソンVP-930のESC/Pの操作に...
-
VBAからノーツを起動
-
複数のドキュメントテンプレー...
-
0 == False はいいけど
-
オブジェクトとは、わかりやす...
-
AccessからMSペイントを起動さ...
-
java.util.Listのヒープサイズ...
-
TextFieldの文字の折り返し
-
戻り値がクラスオブジェクト
-
VBAのWindowオブジェクトとWork...
-
VBA 同じ名前のオブジェクトを...
-
C++で*thisは何を指しているの...
-
Accessの連結・非連結オブジェ...
-
エクセルVBAで、条件に一致する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0 == False はいいけど
-
パワーポイントのVBAでテキスト...
-
C#でフォームのオブジェクト名...
-
Excelで =EMBED("Acrobat Docu...
-
VBAのWindowオブジェクトとWork...
-
JAVAからHTMLへ値を返す方法
-
EXCEL VBAにて動的にCheckBOXを...
-
ワイルドカード<?>と型パラメー...
-
COMコンポーネントって何?
-
VBA 同じ名前のオブジェクトを...
-
Object型からDouble型へのキャスト
-
ビジュアルC++でボタンの有...
-
error C2712: オブジェクト ア...
-
オブジェクト名をforループ内で...
-
bmp画像をjpegやpng画像に圧縮...
-
戻り値がクラスオブジェクト
-
Vbで通常使用するプリンターを...
-
時間帯判定をする。
-
Webアプリケーションのエラーメ...
-
LISTBOXの内容が更新されま...
おすすめ情報