tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル印刷で用紙の横向きと縦向きをきりかえる
記事No7138
投稿日: 2008/03/06(Thu) 11:26
投稿者ひでと
お世話になります。
表を印刷する処理を作っています。縦長の表と横長の表を用紙向きを切り替えて
出力する必要があります。こちらで Landscapeを操作する方法がのっていたのですが
うまく切り替えることができません。下記に試したものを乗せますので
アドバイスお願いします。
Public Class Form1
    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim Ret As DialogResult
        PrintPreviewDialog1.Document = Me.PrintDocument1
        Ret = PrintPreviewDialog1.ShowDialog()
    End Sub
    Private Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim Ret As DialogResult
        PrintPreviewDialog1.Document = Me.PrintDocument2
        Ret = PrintPreviewDialog1.ShowDialog()
    End Sub
    Private Sub PageSetting1(ByVal sender As Object, ByRef e As System.Drawing.Printing.PrintPageEventArgs)
        'Dim sender As New System.Drawing.Printing.PrintDocument
        '通常使うプリンターのPageSettingsを取得
        Dim dftPSettings As New System.Drawing.Printing.PageSettings
        'dftPSettings = sender.PrinterSettings.DefaultPageSettings
        dftPSettings.Landscape = False
        With e.PageSettings
            .Landscape = False
            .Margins.Left = 20 * 39.37 / 10 - dftPSettings.HardMarginX
            .Margins.Right = 10 * 39.37 / 10 - dftPSettings.HardMarginX
            .Margins.Top = 10 * 39.37 / 10 - dftPSettings.HardMarginY
            .Margins.Bottom = 10 * 39.37 / 10 - dftPSettings.HardMarginY
        End With
    End Sub
    Private Sub PageSetting2(ByVal sender As Object, ByRef e As System.Drawing.Printing.PrintPageEventArgs)
        'Dim sender As New System.Drawing.Printing.PrintDocument
        '通常使うプリンターのPageSettingsを取得
        Dim dftPSettings As New System.Drawing.Printing.PageSettings
        'dftPSettings = sender.PrinterSettings.DefaultPageSettings
        dftPSettings.Landscape = Not dftPSettings.Landscape
        With e.PageSettings
            .Landscape = Not .Landscape
            .Margins.Left = 10 * 39.37 / 10 - dftPSettings.HardMarginX
            .Margins.Right = 10 * 39.37 / 10 - dftPSettings.HardMarginX
            .Margins.Top = 20 * 39.37 / 10 - dftPSettings.HardMarginY
            .Margins.Bottom = 10 * 39.37 / 10 - dftPSettings.HardMarginY
        End With
    End Sub
    Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
        e.HasMorePages = False
    End Sub

    Private Sub PrintDocument2_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument2.PrintPage
        e.HasMorePages = False
    End Sub
End Class
上記を実行すると どちらも縦向きの用紙がプレビューされてしまいます。

補足
実際は Buttun1_Click で2つのドキュメントを連続して印刷したいと考えています。

[ツリー表示へ]
タイトルRe: 印刷で用紙の横向きと縦向きをきりかえる
記事No7139
投稿日: 2008/03/06(Thu) 11:32
投稿者ひでと
すいません 大事なとこが抜けてました
    Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
        PageSetting1(sender, e)
        e.HasMorePages = False
    End Sub

    Private Sub PrintDocument2_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument2.PrintPage
        PageSetting2(sender, e)
        e.HasMorePages = False
    End Sub
で 試してみましたが、同じでした。
> 上記を実行すると どちらも縦向きの用紙がプレビューされてしまいます。
>
> 補足
> 実際は Buttun1_Click で2つのドキュメントを連続して印刷したいと考えています。

[ツリー表示へ]
タイトルRe: 印刷で用紙の横向きと縦向きをきりかえる
記事No7140
投稿日: 2008/03/06(Thu) 12:30
投稿者花ちゃん
> こちらで Landscapeを操作する方法がのっていたのですが
> うまく切り替えることができません。

