- 日時: 2011/04/05 11:01
- 名前: 花ちゃん
- ***********************************************************************************
* カテゴリー:[印刷関係][][] * * キーワード:改ページ処理,,,,, * ***********************************************************************************
----------------------------------------------------------------------------------- Re: 改ページしても1枚の紙に印刷さ.. - 魔界の仮面弁士 2005/07/20-16:13 No.1917 ----------------------------------------------------------------------------------- # う。既に回答が付いていたようで……。でも、折角書いたので投稿しておこう。(^^;
> VB4.0 を少しやっていましたが、まったくの初心者です。
VB.NETの印刷処理は、VB4の時とは全く異なります。
そもそも、VB.NET においては、 PrintPreviewDialog1.Document = PrintDocument1 PrintPreviewDialog1.ShowDialog() のような処理によって、 Private Sub PrintDocument1_PrintPage〜〜〜 というイベントが呼び出される、という点までは理解されていますでしょうか。
まず、[PrintDocument] が、印刷処理の核となるオブジェクトです。 このオブジェクトの『PrintPageイベント』に、印刷内容を描画するための 処理を記述する事になります。
この PrintDocumentオブジェクトを、[PrintPreviewDialog] に割り当てれば、 印刷プレビュー画面が表示されますし、[PrintPreviewControl]に割り当てれば、 フォーム上にてプレビューを行うことができます。
そして、この『PrintPageイベント』は、印刷の各ページごとに呼び出されます。 また、PrintPageイベント内で『e.HasMorePages』を設定している部分が、 PrintDocumentに、改ページを指示する処理に当たります。
e.HasMorePages = True とすれば、『まだ、印刷したページが残っているので、 もう一回、PrintPageイベントを処理してください』という意味になりますし、 e.HasMorePages = False とすれば、『もう、印刷するページは残っていない』 という意味になります。
たとえば、VB4 で 3ページの文書を印刷する場合は、 Private Sub Command1_Click() Printer.Print "1ページ目" Printer.NewPage '改ページ Printer.Print "2ページ目" Printer.NewPage '改ページ Printer.Print "3ページ目" Printer.EndDoc '描画終了→印刷開始 End Sub のように、1回の呼び出しで、3ページ分の印刷処理を行っていました。
しかし、VB.NETの場合は異なります。 3ページの文書を印刷するなら、PrintPage自体が 3 回呼ばれます。 1回のPrintPageイベントで、3ページ分の印刷処理を行うわけではありません。
最初の1回目のPrintPageイベントの呼び出しでは、1ページ目の描画処理を 行う事になります。この時、「e.HasMorePages = True」と指定することで、 『まだページが残っているので、もう一回、イベントを呼び出してください』 という指示が送られる事になります。
これにより、2回目のPrintPageイベントの呼び出しが発生します。 ここで、2ページ目の描画処理を行います。さらに、3ページ目のデータを 印刷させるために、もう一度「e.HasMorePages = True」と指定しておきます。
3回目のPrintPageイベントの呼び出しが、最後の3ページ目の印刷処理です。 最後のページなので、今度は「e.HasMorePages = False」と指定し、印刷完了です。
> 行間隔を7oとって、20行で改ページのつもりなんですが、1枚の紙に2度打 > ちされるばかりです。 2度打ちされるのは、1回のイベントで、複数ページを印刷しようとしているからでしょうね。 上記に書いたように、1回のイベントでは、1ページ分の印刷処理だけを記述するようにします。
もし、ページ辺りの行数を20行にして印刷したいなら、たとえば、こんな感じでしょうか。
下記は、TextBox1の内容を印刷するサンプルです。 処理の流れがわかる様に、ページ数と行番号も印刷してみました。 # 折り返し・余白・行間等の制御は行っていません。細かい点は、適宜、書き換えてください。
Private Const MaxLine As Short = 20 Private CurrentPage As Short Private CurrentLine As Short Private TextLines() As String
Private Sub Button1_Click(ByVal sender As Object, _ ByVal e As EventArgs) Handles Button1.Click TextLines = TextBox1.Lines PrintPreviewDialog1.Document = PrintDocument1 CurrentLine = 0 CurrentPage = 0 PrintPreviewDialog1.ShowDialog() End Sub
Private Sub PrintDocument1_PrintPage(ByVal sender As Object, _ ByVal e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage Dim g As Graphics = e.Graphics g.PageUnit = GraphicsUnit.Point e.HasMorePages = True CurrentPage += 1 g.DrawString(CStr(CurrentPage) & "ページ", Me.Font, Brushes.Blue, 1, 1) For Line As Short = 1 To MaxLine CurrentLine += 1 If CurrentLine > UBound(TextLines) Then '全てのデータを印刷し終わった場合 e.HasMorePages = False Exit For Else g.DrawString(CStr(CurrentLine) & ": " & TextLines(CurrentLine), _ Me.Font, Brushes.Black, 20, Line * 20) End If Next End Sub
|