PrintDialog を使って

タグの編集
投稿者 hori  (社会人) 投稿日時 2013/11/8 16:57:31
VB2010EX を使っています。

VBから両面印刷をしたいと思い、MSのHPにあったコードを参照に下記のごとく書き
プリントダイアログでプリンターの設定をし両面印刷を試みてみましたが
2ページ目だけが片面印刷され両面印刷できません。

pg1 の e.HasMorePages = True を False にしても同じでした。
pg2 の部分のコードを消したら pg1 が印刷されます。
どこが悪いのかお分かりの方おられましたらご教授お願いいたします。

'========================================================

  ' Declare the PrintDocument object.
    Private WithEvents docToPrint As New Printing.PrintDocument

    ' This method will set properties on the PrintDialog object and
    ' then display the dialog.
    Private Sub Button1_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles Button1.Click

        ' Allow the user to choose the page range he or she would
        ' like to print.
        PrintDialog1.AllowSomePages = True

        ' Show the help button.
        PrintDialog1.ShowHelp = True

        ' Set the Document property to the PrintDocument for 
        ' which the PrintPage Event has been handled. To display the
        ' dialog, either this property or the PrinterSettings property 
        ' must be set 
        PrintDialog1.Document = docToPrint

        Dim result As DialogResult = PrintDialog1.ShowDialog()

        ' If the result is OK then print the document.
        If (result = DialogResult.OK) Then
            docToPrint.Print()
        End If

    End Sub

    ' The PrintDialog will print the document
    ' by handling the document's PrintPage event.
    Private Sub document_PrintPage(ByVal sender As Object, _
       ByVal e As System.Drawing.Printing.PrintPageEventArgs) _
           Handles docToPrint.PrintPage

        ' Insert code to render the page here.
        ' This code will be called when the control is drawn.

        ' The following code will render a simple
        ' message on the printed document.
        'Dim text As String = "In document_PrintPage method."
        'Dim printFont As New System.Drawing.Font _
        '    ("Arial", 35, System.Drawing.FontStyle.Regular)

        '' Draw the content.
        'e.Graphics.DrawString(text, printFont, _
        '    System.Drawing.Brushes.Black, 10, 10)

        '==============pg1===============

        Dim img As Image = Image.FromFile("c:test1.bmp")

        e.Graphics.DrawImage(img, New Rectangle(0, 0, img.Width, img.Height))

        e.HasMorePages = True

        img.Dispose()
       
        '==============pg2===============

        Dim img2 As Image = Image.FromFile("c:test2.bmp")

        e.Graphics.DrawImage(img2, New Rectangle(0, 0, img2.Width, img2.Height))

        e.HasMorePages = False

        img2.Dispose()

    End Sub
投稿者 るきお  (社会人) 投稿日時 2013/11/8 19:25:39
まず、PrintDialogについてですが、
PrintDialogは立派な画面が簡単に出せて便利ですが、あの画面ははりぼてであって、
あそこで何を設定しても基本的には印刷するドキュメントの設定には何も影響がありません。

両面印刷であるとか、印刷するドキュメントの情報は自分でプログラムを使ってプリンタードライバーに設定する必要があります。

そのプログラムは難しく、意地悪です。
なぜなら、プリンタによってできることが違うからです。
残念ですが私にはやり方を案内することはできません。

次に、実際のPrintPageイベントによる印刷処理ですが、
このイベントは1ページに付き1回発生します。
2ページあるときはこのイベントが2回発生し、
1回目に1ページ目の内容を描画し、2回目に2ページ目の内容を描画する必要があります。

HasMorePageは次のページが存在するかを示すプロパティで、これがTrueの状態でイベントを愁傷するとVBはまだ次のページがあると判断し、もう1度このイベントを発生させます。

horiさんのプログラムではページの区別なく、同じ座標に同じ大きさの図形を描画しているので、
最後に描画したものだけが常に印刷されるのだと思います。
また、このイベントを終了するときはHasMorePageがFalseになっていますので、VBには2ページがあると認識されていないと思います。

印刷については、こちらでも説明していますのでよろしければ参考にしてください。
http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard35.htm
投稿者 /400  (社会人) 投稿日時 2013/11/8 22:40:51
このあたりですかね
PrintDocument.DefaultPageSettings.PrinterSettings.Duplex = Duplex.Simplex
投稿者 るきお  (社会人) 投稿日時 2013/11/8 23:11:41
>PrintDocument.DefaultPageSettings.PrinterSettings.Duplex = Duplex.Simplex 
期待が持てそうですね。

horiさん、うまくいったら教えてください。
投稿者 hori  (社会人) 投稿日時 2013/11/9 11:19:02
るきおさま。400さま。ご教授ありがとうございます。

「PrintPageイベントは1ページに付き1回発生します。」についての理解不足が原因でした。
当学の、初級35回印刷をもっとしっかり読んでおけばよかったです。
結果的には下記のようにやったら成功しました。

PrintDialog も一応、機能しているようです。

400さまにご教授いただいた方法は、PrintDialog でその都度両面設定することなく
プログラムから自動で設定する方法みたいですので研究してみます。
その方法が分からないから PrintDialog を使ったわけですのでありがとうございます。

以下、うまくいったコードです。ありがとうございました。

=======================================================

 Dim CurrentPage As Integer = 0

    Private WithEvents docToPrint As New Printing.PrintDocument

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

        PrintDialog1.AllowSomePages = True

        PrintDialog1.ShowHelp = True

        PrintDialog1.Document = docToPrint

        Dim result As DialogResult = PrintDialog1.ShowDialog()

        If (result = DialogResult.OK) Then
            docToPrint.Print()
        End If

    End Sub

    Private Sub document_PrintPage(ByVal sender As Object, _
       ByVal e As System.Drawing.Printing.PrintPageEventArgs) _
           Handles docToPrint.PrintPage

        CurrentPage += 1

        If CurrentPage = 1 Then

            '==============pg1===============

            Dim img As Image = Image.FromFile("c:test1.bmp")

            e.Graphics.DrawImage(img, New Rectangle(0, 0, img.Width, img.Height))

            e.HasMorePages = True

            img.Dispose()

        Else
            '==============pg2===============

            Dim img2 As Image = Image.FromFile("c:test2.bmp")

            e.Graphics.DrawImage(img2, New Rectangle(0, 0, img2.Width, img2.Height))

            e.HasMorePages = False

            img2.Dispose()

        End If

    End Sub