今、確認しましたが、クリック毎に縦向き、横向きにプレビュー表示しておりますが
どのようなコードで試されたのでしょうか?

http://hanatyan.sakura.ne.jp/dotnet/Prt08.htm#no2

Form に次のコントロールを貼り付けて、下記のコードを試して見てください。
PrintDocument1 / PrintDocument1 / Button1 / Button2

Public Class Form1
Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As _
         System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
   Dim g As Graphics = e.Graphics
   g.DrawString("あいうえお", _
               New Font("MS Pゴシック", 12), Brushes.Black, 0, 0)
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) Handles Button1.Click
   PrintDocument1.DefaultPageSettings.Landscape = True     '横向き
'確認のためにプレビューを表示
    PrintPreviewDialog1.Document = PrintDocument1
    PrintPreviewDialog1.Size = New Size(800, 900)
    PrintPreviewDialog1.PrintPreviewControl.Zoom = 0.5
    PrintPreviewDialog1.ShowDialog()
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) Handles Button2.Click
   PrintDocument1.DefaultPageSettings.Landscape = False      '縦向き
'確認のためにプレビューを表示
    PrintPreviewDialog1.Document = PrintDocument1
    PrintPreviewDialog1.Size = New Size(800, 900)
    PrintPreviewDialog1.PrintPreviewControl.Zoom = 0.5
    PrintPreviewDialog1.ShowDialog()
End Sub
End Class

[ツリー表示へ]
タイトルRe^2: 印刷で用紙の横向きと縦向きをきりかえる
記事No7143
投稿日: 2008/03/06(Thu) 13:30
投稿者ひでと
ありがとうございます。
下の魔界の仮面弁士様のご指摘のように ページ毎に向きを切り替えて印刷
したいと思っています。はじめに乗せたものを直してふたたび乗せます。
1ページ目は用紙の向きを縦に2ページ目は横にしてプレビューしようとしております。
Public Class Form1
    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim Ret As DialogResult
        PrintPreviewDialog1.Document = Me.PrintDocument1
        Ret = PrintPreviewDialog1.ShowDialog()
    End Sub
    Private Sub PageSetting1(ByVal sender As Object, ByRef e As System.Drawing.Printing.PrintPageEventArgs)
        'Dim sender As New System.Drawing.Printing.PrintDocument
        '通常使うプリンターのPageSettingsを取得
        Dim dftPSettings As New System.Drawing.Printing.PageSettings
        'dftPSettings = sender.PrinterSettings.DefaultPageSettings
        dftPSettings.Landscape = False
        With e.PageSettings
            .Landscape = False
            .Margins.Left = 20 * 39.37 / 10 - dftPSettings.HardMarginX
            .Margins.Right = 10 * 39.37 / 10 - dftPSettings.HardMarginX
            .Margins.Top = 10 * 39.37 / 10 - dftPSettings.HardMarginY
            .Margins.Bottom = 10 * 39.37 / 10 - dftPSettings.HardMarginY
        End With
    End Sub
    Private Sub PageSetting2(ByVal sender As Object, ByRef e As System.Drawing.Printing.PrintPageEventArgs)
        'Dim sender As New System.Drawing.Printing.PrintDocument
        '通常使うプリンターのPageSettingsを取得
        Dim dftPSettings As New System.Drawing.Printing.PageSettings
        'dftPSettings = sender.PrinterSettings.DefaultPageSettings
        dftPSettings.Landscape = True
        With e.PageSettings
            .Landscape = True
            .Margins.Left = 10 * 39.37 / 10 - dftPSettings.HardMarginX
            .Margins.Right = 10 * 39.37 / 10 - dftPSettings.HardMarginX
            .Margins.Top = 20 * 39.37 / 10 - dftPSettings.HardMarginY
            .Margins.Bottom = 10 * 39.37 / 10 - dftPSettings.HardMarginY
        End With
    End Sub
    Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
        Static Page As Integer
        Dim nFont As Font
        nFont = New Font("MS 明朝", 10)
        If Page = 0 Then
            PageSetting1(sender, e)
            e.Graphics.DrawString("ページ1", nFont, Brushes.Black, _
                e.PageSettings.Margins.Left + 10, e.PageSettings.Margins.Top + 10)
            e.HasMorePages = True
            Page = 1
        Else
            PageSetting2(sender, e)
            e.Graphics.DrawString("ページ2", nFont, Brushes.Black, _
               e.PageSettings.Margins.Left + 10, e.PageSettings.Margins.Top + 10)
            e.HasMorePages = False
        End If
    End Sub
