tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルページ設定ダイアログボックスの設定
記事No6954
投稿日: 2008/02/08(Fri) 14:01
投稿者ひでと
お世話になります。
ページ設定ダイアログを表示し、余白を設定して印刷をしようとしています。
実際に印刷すると右下方向にずれてしまいます。
ダイアログボックスの余白をすべて10mmにすると、左上が15,15に印刷されてしまいます。
どこが悪いのでしょうか?

    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        PrintDocument1.Print()
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim PrnSet As New Printing.PrinterSettings
        Dim PapSet As New Printing.PageSettings
        Dim Ret As DialogResult
        PrintDialog1.PrinterSettings = New Printing.PrinterSettings
        With PrintDialog1
            .UseEXDialog = False
            .AllowSelection = False
        End With
        Ret = PrintDialog1.ShowDialog()
        PrnSet = PrintDialog1.PrinterSettings
        If Ret = Windows.Forms.DialogResult.OK Then PrnSet = PrintDialog1.PrinterSettings
        PrintDocument1.PrinterSettings = PrnSet

        PageSetupDialog1.PageSettings = New Printing.PageSettings
        With PageSetupDialog1.PageSettings
            .PaperSize = PrnSet.DefaultPageSettings.PaperSize
            .Landscape = PrnSet.DefaultPageSettings.Landscape
            .Margins = PrnSet.DefaultPageSettings.Margins
        End With
        Ret = PageSetupDialog1.ShowDialog
        If Ret = Windows.Forms.DialogResult.OK Then PapSet = PageSetupDialog1.PageSettings
        PrintDocument1.DefaultPageSettings = PapSet
    End Sub

    Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
        e.Graphics.DrawLine(New Pen(Color.Black, 0), _
          e.MarginBounds.Left, e.MarginBounds.Top, _
          e.MarginBounds.Right, e.MarginBounds.Top)
        e.Graphics.DrawLine(New Pen(Color.Black, 0), _
          e.MarginBounds.Left, e.MarginBounds.Bottom, _
          e.MarginBounds.Right, e.MarginBounds.Bottom)
        e.Graphics.DrawLine(New Pen(Color.Black, 0), _
         e.MarginBounds.Left, e.MarginBounds.Top, _
         e.MarginBounds.Left, e.MarginBounds.Bottom)
        e.Graphics.DrawLine(New Pen(Color.Black, 0), _
         e.MarginBounds.Right, e.MarginBounds.Top, _
         e.MarginBounds.Right, e.MarginBounds.Bottom)
        e.HasMorePages = False
    End Sub

[ツリー表示へ]
タイトルRe: ページ設定ダイアログボックスの設定
記事No6955
投稿日: 2008/02/08(Fri) 14:49
投稿者花ちゃん
> どこが悪いのでしょうか?

http://hanatyan.sakura.ne.jp/dotnet/Prt10.htm

[ツリー表示へ]
タイトルRe^2: ページ設定ダイアログボックスの設定
記事No6956
投稿日: 2008/02/08(Fri) 15:14
投稿者ひでと
ありがとうございます。

> > どこが悪いのでしょうか?
>
>  http://hanatyan.sakura.ne.jp/dotnet/Prt10.htm
まだ試してはおりませんが、教えていただいた方法はページ設定ダイアログの設定の
さまざまな内容を個別に取得し、設定しなおす方法かと思います。
私は、直接ページ設定ダイアログの内容をPinitDocumentに反映できるのではないかと
考えていました。下はその基本的な考え方です。
この方法ができるならば、簡単ではないかと思いますができないのでしょうか?

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim Ret As DialogResult
        PrintDialog1.PrinterSettings = New Printing.PrinterSettings
        Ret = PrintDialog1.ShowDialog()
        If Ret = Windows.Forms.DialogResult.OK Then PrintDocument1.PrinterSettings = PrintDialog1.PrinterSettings

        PageSetupDialog1.PageSettings = New Printing.PageSettings
        Ret = PageSetupDialog1.ShowDialog
        If Ret = Windows.Forms.DialogResult.OK Then PrintDialog1.PrinterSettings = PageSetupDialog1.PageSettings
    End Sub

