ビットマップ印刷の難しさと一般プログラマーの印刷方法

このQ&Aのポイント
  • WIN98 VC++6.0 MFCの環境でビットマップの印刷が非常に難しいことがわかりました。
  • 一般的なソフトでは画像の印刷は問題なくできるのに、なぜプログラムでの印刷が難しいのか疑問です。
  • プログラマーにとって印刷処理は一般的な処理なのに、学習資料やパターンのコードが見つからず困っています。一般のプログラマーはどうやって印刷しているのでしょうか?
回答を見る
  • ベストアンサー

印刷について

環境はWIN98 VC++6.0 MFCです。 ビットマップを印刷しようとしたら非常に難しくどうしても出来ませんでした。 Q&Aのサイトで教えて頂いたり、調べた結論はとにかく難しいということです。 ここで疑問があります。 市販の画像を扱うソフトは当然のことながら、どのソフトでもちゃんと印刷できます。 また、特殊な内容のプログラムならいざ知らず、印刷という一般的な処理です。 なのにどうしてネット上のプログラム講座や本にのっていないのでしょうか? お決まりのパターンのコードがあっても良さそうなのにいくら探しても見つかりません。 また、ソフト会社に勤めていない一般のプログラマーはどうやって印刷しているのですか???? どうかご意見おねがいします。

  • mk1234
  • お礼率94% (1832/1940)

質問者が選んだベストアンサー

  • ベストアンサー
noname#5537
noname#5537
回答No.6

コード見つけました。 http://www.codeguru.com/forum/showthread.php?threadid=234177 ビットマップを読み込むときから DIB で読み込んでますね。 このほうが画面モード(色数)に依存しなくていいです。 ↓の本にも載ってるらしいです。(第17章,ビットマップの印刷) http://bookweb.kinokuniya.co.jp/htm/4881359363.html

mk1234
質問者

お礼

yoppiiさ~~~~~~~~~ん。 本当に有難うございま~~~~~~~~す。 とうとう印刷できました。 わざわざ調べていただいたのですね。 感謝 感謝です。 でも、最初の質問の疑問は残ります。 ほかの初心者の皆さんはいったいどうやって印刷しているのでしょう。 でもこれからは安心ですね。 なぜなら同じ悩みに対しては、Q&Aサイトで質問があれば私がばっちりコードを丸ごと提示できますから。 本当に有難うございました。 あっ、うれしさのあまり肝心なことを忘れてました。 教えていただいたコードをvoid CXxxView::OnDraw(CDC* pDC)内に書いたのですが、パソコンの画面で相当大きくしないと印刷時は小さくなってしまいます。 これはどうやって解決すれば良いのですか?

mk1234
質問者

補足

やった~~。とうとう完成しました。 if (pDC->IsPrinting()) { 教えていただいた印刷用コード } else{ リソースからの読み込み } #出来てみればifで使い分けることは知っていたのに、 なぜか印刷の難しさに気をとられて全然思いつかなかった。

その他の回答 (5)

noname#5537
noname#5537
回答No.5

DIB (デバイスに依存しないビットマップ)に変換してから印刷するのが定石だと思います。 GetDIBits で DIB を取得して, StretchDIBits でプリンタの DC に流し込む。 DIB については, http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dngdi/html/msdn_dibs2.asp こちらは Delphi のものですが,参考になるでしょう。 http://www.asahi-net.or.jp/~HA3T-NKMR/tips004.htm

mk1234
質問者

お礼

回答ありがとうございます。 聞いてばかりで申し訳ありません。 (本当にそう思っています。) 皆さん色々アドバイスは頂けるのですが、結局VC++ MFCでこうすれば良いというコードは提示頂けません。 当然のことながら不親切からではなく、皆さんもお手元にそのようなコードがないのでは?と思ってしまいます。 自分で考えろという以前の問題として、どうしてコードが無いのかが不思議でなりません。 yoppiiさんが定石と言われるように、皆さんそうおっしゃいますが、コードが有りません。 他のサイトでも同じ質問は山ほどありますが、結局はコードが見えないままやり取りが自然消滅してしまっています。 どうかお願いです。 誰かコードで教えてください。

  • GAIA9916
  • ベストアンサー率42% (17/40)
回答No.4

やはりそうでしたか。 WindowsXpで印刷されているとすると、解像度の問題ということでOKですね。 Windows98の場合は、プリンタドライバに問題があるかもしれません。 OnDraw()でpDCの情報を見てみてください。 もしかすると、Windows98のプリンタドライバは、BitBltをサポートしていなかもしれません。 (白黒のみとか)

