投稿者 ミニオン  (学生) 投稿日時 2018/11/23 19:55:42
データを読み込み、そのデータをグラフとして描画し、印刷したいのですが
データ量によって画像の幅が変わる為、複数ページに分割して印刷する処理を
色々考えたのですが上手くいかず、困っています。

やりたい事は
A4横の用紙に、
①用紙上部は「現在ページ数/総ページ数」、「印刷日」といった情報を印字
②用紙左部はグラフのY座標の目盛等の情報を印字
→①②はヘッダとして、各ページに印字
③読み込んだデータをグラフとして、左から右へ印字し、
グラフがページの印刷可能な範囲を超えた場合、次ページへ続きから印字
という処理です。

ネットで印刷処理について、調べているうちに、
プリンタの解像度や、印刷範囲を取得して、その情報によって処理を行うような事が
書いてあり、正直自分の手に負えなくなってきました。

お手数ですが、ご教示の程、宜しくお願い致します。
(一応以下に、考えたコードを載せておきます)

'Button1のClickイベントハンドラ
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        'PrintDocumentオブジェクトの作成
        Dim pd As New System.Drawing.Printing.PrintDocument

        '用紙:横向き
        pd.DefaultPageSettings.Landscape = True

        'PrintPageイベントハンドラの追加
        AddHandler pd.PrintPage, AddressOf pd_PrintPage

        '印刷を開始する
        pd.Print()

End Sub

'PrintPage処理
Private Sub pd_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs)

        '※ここに処理を追加し、下記処理「DrawGraph」をページ毎に制御できないかと考えています。

        '画像を描画する
        DrawGraph(e)


End Sub

'画像(グラフ)描画処理
Private Sub DrawGraph(ByVal e As System.Drawing.Printing.PrintPageEventArgs)

        '共通部(ヘッダ)の描画
        e.Graphics.DrawString("ヘッダ部", New Font("MS ゴシック", 20), Brushes.Black, 10, 10)

        '共通部(Y軸、X軸)の描画
        e.Graphics.DrawLine(Pens.Black, 80, 100, 80, 660)
        e.Graphics.DrawLine(Pens.Black, 80, 660, 1168, 660)

        '共通部(Y軸の目盛、補助線)の描画
        e.Graphics.DrawString("(℃)", New Font("MS ゴシック", 10), Brushes.Black, 50, 100)
        e.Graphics.DrawString("35", New Font("MS ゴシック", 10), Brushes.Black, 60, 150)
        e.Graphics.DrawString("30", New Font("MS ゴシック", 10), Brushes.Black, 60, 200)
        e.Graphics.DrawString("25", New Font("MS ゴシック", 10), Brushes.Black, 60, 250)
        e.Graphics.DrawString("20", New Font("MS ゴシック", 10), Brushes.Black, 60, 300)
        e.Graphics.DrawString("15", New Font("MS ゴシック", 10), Brushes.Black, 60, 350)
        e.Graphics.DrawString("10", New Font("MS ゴシック", 10), Brushes.Black, 60, 400)
        e.Graphics.DrawString("5", New Font("MS ゴシック", 10), Brushes.Black, 65, 450)
        e.Graphics.DrawString("0", New Font("MS ゴシック", 10), Brushes.Black, 65, 500)
        e.Graphics.DrawString("-5", New Font("MS ゴシック", 10), Brushes.Black, 60, 550)
        e.Graphics.DrawString("-10", New Font("MS ゴシック", 10), Brushes.Black, 55, 600)
        e.Graphics.DrawString("-15", New Font("MS ゴシック", 10), Brushes.Black, 55, 650)

        e.Graphics.DrawLine(Pens.Gray, 80, 160, 1168, 160)
        e.Graphics.DrawLine(Pens.Gray, 80, 210, 1168, 210)
        e.Graphics.DrawLine(Pens.Gray, 80, 260, 1168, 260)
        e.Graphics.DrawLine(Pens.Gray, 80, 310, 1168, 310)
        e.Graphics.DrawLine(Pens.Gray, 80, 360, 1168, 360)
        e.Graphics.DrawLine(Pens.Gray, 80, 410, 1168, 410)
        e.Graphics.DrawLine(Pens.Gray, 80, 460, 1168, 460)
        e.Graphics.DrawLine(Pens.Gray, 80, 510, 1168, 510)
        e.Graphics.DrawLine(Pens.Gray, 80, 560, 1168, 560)
        e.Graphics.DrawLine(Pens.Gray, 80, 610, 1168, 610)


        'グラフデータ部の描画
            '※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
        '※実際は、この部分の処理を
        '①foreach等のループ処理を用いて、実際のデータ(データテーブル等)を描画する。
        '②データの描画が、ページの描画範囲を超えた場合、次ページへ

        e.Graphics.DrawString("12/1", New Font("MS ゴシック", 8), Brushes.Black, 95, 670)
        e.Graphics.DrawLine(Pens.Black, 100, 410, 200, 390)
        e.Graphics.DrawString("12/2", New Font("MS ゴシック", 8), Brushes.Black, 195, 670)
        e.Graphics.DrawLine(Pens.Black, 200, 390, 300, 411)
        e.Graphics.DrawString("12/3", New Font("MS ゴシック", 8), Brushes.Black, 295, 670)

        '※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※


 End Sub