[ツリー表示へ]
タイトルRe^3: ページ設定ダイアログボックスの設定
記事No6957
投稿日: 2008/02/08(Fri) 15:18
投稿者ひでと
遅くなりまして申し訳ありません。教えていただいてからいろいろ試してみました。

> 試すなり、よく見るなりしてから質問された方が...。
すいません...。
>
> 印刷位置の原点(0,0 )は使用しているプリンターの印刷開始位置であって
> 最近のプリンターなら、インクジェット式は、用紙の3mm 、3mm でレーザープリンタは
> 5mm , 5mm 位がその原点になるかと、従ってプリンターによって、用紙への印刷開始位置
> が違うのでその分を考慮しないと用紙サイズからの印刷位置は、設定位置の位置とその分
> 誤差が生じます。
> >ダイアログボックスの余白をすべて10mmにすると、左上が15,15に印刷されてしまいます
> すなわちご使用のプリンターの印刷開始位置は、用紙の5mm , 5mm の位置になっている
> かと思います。(5mm 以内の位置には印刷できない)
>
理解いたしました。ご報告させていただきます。
ページ設定ダイログの余白にあらかじめ数字を入れておきたいと考えましたが、
PageSetupDialog1.PageSettings.Margins.Left=200 とすると
ダイアログの左余白に20mmが設定されて表示できました。
ダイアログボックスをOKで終了させると、PageSetupDialog1.PageSettings.Margins.Left
の値は79となっていました。ここで 勝手にmm単位からインチ単位の変換がされていたのが、
非常に混乱した部分です。
また、ダイアログボックスでは あたかも用紙からの余白が設定できるように、
表示されていましたので、印刷位置の原点は用紙左上であると思い込んでおりました。

以下は 「印刷」フォームを表示させたときにあらかじめ余白を設定し、
ページ設定ダイアログを表示するときに、設定した余白をダイアログに反映させ、
HardMargin以下に余白を設定できないようにしようと考えたものです。
ご指摘がありましたら、お願いします。

    Dim PrnSet As New Printing.PrinterSettings
    Dim PapSet As New Printing.PageSettings
    Private Sub 印刷_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        With PapSet.Margins '1mm=39.37*0.01in
            .Left = 20 * 39.37 / 10 '左端を20mmに設定
            .Right = 10 * 39.37 / 10
            .Top = 10 * 39.37 / 10
            .Bottom = 10 * 39.37 / 10
        End With
        With PrnSet.DefaultPageSettings
            If .HardMarginX < PapSet.Margins.Left Then
                PapSet.Margins.Left = PapSet.Margins.Left - .HardMarginX
            Else
                PapSet.Margins.Left = 0
            End If
            If .HardMarginX < PapSet.Margins.Right Then
                PapSet.Margins.Right = PapSet.Margins.Right + .HardMarginX
            Else
                PapSet.Margins.Right = .HardMarginX * 2 + 1 * 39.37 / 10 'ぎりぎりだと印刷出来なかったので
            End If
            If .HardMarginY < PapSet.Margins.Top Then
                PapSet.Margins.Top = PapSet.Margins.Top - .HardMarginY
            Else
                PapSet.Margins.Top = 0
            End If
            If .HardMarginY < PapSet.Margins.Bottom Then
                PapSet.Margins.Bottom = PapSet.Margins.Bottom + .HardMarginY
            Else
                PapSet.Margins.Bottom = .HardMarginY * 2 + 1 * 39.37 / 10 'ぎりぎりだと印刷出来なかったので
            End If
        End With
        PrintDocument1.DefaultPageSettings = PapSet
    End Sub
    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        PrintDocument1.Print()
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim DPapSet As New Printing.PageSettings
        Dim Ret As DialogResult
        PrintDialog1.PrinterSettings = New Printing.PrinterSettings
        With PrintDialog1
            .UseEXDialog = False
            .AllowSelection = False
        End With
        Ret = PrintDialog1.ShowDialog()
        PrnSet = PrintDialog1.PrinterSettings
        If Ret = Windows.Forms.DialogResult.OK Then PrnSet = PrintDialog1.PrinterSettings
        PrintDocument1.PrinterSettings = PrnSet

        PageSetupDialog1.PageSettings = New Printing.PageSettings
        With PageSetupDialog1.PageSettings
            .PaperSize = PrnSet.DefaultPageSettings.PaperSize
            .Landscape = PrnSet.DefaultPageSettings.Landscape
        End With
        DPapSet = PapSet
