tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル PrintDocument.QueryPageSettings
投稿日: 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

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。