投稿者 魔界の仮面弁士  (社会人) 投稿日時 2012/2/7 16:36:22
VB6 の RichTextBox には印刷機能があったのですが、
VB.NET では何故か無くなっているのですよね…。

VB.NET で、RichTextBox の内容を(書式付きで)印刷する方法が
以下に掲載されています。一応参考までに。
http://support.microsoft.com/kb/811401


> コンボボックスで指定した行数をこえた場合
この判定そのものは行えるのですよね?

改ページ位置の判定は、PrintPage イベントの中で行っても構いませんし、
印刷前にあらかじめ算出しておいても構わないと思いますが、事前に判定しておく場合は、
テキストデータを行単位に分割しておくと、印刷時に扱いやすいかも知れませんね。


> 改ページしたいのですが
PrintPage イベントを抜ける際に、「e.HasMorePages = True」にしておいてください。
そうすれば、次のページの印刷のために、もう一度 PrintPage イベントが呼び出されます。
(e.HasMorePages = False を指定するのは、最後のページを印刷し終わったときだけです)

結果として、PrintPage イベントは複数回呼ばれることになるため、
現在どのページを印刷しているのかは、Private 変数などで自己管理します。
(たとえば、Private currentPage As Integer など)

また、再度印刷したときのために、現在ページ位置をリセットできるよう、
BeginPrint/EndPrint イベントも利用してください。


以下、参考資料として:

[複数ページの印刷]
http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=2220

[RichTextBoxの内容をA4の部分的範囲に印刷]
http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=9730

[PrintPreviewDialogの印刷ボタンを使用不可にしたい。]
http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=9987


--- 以下は、質問の本題とは関係ないところですが ---

> Dim g As Graphics = e.Graphics
変数 g を使って
 「Dim sTest As Single = g.MeasureString(a, ItemFont).Width」
のように処理している場所もあれば、
 「e.Graphics.DrawString(a, ItemFont, Brushes.Black, 30, 340 + bityouseisita + (tasugyou * haba))」
のように、e.Graphics を直接指定している個所もありますね。
今のままでも問題はありませんが、どちらかの表記に統一しておいた方がスマートかと。


> Dim ItemFont As Font = New Drawing.Font("MS Pゴシック", okisa, FontStyle.Bold)
上記の宣言は、下記のように記述する必要があります。

Using ItemFont As New Font("MS Pゴシック", okisa, FontStyle.Bold)

End Using



フォント名は、全角/半角や空白指定なども含めて正確に指定する必要があります。
今回の場合は、"MS Pゴシック" ではなく "MS Pゴシック" と指定せねばなりません。
(もしくは、英語名である "MS PGothic" でも良いですが)

フォント名が間違っていても動作はしますが、同じフォントが見つからない場合には
代替フォント(たとえば "Microsoft Sans Serif" など)に置き換えられてしまい、
正しく描画できない可能性があります。


また、印刷用に Font を New する場合は、Using ステートメントを利用するようにしましょう。
Using では都合が悪い場合には、最後に Dispose メソッドで破棄するようにします。
http://msdn.microsoft.com/ja-jp/library/system.drawing.font.dispose%28vs.80%29.aspx


> For moji As Integer = 0 To RichTextBox1.Text.Length - 1  'リッチテキストのなかの文字全部
個人的には
 RichTextBox1.Text.Length
よりも
 RichTextBox1.TextLength
を使う事をおすすめしておきます。意味は一緒なのですけれどね。
http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=9187 


なお提示のサンプルだと、禁則処理や複合文字などの考慮が抜けているため、
たとえば文末に「ガ」や「ですが、」などの文章が来た場合において、位置によっては
濁点や句読点が次の行頭に送られてしまい、不自然な文章になってしまう点が
少し気になりました。あえてそうしているのであれば構わないのですけれども。


> e.Graphics.DrawLine(New Pen(Color.Black), 20, gyousuu, 810, gyousuu)
Font 同様、Pen や Brush も破棄すべきオブジェクトなので、この場合は、
Using p As New Pen(Color.Black)
    e.Graphics.DrawLine(p, 20, gyousuu, 810, gyousuu)
End Using
のように記述するか、または New せずに
e.Graphics.DrawLine(Pens.Black, 20, gyousuu, 810, gyousuu)
のように、出来合いのPenを利用するようにします。

ただし、Pens や Brushes の Shared ReadOnly なプロパティ群を使って描画する場合は、
それらの Pen や Brush を破棄しないように注意してください。
(Brushes.Black 等は自分で生成したものではないため、システム側に管理を任せた方が安全です)