• 締切済み

【VC++】CDC→WMFファイルに保存するには。

こんにちは。 VC++&MFCとWMF(Windows Meta File)について質問させて下さい。 私は、8年前くらいに学生の研究で普通のテキストエディタ等でC++のコーディングをしていたことがあるのですが、このたび仕事でVisual StudioとMFCを使用してWindowsプログラムの改修をすることになりました。 ネットで検索したり書籍で調べたのですがなかなか的を得ず、質問させて頂こうと思いました。 改修対象はVC++6.0で書かれたプログラムです。 至ってシンプルで、以下の機能を有します。 ・グラフ等の描画内容が書かれたファイルを読み込み、自ウィンドウ内に表示 ・上記で表示されたものを印刷 今回これに、「画面表示したものをWMFフォーマットのファイルに落とす」という機能を加えようと思っています。 現在のソースコードは、おそらく自動生成されたであろう「xxxView」というクラスの「OnDraw」というメソッドから、ファイルを読み出す関数を呼び出したりして、引数で貰ったデバイスコンテキスト(pDC)でお絵描きをしています。 メニューバーから「保存」が選択されると保存ダイアログを表示し、WMFファイルに保存するようにしたいのですが、以下の点をご教示頂きたくお願い致します。 (1) CDCで描いたものをWMFファイルに保存するにはどうすれば良いのか。 (2) メニューのコマンドID(というのでしょうか…)に対応する処理(今回実装する処理)はどこに書くのが妥当なのか。 (3) メニューのコマンドIDには用意されているもの(ID_FILE_SAVE_ASなど)が色々あるが、今回それらは用いずに新たに自分で定義するべきなのか。 (4) その他、ご指摘やアドバイス、参考となりそうな書籍など。 お手数ですが、ご回答頂けると幸いです。 宜しくお願いします。

みんなの回答

回答No.1

(1) だけですが、 CMetaFileDC インスタンス作成 ↓ CMetaFileDC::Create ↓ いろいろ描画 ↓ CMetaFileDC::Close といった流れになるようです。 http://msdn.microsoft.com/ja-jp/library/427wezx1(v=vs.80).aspx

sexy-55
質問者

お礼

ご回答ありがとうございます。 CMetaFileDCのインスタンスを作成して、CDCのインスタンスを作成してOnDraw関数を呼び出し、戻ってきたらCMetaFileDCのBitBltメソッドでCDCをコピー。という手順になるのでしょうか?。。 現在割り込みの仕事が入り本作業はペンディングしているのですが、月曜日に試してみるように致します。 ありがとうございました。 引き続き、皆様のご回答お待ちしております。

sexy-55
質問者

補足

2週間経ちましたので、そろそろ締め切ろうと思います。 メニューのコマンドは、「xxxView」クラスに新しいメソッドを設けて、そこで受けることにしました。 メタファイルのデバイスコンテキスト作成は出来たのですが、現状、CDCで描画した内容をビットマップでメタファイルのデバイスコンテキストにコピーしてくることしか出来てません。 また改めて質問内容を変えて投稿させて頂きます。 お騒がせ致しました。

