[10799]SP4に移行すると、PageクラスのDrawメソッドによる拡大・縮小印刷が正常に行われない場合がある

文書番号 : 37675     文書種別 : 制限事項     登録日 : 2014/11/13     最終更新日 : 2014/11/13
文書を印刷する
対象製品
ActiveReports for .NET 7.0J
発生環境
Service Pack 4(v7.4.8100.1)の場合に発生します。
詳細
※この現象はセクションレポートのみで発生します。

Service Pack 4(v7.4.8100.1)を適用すると、PageクラスのDrawメソッドに、.NET Framework標準のPrintDocumentクラス、またはActiveReportsのSystemPrinterクラスを組み合わせて、拡大・縮小印刷を行っている場合、不正な縮尺で印刷される場合があります。

ActiveReports では、指定した Graphicsオブジェクトにページの内容を描画するためのメソッドとして、Page.Drawメソッドを用意しており、以下の2つのオーバーロードが存在します。

(1) Page.Draw(Graphics, Rectangle)
(2) Page.Draw(Graphics, Rectangle, float, float, bool)

本事象は上記の(1) のオーバーロードを使用している場合、かつ、Graphicsオブジェクトの PageUnitプロパティを規定値の"Display"以外に設定している場合にのみ発生いたします。

◆SP3までの動作
SP3 以前のバージョンでは、(1)のオーバーロードを呼び出した場合、ディスプレイ上での表示に使用されることを前提にGraphicsオブジェクトに対してページの描画を行うため、正しく印刷されません。
この問題については、Graphicsオブジェクトの PageUnitプロパティを"Pixel"に明示的に設定する方法が有効です。このように設定することで、描画時の内部の計測処理がデバイスピクセル単位で行われるようになり、(1)のオーバーロードを使用した場合でも正しく印刷されるようになります。

◆SP4からの動作
SP4 では、(1)のオーバーロードを呼び出した場合も、印刷を前提とした描画処理を行うように内部処理が変更されました。よって、Graphicsオブジェクトの PageUnitプロパティを規定値の"Display"以外に設定した場合、正しく印刷されなくなってしまいます。これは SP4 の内部動作の変更(不具合修正)に伴う影響であり、仕様上の動作となります。
回避方法
Graphicsオブジェクトの PageUnitプロパティの値を、"Pixel"ではなく、未設定のまま規定値(Display)で使用する、または明示的に"Display"を設定することで、本事象を回避することが可能です。一例として、以下のようなコードになります。

◆サンプルコード(VB.NET)
Dim m_myARPrinter As New GrapeCity.ActiveReports.SystemPrinter()


' 明示的に"Display"を設定、またはGraphics.PageUnitプロパティの設定自体を削除する
m_myARPrinter.Graphics.PageUnit = System.Drawing.GraphicsUnit.Display


◆サンプルコード(C#)
GrapeCity.ActiveReports.SystemPrinter m_myARPrinter = new GrapeCity.ActiveReports.SystemPrinter();


// 明示的に"Display"を設定、またはGraphics.PageUnitプロパティの設定自体を削除する
m_myARPrinter.Graphics.PageUnit = System.Drawing.GraphicsUnit.Display;