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;
}
ダイアログで指定した範囲で印刷するには、何か特別な処理が必要なのでしょうか?
> 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());
ちょい気持ち悪いけど仕方が無い…
>gakさん
ありがとうございます!
確かにちょっと気持ち悪いですが仕方無さそうですね…。
解決チェック漏れ。
ツイート | ![]() |