mk1234
質問者

お礼

回答ありがとうございます。 自分で作ったプログラムでは印刷できませんが、当然のことながら市販のソフトやフリーソフトで有ればちゃんとカラーで綺麗に印刷できます。 自作ソフトでこれを実現するにはどうすれば良いのでしょうか?

  • GAIA9916
  • ベストアンサー率42% (17/40)
回答No.3

#2です。 MFCのドキュメントビュー環境では、 #1の方が回答されているように、OnDraw()で印刷が可能です。 印刷がされていないようですが、 スクリーンとプリンターでは、同じDCでも属性が少し違いますよね。(解像度とか色数) GetDeviceCaps()などで、情報が得られます。 1.もしかすると解像度が大きくて、左上に小さく印刷されているとか??何も印刷されませんか? 2.pDC->TextOut(),DrawText()あたりは、うまく印刷できますか? 1.だとすると StretchBlt()で大きく印刷してみてどうでしょう。

mk1234
質問者

お礼

回答ありがとうございます。 1.もしかすると解像度が大きくて、左上に小さく印刷されているとか??何も印刷されませんか? XPだと確かに小さく印刷されます。 WIN98だとまったく何も印刷されません。 2.pDC->TextOut(),DrawText()あたりは、うまく印刷できますか? これだとまったく問題ありません。 このWIN98でまったく印刷されない状況を何とかしたいのです。 よろしくお願い致します。 よろしくお願い致します。

  • GAIA9916
  • ベストアンサー率42% (17/40)
回答No.2

ビットマップを印刷とのことですが、 単純に印刷するとすると、文字を印刷するのと同じ様に DC(デバイスコンテキスト)に、BitBlt,StretchBltなどで可能だと思いますが。 スクリーンのDCの変わりに、プリンターのDCを使って描画処理をすればよろしいかと。  通常のやり方だと、色がにじんだり、思ったような印刷ができないということでしょうか?

mk1234
質問者

お礼

回答ありがとうございます。 #1の回答に今の状況を書いておきました。 GAIA9916さんが書かれていることを、具体的にコードに直すとどうすれば良いのでしょうか? どうか教えていただけないでしょうか?

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

>なのにどうしてネット上のプログラム講座や本にのっていないのでしょうか? 「はじめてのMFCプログラミング(3)」にはでていました。 MFCウィザードで普通にEXEファイルを作成すると印刷プレビューと印刷機能も 自動でついてきますよね? OnDraw内にビットマップを表示するコードを書いて 印刷したのでは駄目なのですか?

mk1234
質問者

お礼

回答ありがとうございます。 >OnDraw内にビットマップを表示するコードを書いて >印刷したのでは駄目なのですか? 先日同じ質問をしたばかりで申し訳ないのですが、改めて状況を話しますと、以下のコードでクライアント領域に表示されますが、印刷は出来ません。 どのようにすれば良いかご存知でしたら、教えていただきたいのですが。 void CXxxView::OnDraw(CDC* pDC) { CXxxDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: この場所にネイティブ データ用の描画コードを追加します。 CDC myDC; CBitmap myBMP; myBMP.LoadBitmap(IDB_BITMAP3); myDC.CreateCompatibleDC(pDC); CBitmap* oldBMP=myDC.SelectObject(&myBMP); pDC->BitBlt(10,10,60,100,&myDC,0,0,SRCCOPY); myDC.SelectObject(oldBMP); } >「はじめてのMFCプログラミング(3)」にはでていました。 確かに出ていますが、ビットマップではないですよね。

