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

印刷プレビューの印刷について

環境/言語:[Windows2000 VB.NET2002 Framework1.0]
分類:[.NET]

はじめまして。VB.NET初心者です。

どぼん!の .NET Tipsの

「文字列を印刷する」
「印刷プレビューを表示する」

を参考に以下のプログラム(VB.NET)を作成し、印刷プレビューを表示したのですが、
プレビュー内容は意図したとおり表示されるのですが、
プレビュー画面の左上の印刷ボタンをクリックして印刷すると、
プレビューどおりに印刷されません。

印刷内容は「文字列を印刷する」のソースに、
以下の*印の部分の2行を追加しただけです。
印刷すると、追加した2行は印刷されますが、Textbox1の内容のみが印刷されません。
(Textbox1の内容が長い文字列の場合も改行が入った場合も同じです)

プレビューどおりに印刷する方法をご存じの方いらっしゃいましたら、お教え願います。

------------------------------------------------------------------
Private Sub pd_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs)
If printingPosition = 0 Then
'改行記号を'\n'に統一する
printingText = printingText.Replace(vbCrLf, vbLf)
printingText = printingText.Replace(vbCr, vbLf)
End If

'印刷する初期位置を決定
Dim x As Integer = e.MarginBounds.Left
Dim y As Integer = e.MarginBounds.Top

'* 次の行が追加した行です("タイトルという文字を最初の行に出力しています)
e.Graphics.DrawString("タイトル", printFont, Brushes.Black, x, y)

'1ページに収まらなくなるまでループ
While e.MarginBounds.Height > y + printFont.Height
Dim line As String = ""

While True
'印刷する文字がなくなるか、
'改行の時はループから抜けて印刷する
If printingPosition >= printingText.Length OrElse _
printingText.Chars(printingPosition) = vbLf Then
printingPosition += 1
Exit While
End If
'一文字追加し、印刷幅を超えるか調べる
line += printingText.Chars(printingPosition)
If e.Graphics.MeasureString(line, printFont).Width _
> e.MarginBounds.Width Then
'印刷幅を超えたため、折り返す
line = line.Substring(0, line.Length - 1)
Exit While
End If
'印刷文字位置を次へ
printingPosition += 1
End While
'一行書き出す
e.Graphics.DrawString(line, printFont, Brushes.Black, x, y + printFont.Height)
'次の行の印刷位置を計算
y += printFont.GetHeight(e.Graphics)
End While

'* 次の行が追加した行です("ページ"という文字を横マージンの中央・最終行の2行下の位置に出力しています)
e.Graphics.DrawString("ページ", printFont, Brushes.Black, e.MarginBounds.Width / 2, y + printFont.GetHeight * 2)

'次のページがあるか調べる
If printingPosition >= printingText.Length Then
e.HasMorePages = False
Else
e.HasMorePages = True
End If
End Sub
■No1393に返信(のぶさんの記事)
はじめまして、こんにちは。

> どぼん!の .NET Tipsの
>
> 「文字列を印刷する」
> 「印刷プレビューを表示する」
>
> を参考に以下のプログラム(VB.NET)を作成し、印刷プレビューを表示したのですが、
> プレビュー内容は意図したとおり表示されるのですが、
> プレビュー画面の左上の印刷ボタンをクリックして印刷すると、
> プレビューどおりに印刷されません。

printingPositionの初期化をボタンコントロールを押した時だけしているため、プレビュー画面の印刷ボタンのクリックではうまく行かないようです。次のようにコードの最後の部分を変えてみてください。

Private Sub pd_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs)
'(省略)
'次のページがあるか調べる
If printingPosition >= printingText.Length Then
'<<ここを追加>>
printingPosition = 0
e.HasMorePages = False
Else
e.HasMorePages = True
End If
End Sub

もう一つ言わせていただければ、のぶさんの加えられた「ページ」の行はMarginBoundsをはみ出して印刷されそうですが。
■No1398に返信(管理人さんの記事)

管理人さん、こんにちは。お返事ありがとうございます。

> printingPositionの初期化をボタンコントロールを押した時だけしているため、プレビュー画面の印刷ボタンのクリックではうまく行かないようです。次のようにコードの最後の部分を変えてみてください。
(省略)

上記の方法で解決しました。ありがとうございました。

> もう一つ言わせていただければ、のぶさんの加えられた「ページ」の行はMarginBoundsをはみ出して印刷されそうですが。

そうですね…。
「ページ」の行を以下のように変更し、

e.Graphics.DrawString("ページ", printFont, Brushes.Black, e.MarginBounds.Width / 2, e.MarginBounds.Height)

Textbox1の内容をwhile文で出力している部分を以下のように変更する事でMarginBounds内に収まりました。

'1ページに収まらなくなるまでループ
While e.MarginBounds.Height > y + printFont.Height * 3
~~~
解決済み!

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