End Class

[ツリー表示へ]
タイトルRe: 印刷で用紙の横向きと縦向きをきりかえる
記事No7141
投稿日: 2008/03/06(Thu) 12:35
投稿者魔界の仮面弁士
> 表を印刷する処理を作っています。縦長の表と横長の表を用紙向きを切り替えて
> 出力する必要があります。

ページごとに切り替えて表示したいのでしょうか?
それとも、全ページまとめて、縦/横を切り替えたいのでしょうか?



以下、手抜きなサンプル。

Public Class Form1
   Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) _
    Handles Button1.Click
      PrintPreviewDialog1.ShowDialog()
   End Sub

   Private page As Integer = 1
   Sub PrintDocument1_PrintPage(ByVal sender As Object, _
    ByVal e As Printing.PrintPageEventArgs) _
    Handles PrintDocument1.PrintPage
      e.Graphics.DrawRectangle(Pens.Blue, 30, 30, 500, 500)
      Using F As New Font("MS UI Gothic", 40)
         e.Graphics.DrawString(page.ToString("0ページ"), F, Brushes.Red, 100, 100)
      End Using
      If page < 10 Then
         e.HasMorePages = True
         page += 1
      Else
         e.HasMorePages = False
         page = 0
      End If
   End Sub

   Sub PrintDocument1_QueryPageSettings(ByVal sender As Object, _
    ByVal e As Printing.QueryPageSettingsEventArgs) _
    Handles PrintDocument1.QueryPageSettings
      With e.PageSettings
         If page <= 3 Then
            .PaperSize = New Printing.PaperSize("A4", 1169, 827)
         ElseIf page <= 6 Then
            .PaperSize = New Printing.PaperSize("B5", 1012, 717)
         Else
            .PaperSize = New Printing.PaperSize("A5", 827, 585)
         End If
         .Landscape = (page Mod 2 = 0)
      End With
   End Sub
End Class

[ツリー表示へ]
タイトルRe^2: 印刷で用紙の横向きと縦向きをきりかえる
記事No7144
投稿日: 2008/03/06(Thu) 13:47
投稿者ひでと
ありがとうございます。
>
> ページごとに切り替えて表示したいのでしょうか?
> それとも、全ページまとめて、縦/横を切り替えたいのでしょうか?
はい ページ毎に切り替えて表示をしたいと考えています。

>
> Public Class Form1
>    Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) _
>     Handles Button1.Click
>       PrintPreviewDialog1.ShowDialog()
>    End Sub
>
>    Private page As Integer = 1
>    Sub PrintDocument1_PrintPage(ByVal sender As Object, _
>     ByVal e As Printing.PrintPageEventArgs) _
>     Handles PrintDocument1.PrintPage
>       e.Graphics.DrawRectangle(Pens.Blue, 30, 30, 500, 500)
>       Using F As New Font("MS UI Gothic", 40)
>          e.Graphics.DrawString(page.ToString("0ページ"), F, Brushes.Red, 100, 100)
>       End Using
>       If page < 10 Then
>          e.HasMorePages = True
>          page += 1
>       Else
>          e.HasMorePages = False
>          page = 0
>       End If
>    End Sub
>
>    Sub PrintDocument1_QueryPageSettings(ByVal sender As Object, _
>     ByVal e As Printing.QueryPageSettingsEventArgs) _
>     Handles PrintDocument1.QueryPageSettings
>       With e.PageSettings
>          If page <= 3 Then
>             .PaperSize = New Printing.PaperSize("A4", 1169, 827)
>          ElseIf page <= 6 Then
>             .PaperSize = New Printing.PaperSize("B5", 1012, 717)
>          Else
>             .PaperSize = New Printing.PaperSize("A5", 827, 585)
>          End If
>          .Landscape = (page Mod 2 = 0)
>       End With
>    End Sub
> End Class
QueryPageSettingsイベントを操作する感じなのですね。
試してみましたが、うまく動くのを確認しました。ありがとうございました。