関連するQ&A

  • ビットマップファイルの印刷方法 !!!

    環境はWIN2000 VC++6.0 MFCです。 ビットマップを印刷しようとしたら非常に難しくどうしても出来ませんでした。 お決まりのパターンのコードがあっても良さそうなのにいくら探しても見つかりません。 どうかおねがいします。

  • 印刷のサンプルコード

    いつも教えていただき感謝しています。 Win2000, VC++6.0 MFC でプログラムを作っています。 印刷したいのですが、 サンプルコードを探しています。 印刷したいものは、 CHtmlView の画面です。 よろしくお願いいたします。

  • SDKにおける印刷プレビュー実装(VisualStudio.NET2003)

    タイトル通りWin32APIをC++でゴリゴリ書いています。 恐れていた要求仕様がついに来てしまったのですが、現状のSDK状態で印刷プレビューを実装可能でしょうか? # 印刷その物は既に出来ています。 MFCならウィザードで何やらにチェックすれば印刷プレビューが使える様になる様ですが、現状のプログラムをMFCベースに書き換えるのも結構至難です。 Q1.色々探してみたのですがSDKに組み込めるクラスライブラリやDLLが見つかりません。有償でも構わないのでご存知でしたらご紹介下さい。 Q2. 現状のSDKベースにMFCの印刷プレビュー機能のみを呼出す(実装する)様な事は可能なのでしょうか? Q3.一般的にはどの様に実現しているのでしょうか? やはりMFCベースで最初から開発したり、自分でゴリゴリ作ったりするのでしょうか? 印刷プレビューを自分で作るのって…かなり困難かと… 以上、宜しくお願い致します。

  • CFormViewでの印刷について

    環境はWIN98 VC++6.0 MFCです。 基本クラスをCViewにした場合は下記コードにて、印刷プレビューで画像が見れたのですが、基本クラスをCFormViewにしたら見れません。 どうすれば良いのでしょうか? void CxxxView::OnDraw(CDC* pDC) { if (pDC->IsPrinting()) { 下記URLのコード } else{ } 画像表示用コード http://www.codeguru.com/forum/showthread.php?threadid=234177

  • mfc vc++2005 で構成が正しくない・・・

    vc++2005 mfcで作成したプログラムで上記が出て他のPCで動きません。 mfc以外はファイルのコピーをするとかだけの単純なツールなのでmfcが 悪さしているとは思います。 mfcをスタティックでリンクにして、コード生成のところのマルチスレッドDLLを マルチスレッドに変えるとやはりいけますが、別にあったwindows7ではmfcと コード生成のところを変えなくても問題なくいけました。 vc++2005 redistributable パッケージを入れても変わりません。 mfcは別物なのでしょうか?? ネットを見ているとredistributableパッケージを入れれば大丈夫!!という 感じなのですが。 すいませんがどなたかご教授ください。

  • 現在時刻をデジタル時刻で表示したい。

    MFC(VC++6.0)のダイアログベースでプログラムを製作していますが 現在、ビットマップ上にデジタル時計の絵があり、時間も固定になっています。 それを現在の時刻をデジタル時刻で表示できるようにしろと言われたのですが、本当にそんなことができるかご存知の方教えてください。

  • VC++の印刷について

     VC++を勉強中のプログラミング初心者です。以前にC言語をかじった程度のレベルの者です。環境はOSはwindowsXPを、開発環境は VisualStudio2008professionalを使用しています。  現在VC++で簡単な家計簿ソフトを作成しているのですが、画面を印刷する方法が分かりません。メインフォーム画面をそのまま印刷したいのですが、どなたか方法(又は参考となる書籍、サンプルコード等)をご存知の方がいらっしゃいましたら、ご教授のほどよろしくお願い致します。m(_)m  

  • DirectX利用プログラムにおける画像印刷

    DirectXをVC.net2003にて利用してプログラミングしています.描画されている画面をBmpに保存し,そのファイルを印刷しようと考えています. (なおプログラム動作中に印刷を行う必要があるのと,それほどWindowsに習熟していない人がそのプログラムを使用する予定であるため,キャプチャソフト等を利用せずに,自動的に印刷する必要があって困っています.)  何か参考になる情報がありましたら,よろしくお願いします.

  • 印刷プレビュー

    OS Win2000, VC++ 6.0、 MFC を使ってプログラムを作っています。 印刷プレビューが上手くできないので、 調べたら、次の部分で、 BOOL AFXAPI _AfxCheckDialogTemplate(LPCTSTR lpszResource, BOOL bInvisibleChild) { ASSERT(lpszResource != NULL); HINSTANCE hInst = AfxFindResourceHandle(lpszResource, RT_DIALOG); HRSRC hResource = ::FindResource(hInst, lpszResource, RT_DIALOG); if (hResource == NULL) の部分で、 hResource = 0x00000000 となってしまいます。  何が間違っているのでしょうか? 参考にしているのは、 MFC のサンプル  SUPERPAD です。 手がかりをいただければ幸いです。

  • MFCのマニュアル

    現在MFCのCWindowやCViewなどについての勉強をしています。 自分自身でもいろいろと探してみようとは思うのですが もし「ここはお勧め!」というような講座関係のHPをお知りでしたらお教え頂けないでしょうか? 初心者でも分かりやすいところだと大変助かります ソフトはVC++ 6.0を使用しています どうぞ宜しくお願い致します

専門家に質問してみよう