Dialog_Show:
        With PageSetupDialog1.PageSettings.Margins 'ここで設定する数字は1/10mm単位
            .Left = (DPapSet.Margins.Left + DPapSet.HardMarginX) / 39.37 * 100
            .Right = (DPapSet.Margins.Right - DPapSet.HardMarginX) / 39.37 * 100
            .Top = (DPapSet.Margins.Top + DPapSet.HardMarginY) / 39.37 * 100
            .Bottom = (DPapSet.Margins.Bottom - DPapSet.HardMarginY) / 39.37 * 100
        End With
        Ret = PageSetupDialog1.ShowDialog
        If Ret = Windows.Forms.DialogResult.OK Then PapSet = PageSetupDialog1.PageSettings
        '出てくる数字は1/100インチ単位
        With PrnSet.DefaultPageSettings
            If .HardMarginX < PapSet.Margins.Left Then
                PapSet.Margins.Left = PapSet.Margins.Left - .HardMarginX
            Else
                DPapSet.Margins.Left = DPapSet.HardMarginX
                GoTo Re_Dialog_Show
            End If
            If .HardMarginX < PapSet.Margins.Right Then
                PapSet.Margins.Right = PapSet.Margins.Right + .HardMarginX
            Else
                DPapSet.Margins.Right = DPapSet.HardMarginX * 2
                GoTo Re_Dialog_Show
            End If
            If .HardMarginY < PapSet.Margins.Top Then
                PapSet.Margins.Top = PapSet.Margins.Top - .HardMarginY
            Else
                DPapSet.Margins.Top = DPapSet.HardMarginX
                GoTo Re_Dialog_Show
            End If
            If .HardMarginY < PapSet.Margins.Bottom Then
                PapSet.Margins.Bottom = PapSet.Margins.Bottom + .HardMarginY
            Else
                DPapSet.Margins.Bottom = DPapSet.HardMarginX
                GoTo Re_Dialog_Show
            End If
        End With
        PrintDocument1.DefaultPageSettings = PapSet
        Exit Sub
Re_Dialog_Show:
        Beep()
        GoTo Dialog_Show
    End Sub

    Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
        e.Graphics.DrawLine(New Pen(Color.Black, 0), _
          e.MarginBounds.Left, e.MarginBounds.Top, _
          e.MarginBounds.Right, e.MarginBounds.Top)
        e.Graphics.DrawLine(New Pen(Color.Black, 0), _
          e.MarginBounds.Left, e.MarginBounds.Bottom, _
          e.MarginBounds.Right, e.MarginBounds.Bottom)
        e.Graphics.DrawLine(New Pen(Color.Black, 0), _
         e.MarginBounds.Left, e.MarginBounds.Top, _
         e.MarginBounds.Left, e.MarginBounds.Bottom)
        e.Graphics.DrawLine(New Pen(Color.Black, 0), _
         e.MarginBounds.Right, e.MarginBounds.Top, _
         e.MarginBounds.Right, e.MarginBounds.Bottom)
        e.HasMorePages = False
    End Sub

[ツリー表示へ]
タイトルRe^4: ページ設定ダイアログボックスの設定
記事No6958
投稿日: 2008/02/08(Fri) 16:43
投稿者花ちゃん
> > >  http://hanatyan.sakura.ne.jp/dotnet/Prt10.htm
> > まだ試してはおりませんが、教えていただいた方法はページ設定ダイアログの設定の

試すなり、よく見るなりしてから質問された方が...。