ただ NET Framework クラス ライブラリ の解説で
「PageSettings クラスを使用して、ページの印刷方法を変更する設定を指定します。通常、
PrintDocument.DefaultPageSettings プロパティを使用して、印刷するすべてのページに既定の設定を指定します。ページごとに設定を指定するには、PrintDocument.PrintPage イベントまたは PrintDocument.QueryPageSettings イベントを処理し、それぞれ PrintPageEventArgs または QueryPageSettingsEventArgs に含まれる PageSettings 引数を変更します。」
とありましたので PrintDocument.PrintPage イベントでPrintPageEventArgs
を操作すればいいのかと考えたのですが(花ちゃん様への返信にコード記載)、
うまくいきませんでした。 どのあたりがいけないのでしょうか?

[ツリー表示へ]
タイトルRe^3: 印刷で用紙の横向きと縦向きをきりかえる
記事No7145
投稿日: 2008/03/06(Thu) 14:03
投稿者ひでと
追伸します。いただいたコードを元に下記の用に変更して実験したところ
思うような処理となりました。ありがとうございました。

Public Class Form1
    Dim Page As Integer
    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim Ret As DialogResult
        PrintPreviewDialog1.Document = Me.PrintDocument1
        Ret = PrintPreviewDialog1.ShowDialog()
    End Sub
    Private Sub PageSetting1(ByVal sender As Object, ByRef e As Printing.QueryPageSettingsEventArgs)
        'Dim sender As New System.Drawing.Printing.PrintDocument
        '通常使うプリンターのPageSettingsを取得
        Dim dftPSettings As New System.Drawing.Printing.PageSettings
        'dftPSettings = sender.PrinterSettings.DefaultPageSettings
        dftPSettings.Landscape = False
        With e.PageSettings
            .Landscape = False
            .Margins.Left = 20 * 39.37 / 10 - dftPSettings.HardMarginX
            .Margins.Right = 10 * 39.37 / 10 - dftPSettings.HardMarginX
            .Margins.Top = 10 * 39.37 / 10 - dftPSettings.HardMarginY
            .Margins.Bottom = 10 * 39.37 / 10 - dftPSettings.HardMarginY
        End With
    End Sub
    Private Sub PageSetting2(ByVal sender As Object, ByRef e As Printing.QueryPageSettingsEventArgs)
        'Dim sender As New System.Drawing.Printing.PrintDocument
        '通常使うプリンターのPageSettingsを取得
        Dim dftPSettings As New System.Drawing.Printing.PageSettings
        'dftPSettings = sender.PrinterSettings.DefaultPageSettings
        dftPSettings.Landscape = True
        With e.PageSettings
            .Landscape = True
            .Margins.Left = 10 * 39.37 / 10 - dftPSettings.HardMarginX
            .Margins.Right = 10 * 39.37 / 10 - dftPSettings.HardMarginX
            .Margins.Top = 20 * 39.37 / 10 - dftPSettings.HardMarginY
            .Margins.Bottom = 10 * 39.37 / 10 - dftPSettings.HardMarginY
        End With
    End Sub
    Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
        Dim nFont As Font
        nFont = New Font("MS 明朝", 10)
        If Page = 0 Then
            e.Graphics.DrawString("ページ1", nFont, Brushes.Black, _
                e.PageSettings.Margins.Left + 10, e.PageSettings.Margins.Top + 10)
            e.HasMorePages = True
            Page = 1
        Else
            e.Graphics.DrawString("ページ2", nFont, Brushes.Black, _
               e.PageSettings.Margins.Left + 10, e.PageSettings.Margins.Top + 10)
            e.HasMorePages = False
            Page = 0
        End If
    End Sub

    Sub PrintDocument1_QueryPageSettings(ByVal sender As Object, ByVal e As Printing.QueryPageSettingsEventArgs) Handles PrintDocument1.QueryPageSettings
        With e.PageSettings
            '.PaperSize = New Printing.PaperSize("A4", 1169, 827)
            If Page = 0 Then
                PageSetting1(sender, e)
            Else
                .Landscape = True
            End If
        End With
    End Sub
