タイトル | : PrintDocument.QueryPageSettings |
記事No | : 8548 |
投稿日 | : 2009/01/09(Fri) 16:49 |
投稿者 | : ひでと |
お世話になります。 複数ページの印刷でページ毎の余白を設定したいと、.QueryPageSettings 内で処理を書きました。 印刷はPrintPreviewDialogを表示させ、そこから実行したいと考えています。 問題になったのはPrintPreviewDialogの表示と実際に紙に印刷するときにHardMarginの 関係で位置がずれてしまうことでした。
そこで.BeginPrintの引数eを用いて、.QueryPageSettings内でずれを吸収する処理を 書きました。
PrintPreviewDialogの表示と1回目の印刷はうまくいくのですが、連続して印刷しようと すると、ずれを吸収する処理があだとなり、逆方向にずれが生じてきます。
.QueryPageSettings内の処理に問題があるようなのですが、 ヘルプの.QueryPageSettingsの説明で 「PageSettings に対する変更は、現在のページにだけ影響を与えます。 ドキュメントの既定のページ設定には影響を与えません。」 を考えると どうにも原因がわかりません。よろしくお願いします。
Public Class Form1 Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load With Me.PrintDocument1.DefaultPageSettings.Margins .Left = 80 .Right = 40 .Top = 40 .Bottom = 40 End With End Sub Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles _ Button1.Click Me.PrintPreviewDialog1.Document = Me.PrintDocument1 Me.PrintPreviewDialog1.ShowDialog() End Sub Dim PrintAction As System.Drawing.Printing.PrintAction Private Sub PrintDocument1_BeginPrint _ (ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintEventArgs) _ Handles PrintDocument1.BeginPrint PrintAction = e.PrintAction End Sub
Private Sub PrintDocument1_PrintPage _ (ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) _ Handles PrintDocument1.PrintPage Dim X As Integer = e.MarginBounds.X Dim Y As Integer = e.MarginBounds.Y Dim Width As Integer = e.MarginBounds.Width Dim Height As Integer = e.MarginBounds.Height
e.Graphics.DrawRectangle(Pens.Black, e.MarginBounds) e.Graphics.DrawLine(Pens.Black, X, Y, X + Width, Y + Height) e.Graphics.DrawLine(Pens.Black, X + Width, Y, X, Y + Height) End Sub
Private Sub PrintDocument1_QueryPageSettings _ (ByVal sender As Object, ByVal e As System.Drawing.Printing.QueryPageSettingsEventArgs) _ Handles PrintDocument1.QueryPageSettings 'e.PageSettings.Margins をDefaultに戻そうとしてもうまくいかない? e.PageSettings.Margins = Me.PrintDocument1.DefaultPageSettings.Margins With e.PageSettings Select Case PrintAction Case Printing.PrintAction.PrintToFile If .HardMarginX < .Margins.Left Then Else .Margins.Left = .HardMarginX End If If .HardMarginX < .Margins.Right Then Else .Margins.Right = .HardMarginX End If If .HardMarginY < .Margins.Top Then Else .Margins.Top = .HardMarginY End If If .HardMarginY < .Margins.Bottom Then Else .Margins.Bottom = .HardMarginY End If Case Printing.PrintAction.PrintToPreview If .HardMarginX < .Margins.Left Then Else .Margins.Left = .HardMarginX End If If .HardMarginX < .Margins.Right Then Else .Margins.Right = .HardMarginX End If If .HardMarginY < .Margins.Top Then Else .Margins.Top = .HardMarginY End If If .HardMarginY < .Margins.Bottom Then Else .Margins.Bottom = .HardMarginY End If Case Printing.PrintAction.PrintToPrinter If .HardMarginX < .Margins.Left Then .Margins.Left = .Margins.Left - .HardMarginX Else .Margins.Left = 1 * 39.37 / 10 End If If .HardMarginX < .Margins.Right Then .Margins.Right = .Margins.Right + .HardMarginX Else .Margins.Right = .HardMarginX * 2 + 1 * 39.37 / 10 End If If .HardMarginY < .Margins.Top Then .Margins.Top = .Margins.Top - .HardMarginY Else .Margins.Top = 1 * 39.37 / 10 End If If .HardMarginY < .Margins.Bottom Then .Margins.Bottom = .Margins.Bottom + .HardMarginY Else .Margins.Bottom = .HardMarginY * 2 + 1 * 39.37 / 10 End If End Select End With End Sub End Class
|