印刷範囲を指定して印刷するには?

解決


かーます  2008-09-19 02:37:20  No: 69025

MFC6です。
CViewから派生させているクラスで、OnUpdateで印刷要求メッセージが来た際に
CView::OnFilePrint()を直接呼んでいます。
動作させると印刷のダイアログが表示され、印刷範囲を「すべて」にしてOKを押すと全ページが問題なく印刷されます。

ところが印刷範囲を「ページ指定」にして、例えば全10ページのドキュメントで3ページから5ページまでを指定して印刷すると、
3ページから10ページまで印刷されてしまい、印刷終了ページの指定が無視された形になります。

MFCのソースを追いかけてみたのですが、各ページの印刷の途中で印刷終了ページの値がドキュメントの終了ページに上書きされてしまっているようにみられます。

〜\Microsoft Visual Studio 8\VC\atlmfc\src\mfc\viewprnt.cpp - 312行目

        if (nStep > 0) // pages are printed in ascending order
        {
          // OnPrint may have set the last page
          // because the end of the document was reached.
          // The loop must not continue with the next iteration.
          nEndPage = printInfo.GetMaxPage() + nStep; 
        }

ダイアログで指定した範囲で印刷するには、何か特別な処理が必要なのでしょうか?


gak  2008-09-20 02:39:58  No: 69026

> 3ページから10ページまで印刷されてしまい、印刷終了ページの指定が無視された形になります。
VC8sp1のバグ。
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=257803

とりあえずの回避策はこうすれば良いとの事。(上記からの転載)
> In the OnPrepareDC function of your CView dirived class add the following lines after calling the base class OnPrepareDC:

> if( pDC->IsPrinting() )
> pInfo->SetMaxPage(pInfo->GetToPage());
ちょい気持ち悪いけど仕方が無い…


かーます  2008-09-22 22:44:26  No: 69027

>gakさん
ありがとうございます!
確かにちょっと気持ち悪いですが仕方無さそうですね…。


かーます  2008-09-22 22:45:05  No: 69028

解決チェック漏れ。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加