End Class

[ツリー表示へ]
タイトルRe^3: 印刷で用紙の横向きと縦向きをきりかえる
記事No7147
投稿日: 2008/03/06(Thu) 14:15
投稿者魔界の仮面弁士
> はじめに乗せたものを直してふたたび乗せます。
乗せる→載せる?


> Private Sub PageSetting1(ByVal sender As Object, ByRef e As System.Drawing.Printing.PrintPageEventArgs)
> Private Sub PageSetting2(ByVal sender As Object, ByRef e As System.Drawing.Printing.PrintPageEventArgs)
この sender 引数は、何のために設けているのでしょう?
また、何故 e は ByRef にしてあるのでしょう?


> Dim nFont As Font
> nFont = New Font("MS 明朝", 10)
Using ステートメントを使いましょう。
生成した Font は、使用後に解放しなければなりませんので。


> PageSetting1(sender, e)
「印刷している最中(PrintPage イベントの中)」で、レイアウト変更を行う事はできません。
もし、印刷中のレイアウト修正が可能だったとしたら、PrintPage 中の
e.PageBounds や e.MarginBounds まで、動的に変わる事になってしまいます。


つまりレイアウト変更は、「印刷される直前」に行われなければなりません。
全ページを一括指定したいなら、
 PrintDocument1.DefaultPageSettings.Landscape = False
 PrintPreviewDialog1.ShowDialog()
のように、印刷処理の直前に行わなければなりませんし、ページ単位の個別指定ならば
先のサンプルのように、それぞれの PrintPage が発生する直前に呼び出される
QueryPageSettings を使う事になるというわけです。

[ツリー表示へ]
タイトルRe^4: 印刷で用紙の横向きと縦向きをきりかえる
記事No7148
投稿日: 2008/03/06(Thu) 16:41
投稿者ひでと
ありがとうございます。
> > はじめに乗せたものを直してふたたび乗せます。
> 乗せる→載せる?
失礼しました。
>
>
> > Private Sub PageSetting1(ByVal sender As Object, ByRef e As System.Drawing.Printing.PrintPageEventArgs)
> > Private Sub PageSetting2(ByVal sender As Object, ByRef e As System.Drawing.Printing.PrintPageEventArgs)
> この sender 引数は、何のために設けているのでしょう?
> また、何故 e は ByRef にしてあるのでしょう?
いろいろいじっていたので、混乱しておりました。
もう一度見直ししてみます。
>
>
> > Dim nFont As Font
> > nFont = New Font("MS 明朝", 10)
> Using ステートメントを使いましょう。
> 生成した Font は、使用後に解放しなければなりませんので。
>
>
> > PageSetting1(sender, e)
> 「印刷している最中(PrintPage イベントの中)」で、レイアウト変更を行う事はできません。
> もし、印刷中のレイアウト修正が可能だったとしたら、PrintPage 中の
> e.PageBounds や e.MarginBounds まで、動的に変わる事になってしまいます。
>
>
> つまりレイアウト変更は、「印刷される直前」におこなれなければなりません。
> 全ページを一括指定したいなら、
>  PrintDocument1.DefaultPageSettings.Landscape = False
>  PrintPreviewDialog1.ShowDialog()
> のように、印刷処理の直前に行わなければなりませんし、個別指定なら、
> 先のサンプルのように、それぞれの PrintPage が発生する直前に呼び出される
> QueryPageSettings を使う事になるというわけです。
なんとなくですが分かりました。QueryPageSettingsのことをもう少し調べてみます。
ありがとうございました。

[ツリー表示へ]