DOBON.NET DOBON.NETプログラミング掲示板過去ログ

印刷時に左と上の余白が多い

環境/言語:[.net 2003 windows2000 vb ]
分類:[.NET]

おせわになっています ららです。
印刷を印刷可能範囲いっぱいに印刷したいのですが、
印刷できなくて困っています。
以下のソースでするとどうしても印刷時に左と上の余白が多い常態
になってしまうのですが、どうしたらいいのでしょうか?
 おねがいします。

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim pd As New System.Drawing.Printing.PrintDocument
        AddHandler pd.PrintPage, AddressOf pd_PrintPage


        Dim PageSetupDialog1 As New PageSetupDialog
        PageSetupDialog1.Document = New System.Drawing.Printing.PrintDocument

        ' マージンを指定する
        PageSetupDialog1.PageSettings.Margins = _
            New System.Drawing.Printing.Margins(100, 100, 100, 100)

        ' メートル法を使っている時は、メートルに直す
        If System.Globalization.RegionInfo.CurrentRegion.IsMetric Then
            PageSetupDialog1.PageSettings.Margins.Top *= 2.54
            PageSetupDialog1.PageSettings.Margins.Bottom *= 2.54
            PageSetupDialog1.PageSettings.Margins.Left *= 2.54
            PageSetupDialog1.PageSettings.Margins.Right *= 2.54
        End If

        ' ページ設定ダイアログを表示する
        If PageSetupDialog1.ShowDialog() = DialogResult.OK Then
            pd.Print()

        ElseIf System.Globalization.RegionInfo.CurrentRegion.IsMetric Then
            ' また元に戻す
            PageSetupDialog1.PageSettings.Margins.Top /= 2.54
            PageSetupDialog1.PageSettings.Margins.Bottom /= 2.54
            PageSetupDialog1.PageSettings.Margins.Left /= 2.54
            PageSetupDialog1.PageSettings.Margins.Right /= 2.54
        End If
    End Sub

    Private Sub pd_PrintPage(ByVal sender As Object, _
        ByVal e As System.Drawing.Printing.PrintPageEventArgs)
        ' 画像を読み込む
        Dim img As Image = Image.FromFile("c:\111.bmp")
        ' 画像を描画する
        e.Graphics.DrawImage(img, e.MarginBounds)
        ' 次のページがないことを通知する
        e.HasMorePages = False
        ' 後始末をする
        img.Dispose()
    End Sub
ご質問内容を確認させていただきたいのですが、MarginBoundsプロパティとPageBoundsプロパティを比較しても、中央に来ていないということでしょうか?それとも、実際に印刷した時だけでしょうか?
ご返信ありがとうございます。

MarginBoundsプロパティとPageBoundsプロパティを比較してみました。
内容は
A4用紙に四隅に25.4mmのページ設定時に
MarginBoundsが{X=100,Y=100,Width=627,Height=969}
PageBoundsが{X=0,Y=0,Width=827,Height=1169}
のようになっていました。
どうやら正しいようですが、VBから印刷すると実際の余白は、
上31mm 左31mm 右19mm 下19mmとなってしまいます。

他の市販ソフトからの出力は正常にでていますし、
再起動してもだめでした。
なにが影響しているのでしょうか?
すみませんがよろしくおねがいします。

framework 1.1 sp1 .net2003 vb Windows 2000 sp4
ハードマージンの問題かもしれません。.NET 2.0ならばハードマージンを取得するプロパティが用意されていますが、そうでなければ、以下のURLを参考にしてみてください。

http://groups.google.co.jp/group/microsoft.public.dotnet.framework.drawing/msg/3710371b3844935b?hl=ja&
横から失礼します、黒犬と申します。

一つ気になったのですが、「PrintDocument」をお使いですが
「OriginAtMargins」プロパティの値はどうなっていますか?
確かこのプロパティで動作が変わった様な記憶があります。


黒犬
色々とありがとうございます。
 まず、管理人さんの教えてくださったHPにあった、GetDeviceCapsを呼び出すことでハードマージン
を取得できるということで試してみました。 するとGetDeviceCapsに渡す、ハンドルが必要という
ことでどこから取得するかで時間がかかり、また、ハンドルを取得後開放しわすれて、エラーが出て
先に進まずまた時間がかかってしまいました。
 少々改良しうまくいきました。ありがとうございます。


黒犬さんの教えてくださったOriginAtMarginsはFalseとなっていました。このプロパティを変えると
マージン位置がかえられるんだということで勉強になりました。ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板