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

印刷プレビュー時にずれる

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

お世話になっています。
ららと言います。

 印刷設定を行い、印刷プレビューを表示した場合に、思うようにプレビュー
表示されていましたが、印刷時には右下へ印刷内容がずれていました。
 そこで、プリンタのハードマージンのずれの分を考慮するため、
印刷ドキュメントのPrintPage時に印刷したい位置からハードマージン分を
差し引いたところ、思う位置に印刷できました。
 ところが、これを印刷プレビューすると左上へ行き過ぎるように
なってしまいました。
 印刷プレビューと印刷の位置関係を合わせるにはどのようにしたらいいのでしょうか?
(印刷プレビューダイアログの印刷ボタンをクリック時の印刷)


    Private mpsMain As New Printing.PageSettings  ' プリンタの設定

    ' 印刷のページ設定。
    Private Sub menuPrintIni_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles menuPrintIni.Click

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

            ' ページ設定ダイアログを表示する
            If .ShowDialog() = DialogResult.OK Then
                Console.WriteLine(.PageSettings.Margins)
            ElseIf System.Globalization.RegionInfo.CurrentRegion.IsMetric Then
                ' また元に戻す
                .PageSettings.Margins.Top /= 2.54
                .PageSettings.Margins.Bottom /= 2.54
                .PageSettings.Margins.Left /= 2.54
                .PageSettings.Margins.Right /= 2.54
            End If
        End With
    End Sub

    ' プレビュー
    Private Sub menuPrintPreview_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles menuPrintPreview.Click

        pntDocument.DefaultPageSettings = mpsMain
        pntPreviewDialog.Document = pntDocument
        ' 表示位置の設定
        pntPreviewDialog.ShowDialog()
    End Sub

    ' 印刷
    Private Sub pntDocument_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles pntDocument.PrintPage

            Dim pm As PrintMargin = GetHardMargins(e)   ' ハードマージンを取得する
            Dim myBitmap As Image = Image.FromFile("c:\111.bmp")
            ' 画像を描画する
            e.Graphics.DrawImage(myBitmap, _
                                e.MarginBounds.Left - pm.Left, _
                                e.MarginBounds.Top - pm.Top, _
                                e.MarginBounds.Width, _
                                e.MarginBounds.Height)
                            e.HasMorePages = False  ' 次のページがないことを通知する
            myBitmap.Dispose()
            .Dispose()
    End Sub

    Public Function GetHardMargins( _
               ByVal e As System.Drawing.Printing.PrintPageEventArgs) As PrintMargin
        Dim pm As PrintMargin

        Dim hdc As IntPtr = e.Graphics.GetHdc
        Dim offx As Single = Convert.ToSingle(GetDeviceCaps(hdc, PHYSICALOFFSETX))
        Dim offy As Single = Convert.ToSingle(GetDeviceCaps(hdc, PHYSICALOFFSETY))
        Dim resx As Single = Convert.ToSingle(GetDeviceCaps(hdc, HORZRES))
        Dim resy As Single = Convert.ToSingle(GetDeviceCaps(hdc, VERTRES))
        Dim hsz As Single = Convert.ToSingle(GetDeviceCaps(hdc, HORZSIZE))
        Dim vsz As Single = Convert.ToSingle(GetDeviceCaps(hdc, VERTSIZE))
        Dim hszi As Single = hsz / 25.4F  ' screen width in inches 
        Dim vszi As Single = vsz / 25.4F  ' screen height in inches 
        Dim pWid As Integer = Convert.ToString(GetDeviceCaps(hdc, PHYSICALWIDTH))   ' 実用紙幅取得(Pixel)
        Dim pHei As Integer = Convert.ToString(GetDeviceCaps(hdc, PHYSICALHEIGHT))  ' 実用紙高さ取得(Pixel)
        Dim ppix As Single = resx / hszi
        Dim ppiy As Single = resy / vszi
        pm.Top = (offy / ppix) * 100.0F
        pm.Left = (offx / ppix) * 100.0F
        pm.Right = pm.Left + (hszi * 100.0F)
        pm.Bottom = pm.Top + (vszi * 100.0F)
        pm.PaperWidth = pWid / (resx / hsz)  ' 実用紙幅(mm に変換)
        pm.PaperHeight = pHei / (resy / vsz) ' 実用紙高さ(mm に変換)
        e.Graphics.ReleaseHdc(hdc)          ' デバイスコンテキストハンドルを解放
        Return pm
    End Function

    Public Structure PrintMargin
        Dim Top As Integer          ' 上(pixel)
        Dim Left As Integer         ' 左(pixel)
        Dim Right As Integer        ' 右(pixel)
        Dim Bottom As Integer       ' 下(pixel)
        Dim PaperWidth As Integer   ' 実際の用紙幅(mm)
        Dim PaperHeight As Integer  ' 実際の用紙高さ(mm)
    End Structure
プレビューの時はフラッグを立てるというような方法で解決できそうですが、それではダメなのでしょうか?
  • 題名: Re[1]: 印刷プレビュー時にずれる
  • 著者: VBレスキュー(花ちゃん)
  • 日時: 2006/12/18 11:34:29
  • ID: 18571
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
投稿されたコードが書けるのなら自力で解決できるはずでは。
http://hanatyan.sakura.ne.jp/dotnet/Prt10.htm

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