お世話になっています。
ららと言います。
印刷設定を行い、印刷プレビューを表示した場合に、思うようにプレビュー
表示されていましたが、印刷時には右下へ印刷内容がずれていました。
そこで、プリンタのハードマージンのずれの分を考慮するため、
印刷ドキュメントの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
分類:[.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