印刷位置の原点(0,0 )は使用しているプリンターの印刷開始位置であって
最近のプリンターなら、インクジェット式は、用紙の3mm 、3mm でレーザープリンタは
5mm , 5mm 位がその原点になるかと、従ってプリンターによって、用紙への印刷開始位置
が違うのでその分を考慮しないと用紙サイズからの印刷位置は、設定位置の位置とその分
誤差が生じます。
>ダイアログボックスの余白をすべて10mmにすると、左上が15,15に印刷されてしまいます
すなわちご使用のプリンターの印刷開始位置は、用紙の5mm , 5mm の位置になっている
かと思います。(5mm 以内の位置には印刷できない)

リンクのページは、そのプリンターの印刷開始位置を調べる方法が記載されていたかと
思うのですが。
ご使用のVBのバージョンによっても方法がちがいますので、周辺機器等に関する質問は
PCの環境や使用機器の詳細等も記載するようにして下さい。

[ツリー表示へ]
タイトルRe^5: ページ設定ダイアログボックスの設定
記事No6992
投稿日: 2008/02/12(Tue) 13:49
投稿者
遅くなりまして申し訳ありません。教えていただいてからいろいろ試してみました。

> 試すなり、よく見るなりしてから質問された方が...。
すいません...。
>
> 印刷位置の原点(0,0 )は使用しているプリンターの印刷開始位置であって
> 最近のプリンターなら、インクジェット式は、用紙の3mm 、3mm でレーザープリンタは
> 5mm , 5mm 位がその原点になるかと、従ってプリンターによって、用紙への印刷開始位置
> が違うのでその分を考慮しないと用紙サイズからの印刷位置は、設定位置の位置とその分
> 誤差が生じます。
> >ダイアログボックスの余白をすべて10mmにすると、左上が15,15に印刷されてしまいます
> すなわちご使用のプリンターの印刷開始位置は、用紙の5mm , 5mm の位置になっている
> かと思います。(5mm 以内の位置には印刷できない)
>
理解いたしました。ご報告させていただきます。
ページ設定ダイログの余白にあらかじめ数字を入れておきたいと考えましたが、
PageSetupDialog1.PageSettings.Margins.Left=200 とすると
ダイアログの左余白に20mmが設定されて表示できました。
ダイアログボックスをOKで終了させると、PageSetupDialog1.PageSettings.Margins.Left
の値は79となっていました。ここで 勝手にmm単位からインチ単位の変換がされていたのが、
非常に混乱した部分です。
また、ダイアログボックスでは あたかも用紙からの余白が設定できるように、
表示されていましたので、印刷位置の原点は用紙左上であると思い込んでおりました。

以下は 「印刷」フォームを表示させたときにあらかじめ余白を設定し、
ページ設定ダイアログを表示するときに、設定した余白をダイアログに反映させ、
HardMargin以下に余白を設定できないようにしようと考えたものです。
ご指摘がありましたら、お願いします。

    Dim PrnSet As New Printing.PrinterSettings
    Dim PapSet As New Printing.PageSettings
    Private Sub 印刷_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        With PapSet.Margins '1mm=39.37*0.01in
            .Left = 20 * 39.37 / 10 '左端を20mmに設定
            .Right = 10 * 39.37 / 10
            .Top = 10 * 39.37 / 10
            .Bottom = 10 * 39.37 / 10
        End With
        With PrnSet.DefaultPageSettings
            If .HardMarginX < PapSet.Margins.Left Then
                PapSet.Margins.Left = PapSet.Margins.Left - .HardMarginX
            Else
                PapSet.Margins.Left = 0
            End If
            If .HardMarginX < PapSet.Margins.Right Then
                PapSet.Margins.Right = PapSet.Margins.Right + .HardMarginX
            Else
                PapSet.Margins.Right = .HardMarginX * 2 + 1 * 39.37 / 10 'ぎりぎりだと印刷出来なかったので
            End If
            If .HardMarginY < PapSet.Margins.Top Then
                PapSet.Margins.Top = PapSet.Margins.Top - .HardMarginY
            Else
                PapSet.Margins.Top = 0
            End If
            If .HardMarginY < PapSet.Margins.Bottom Then
                PapSet.Margins.Bottom = PapSet.Margins.Bottom + .HardMarginY
            Else
                PapSet.Margins.Bottom = .HardMarginY * 2 + 1 * 39.37 / 10 'ぎりぎりだと印刷出来なかったので
            End If
        End With
        PrintDocument1.DefaultPageSettings = PapSet
    End Sub
    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        PrintDocument1.Print()
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim DPapSet As New Printing.PageSettings
        Dim Ret As DialogResult
        PrintDialog1.PrinterSettings = New Printing.PrinterSettings
        With PrintDialog1
            .UseEXDialog = False
            .AllowSelection = False
        End With
        Ret = PrintDialog1.ShowDialog()
        PrnSet = PrintDialog1.PrinterSettings
        If Ret = Windows.Forms.DialogResult.OK Then PrnSet = PrintDialog1.PrinterSettings
        PrintDocument1.PrinterSettings = PrnSet

        PageSetupDialog1.PageSettings = New Printing.PageSettings
        With PageSetupDialog1.PageSettings
            .PaperSize = PrnSet.DefaultPageSettings.PaperSize
            .Landscape = PrnSet.DefaultPageSettings.Landscape
        End With
        DPapSet = PapSet
