MDIで印刷プレビューするには?

解決


rsadd  2009-10-27 23:13:12  No: 71031  IP: [192.*.*.*]

初めまして。
開発環境はVC++.net 2003を使用しています。
VC初心者なのであまりにも基本的な質問かもしれませんが
よろしくお願い致します。

現在MDIプログラムを作成していますが、メインのビューは
CFormViewを継承し、コントロール類を配置しているため、印刷プレビュー
するためのビューをどうしたらよいのかで行き詰まっています。
何かいい方法等ございましたらご教授よろしくお願い致します。

編集 削除
gak  2009-10-29 17:11:17  No: 71032  IP: [192.*.*.*]

> 何かいい方法等ございましたらご教授よろしくお願い致します。
対象Windowに対して WM_PRINT を SendMessage してやればダイアログの画面イメージが取れる。このイメージを印刷すれば良いかと。

ただ、WM_PRINT ではビジュアルスタイル等に対応したイメージが取得できないケースがあったハズ。
↑対応として、PrintWindow() というAPIを使用してやればビジュアルスタイル等に対応した画面イメージが取得できる。
が、このAPIは非表示Windowのイメージは取得不可なハズなので(MFC機構を使用しての)プレビュー中は使用不可(CFormView継承ビューが
非表示化される為)かもしれない。使いたいなら、多分(非表示化される前に)前以ってイメージを確保して億頭の必要がある。

CFormViewって単語からMFCと判断したけど合ってるよね?
後、↑で挙げたWM_PRINT、PrintWindow()の問題点が未だに残っているのかどうかは判らない。環境無いので試してない。

編集 削除
rsadd  2009-10-29 22:37:09  No: 71033  IP: [192.*.*.*]

返答有難うございます。
>対象Windowに対して WM_PRINT を SendMessage してやればダイアログの画面イメージが取れる。このイメージを印刷すれば良いかと。
言葉足らずですみません。
画面イメージをハードプリントするのではなく、メインビューに入力したデータを
あるフォーマットでプリントしたいのです。

>CFormViewって単語からMFCと判断したけど合ってるよね?
そうです。できればMFCでどのようにすればいいのかをお聞きしたいです。

編集 削除
rsadd  2009-10-29 23:18:35  No: 71034  IP: [192.*.*.*]

>MFC機構を使用しての)プレビュー中
このMFC機構を使用してのプレビューを行いたいのです。
メインビューをCFormViewにすると、印刷プレビューや印刷ができなくなってしまいます。
どうすれば、使えるようになるのでしょうか?

編集 削除
gak  2009-10-30 17:20:07  No: 71035  IP: [192.*.*.*]

> このMFC機構を使用してのプレビューを行いたいのです。
CFormView継承クラス::OnPrint() をオーバーライドして好きなように描けば良い。

CFormView継承クラス::OnPrint(CDC* pDC, CPrintInfo* pInfo) {
    pDC->TextOut(0, 0, _T("印刷"));
}

こんな感じに。

> メインビューをCFormViewにすると、印刷プレビューや印刷ができなくなってしまいます。
通常のCViewの印刷は OnPrint() 内で OnDraw() を呼んでるだけだったハズ。
ただ、CFormViewだと今回の様に印刷するデータが一意には決まらない。(rsaddさんは在るフォーマットでデータを印刷したかった
のだけど、画面のハードコピーを印刷したいのだと俺が勘違いしてしまった様に)
とう事等もあり CFormView は標準では印刷をサポートしていない。(OnPrint() 内で OnDraw() を呼ばないようにしていたハズ)
なので OnPrint() 内の処理を自力で実装してやる必要が有る。

後は通常の印刷処理。「印刷 MFC」とか「マッピングモード」等でググれば欲しい情報に辿り着けるかと。

編集 削除
rsadd  2009-10-31 22:36:45  No: 71036  IP: [192.*.*.*]

SDIで、CFormViewを選択した場合に、印刷機能を付けるには

メッセージマップに次を追加
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)

OnPreparePrintingをオーバーライドし、DoPreparePrintingを実行する
BOOL CTESTView::OnPreparePrinting(CPrintInfo* pInfo)
{
  // デフォルトの印刷準備
  return DoPreparePrinting(pInfo);
}

OnPrintをオーバーライドし、印刷内容を書込む
void CTESTView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{
  
    pDC->TextOut(0, 0, _T("印刷テスト"));
}

メニュー項目ID_FILE_PRINT_PREVIEWを追加する

を行うという記述を見つけたので
MDIでもできるのかと思い、設定してみたのですが
メニューからCView::OnFilePrintPreviewを実行すると
ERROR: Cannot find dialog template with IDD 0x7803.
(DEBUGモードでコンパイル)
とエラーがでて、異常終了してしまいます。
SDIでは、問題なく印刷プレビューできます。
MDIでは、なにが足りないのでしょうか?

編集 削除
rsadd  2009-11-01 16:33:30  No: 71037  IP: [192.*.*.*]

解決しました。
リソースファイルに
53行目  "#include ""afxprint.rc""  // 印刷/印刷プレビュー リソース\r\n"
420行目#include "afxprint.rc"  // 印刷/印刷プレビュー リソース
を追加することでエラーが発生しなくなりました。
有難う御座いました。

編集 削除