関連するQ&A

  • VC++2005 ファイル読み込み

    現在VC++2005でプログラムをしています。 そこで質問があるのでよろしくお願いします。 PCに保存してあるテキストファイルをプログラムで読み込み、その中のテキストからいろいろな判断をするというようなプログラムを作りたいと考えています。 そこでファイルのオープンなでは理解できたのですが、ファイルの中のテキストを読み判断するという方法がよくわからず質問しました。 また、テキストファイルの中身は数字と文字列になっています。 下にその例を書きます。 7,000 ディスプレイ 5,000 ゲーム などです。 そこで6,000以上なら高いというような判断を行いラベルに表示するというような形です。 説明が下手かもしれませんがよろしくお願いします。

  • VC++6.0からVC++.NET2005へ移植

    VC++6.0で作成したプログラムをVC++.NET2005に移植しました。 ビルドを行うと『fatal error LNK1104:ファイル'mfc42.lib'を開くことができません。』のエラーが出てしまいます。 ソリューションのプロパティを見てもどこで「mfc42.lib」の参照を定義しているのか分かりません。 どこで「mfc42.lib」の参照を定義しているのか教えてください。また、対策を教えてください。

  • .wmf をExploreから表示

    Explorer上のWMF(Windowsメタファイル)をダブルクリックしてWindows フォト ビューアー開きたいのですがうまくいきません。 『プログラムから開く』⇒『既定のプログラムの選択』で『Windows Photo Viewer\PhotoViewer.dll』を設定しましたところwindowsフォトビューアーは開くのですが【このファイル形式が Windows フォトビューアーでサポートされていないか、または Windows フォトビューアーの最新の更新プログラムが適用されていないため、この画像を開けません。】とのメッセージのみで画像が表示されません。 WMFファイルのダブルクリックだけでてWindows フォト ビューアーを開き画像を表示させる方法をお教え下さい。 よろしくお願いします。

  • VC++でファイルのオブジェクト

    VC++のMFCダイアログベースでプログラミングをしているのですが、ファイルI/Oに関して教えていただけないでしょうか。 現在、CFileを使用しています。 CFile f; で宣言したファイルオブジェクトを他の関数へ引き継ぐにはどうすればいいのでしょうか。 プログラム構造はマルチスレッドになっております。 うまく説明できないのですが、なにか助言をいただけないでしょうか。よろしくお願いします。

  • VC++のDLLファイルをVBで読み出せません。

    お世話になります。 プログラムをやり始めて3か月の初心者です。仕事で以下のような事をしていますが、うまくいかず悩んでいます。 プログラム(1):VB 2008年版 メインプログラム プログラム(2):C言語 2006年版 プログラム(3):VC++ VISUAL STUDIO2012 EXPRESSを使用 ■今のプログラム (2)のdllファイルを(1)で呼び出しています。問題なく動きます。 ■やりたい事 (2)のプログラム内容を変更したのが(3)です。そのdllファイルを(1)で呼び出したいです。 ⇒しかし、(3)のdllファイルを読み込むことができません。((3)のdllファイルは作れました。) (3)はVC単独では正しく動作します。 (1)のプログラムに、(2)を呼び出すときと同じように(3)用のプログラムを追加しました。作った(3)のdllファイルは指定したフォルダにきちんと入れています。 コンピューターに詳しい先輩が時間をかけてみてくれたのですが、結局わからずじまいでした。 ■質問 VBの型が古い、EXPRESSを使っているからできないのでしょうか? VCでdllを作って、VBで呼び出すまでの流れをわかりやすく紹介した書籍やWEBなどあればご教示頂けませんでしょうか? よろしくお願いいたします。

  • VC++でやっているのですが

    最近プログラミングを始めたのですが、現在はVC++でダイアログをつくっているのですが、メニューを設置しましてメニューのOPENを押すとCOMOPENするぷろぐらむをつくりました。そこでOENを押したら表示をCLOSEに切り替えたいのですが方法がわかりません。どなたか教えてください。ちなみにメニューはドロップダウン?ではなくメニューの直接クリックでOPENします。MFCです。どうかお願いします。

  • VC Debugモード

    Visual Stdio .NET 2003 環境のDebugモードについて質問があります。 開発言語は C++です。 今、コマンドライン引数を以下のように設定し、ファイルに保存された 情報を処理するプログラムを作成しています。 test1.exe 0 ./input.txt ↑ [実行ファイル名][検索したい文字][処理したいファイルへのパス] 上のように入力した場合、argcは[3]を返すと思うのですが、Debug モードでいざ実行してみると、値は「4」となっていました。 コマンドライン引数はVCの「プロジェクト」→「**のプロパティ」 →左ウィンドウの「デバッグ」→右ウィンドウの「コマンド引数」に 上のように設定しています。 また、Debugモードでargv[0]を調べたところ、実行ファイルまでのパス が保存されていました。 なぜ、このようになるのでしょうか? あと本題からそれるのですが、ソースの中でVCがDebugモードで動作していることを知る方法はないでしょうか? もし、Debugモードなのかどうかがわかるのであれば、ソースをDebug モード用とReleseモード用とに切り替えられるようにしたいのですが。。。 合わせてお教えください。

  • VC++で数値計算をしたいのですが,datファイルの作り方がよく分かりません。

     VC++を使って数値計算をしていますが,肝心のdatファイルの作り方がよく分かりません。  計算結果をMS-DOS上に出すことはできるのですが,VC++で作った場合,プログラムの実行後にMS-DOSへコマンドを打ち込むことができないので,うまくいきません。   どなたか解決策をお教えいただけないでしょうか?

  • VC++のデータ保存について

     いつもお世話になっております。VC++でプログラムを作成しているプログラミング初心者です。環境はOSがWindowsXP、統合環境はVisualStudio2008Professionalを使用しています。  現在簡易な家計簿ソフトを製作しているのですが、データの保存がうまくいきません。プログラムの動作としては、データの保存先を「名前をつけて保存」のコモンダイアログで指定し、それをクラスのフィールドに保存します。更にそのクラスのフィールドから、Path.txtというファイルにpath名を保存します。プログラムの起動時にこのPath.txtを読み込み、その中身をクラスのフィールドにセットします。その後、「ファイルの読み込み」をメニューで選択する時に、クラスのフィールドを引数として、データを読み込む関数を呼び出します。  この方法で、デバックモードでは動作していたのですが、リリースモードではPath.txtにファイルの保存先が書き込まれず、うまく動作しませんでした。以下、関係のあると思われる所を抜粋しました。 *****ファイルの保存先path名の保存***** private: void Pathset() { StreamWriter^ writer2 = gcnew StreamWriter("path.txt");     // パスデータを書き込み writer2->WriteLine(this->report7->Pathname); // クラスのフィールドからデータを取り出し書き込み writer2->Close(); } *****Form1クラスの生成直後に、クラスのフィールドにpath名を格納する***** StreamReader^ reader2 = gcnew StreamReader("path.txt"); this->report7->Pathname = ""; this->report7->Pathname = reader2->ReadLine(); reader2->Close(); *****メニューでファイルの読み込みを選択したときの処理***** LoadCsvFile(this->report7->Pathname); // LoadCsvFileはファイルの読み込みを実行する関数  以上、長く拙い説明で申し訳ありませんが、原因が分かる方、よろしくお願いいたします。m(_)m

  • VC++を始めるにあたって

    始めまして。今回会社でVC++でMFCアプリケーションのプログラミングの仕事をすることになりました。  現在の私のスペックです。  [0] 今年入社、毎日プログラムの学習をしてます。  [1] 経験したプログラム   [1-1] C 学生時代、授業で基礎のみ   [1-2] JAVA 同じく授業で基礎のみ   [1-3] VC# 10日で覚えるVC#.netと言う本で学習中    VC++自体始めてなので、関数や書き方も理解してなくて、何から勉強したらいいのか分かりません。 いい勉強方法があれば教えてください。 また参考になるHPや参考書もあれば教えてください。 以上です。お願いします。

専門家に質問してみよう