Dialog_Show:
        With PageSetupDialog1.PageSettings.Margins 'ここで設定する数字は1/10mm単位
            .Left = (DPapSet.Margins.Left + DPapSet.HardMarginX) / 39.37 * 100
            .Right = (DPapSet.Margins.Right - DPapSet.HardMarginX) / 39.37 * 100
            .Top = (DPapSet.Margins.Top + DPapSet.HardMarginY) / 39.37 * 100
            .Bottom = (DPapSet.Margins.Bottom - DPapSet.HardMarginY) / 39.37 * 100
        End With
        Ret = PageSetupDialog1.ShowDialog
        If Ret = Windows.Forms.DialogResult.OK Then PapSet = PageSetupDialog1.PageSettings
        '出てくる数字は1/100インチ単位
        With PrnSet.DefaultPageSettings
            If .HardMarginX < PapSet.Margins.Left Then
                PapSet.Margins.Left = PapSet.Margins.Left - .HardMarginX
            Else
                DPapSet.Margins.Left = DPapSet.HardMarginX
                GoTo Re_Dialog_Show
            End If
            If .HardMarginX < PapSet.Margins.Right Then
                PapSet.Margins.Right = PapSet.Margins.Right + .HardMarginX
            Else
                DPapSet.Margins.Right = DPapSet.HardMarginX * 2
                GoTo Re_Dialog_Show
            End If
            If .HardMarginY < PapSet.Margins.Top Then
                PapSet.Margins.Top = PapSet.Margins.Top - .HardMarginY
            Else
                DPapSet.Margins.Top = DPapSet.HardMarginX
                GoTo Re_Dialog_Show
            End If
            If .HardMarginY < PapSet.Margins.Bottom Then
                PapSet.Margins.Bottom = PapSet.Margins.Bottom + .HardMarginY
            Else
                DPapSet.Margins.Bottom = DPapSet.HardMarginX
                GoTo Re_Dialog_Show
            End If
        End With
        PrintDocument1.DefaultPageSettings = PapSet
        Exit Sub
Re_Dialog_Show:
        Beep()
        GoTo Dialog_Show
    End Sub

    Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
        e.Graphics.DrawLine(New Pen(Color.Black, 0), _
          e.MarginBounds.Left, e.MarginBounds.Top, _
          e.MarginBounds.Right, e.MarginBounds.Top)
        e.Graphics.DrawLine(New Pen(Color.Black, 0), _
          e.MarginBounds.Left, e.MarginBounds.Bottom, _
          e.MarginBounds.Right, e.MarginBounds.Bottom)
        e.Graphics.DrawLine(New Pen(Color.Black, 0), _
         e.MarginBounds.Left, e.MarginBounds.Top, _
         e.MarginBounds.Left, e.MarginBounds.Bottom)
        e.Graphics.DrawLine(New Pen(Color.Black, 0), _
         e.MarginBounds.Right, e.MarginBounds.Top, _
         e.MarginBounds.Right, e.MarginBounds.Bottom)
        e.HasMorePages = False
    End Sub

[ツリー表示へ]