2009年06月24日


VB.NET : 印刷(2)

VB.NET : 印刷(1) からの続き

実際に印刷するには、イベントを登録する必要があります。
つまり、プログラマがループ処理を作成するのでは無く、
プレビューダイアログ側が、ループ処理を行い、そのループ
内で外部のメソッドを呼び出します。

その為、そのメソッドを用意してプレビューダイアログに登録する
事によって、印刷処理が可能になります。

その際、知っておくべきいくつかの専門的な要素があります。
印刷の要素
  • プリンタ用のデバイスコンテキストというものがあり、
    そこに対してグラフィック命令を出力するのが「印刷処理である」
  • 印刷には欠かせない「フォント」を用意する
  • 現在の印刷先毎に、印字可能な範囲があり、その情報を元に印字位置を決める必要がある
  • 一度呼び出されたら、1ページぶんの出力を行う
Imports System.Drawing.Printing

Public Class Form1

	' 印刷処理の実体の定義
	Private pd As PrintDocument = Nothing

	' 印刷用オブジェクトと変数
	Private pf As Font = New Font("MS 明朝", 12)
	Private prContext As System.Drawing.Graphics
	Private topMargin As Integer
	Private leftMargin As Integer

	' *******************************************************************
	' 呼び出し
	' *******************************************************************
	Private Sub Button1_Click(ByVal sender As System.Object, _
	ByVal e As System.EventArgs) Handles Button1.Click

		' 開始
		PrintPreviewDialog1.ShowDialog()

	End Sub

	' *******************************************************************
	' プレビューダイアログの初期処理
	' ( デザイナのイベントから作成します )
	' *******************************************************************
	Private Sub PrintPreviewDialog1_Load(ByVal sender As System.Object, _
	ByVal e As System.EventArgs) Handles PrintPreviewDialog1.Load

		' デスクトップ左上
		PrintPreviewDialog1.DesktopLocation = New System.Drawing.Point(0, 0)

	End Sub

	' *******************************************************************
	' 初期処理
	' *******************************************************************
	Private Sub Form1_Load(ByVal sender As System.Object, _
	ByVal e As System.EventArgs) Handles MyBase.Load

		' 印刷処理の実体の作成
		pd = New PrintDocument()
		' プレビューのプロパティにセット
		PrintPreviewDialog1.Document = pd

		' 印刷イベントをプレビューから呼び出せるように登録する
		AddHandler pd.PrintPage, AddressOf pd_PrintPage

	End Sub


	' ******************************************************
	' 実際の印刷処理
	' ******************************************************
	Private Sub pd_PrintPage(ByVal sender As System.Object, _
	ByVal e As System.Drawing.Printing.PrintPageEventArgs)

		' 左側余白
		leftMargin = e.MarginBounds.Left
		' 上側余白
		topMargin = e.MarginBounds.Top
		' 現在のコンテキストを取得
		prContext = e.Graphics

		PrString(1, "日本語表示")

		' 次のページがある場合は、True
		' ここでは、1行印字して終わり
		e.HasMorePages = False


	End Sub

	' ******************************************************
	' 文字列を指定行の先頭から印字
	' ******************************************************
	Private Sub PrString(ByVal row As Integer, ByVal str As String)

		Dim yPos As Integer = 0
		' フォントの高さで一行の高さを決定
		yPos = topMargin + (row - 1) * pf.GetHeight(prContext)
		' 印字可能な左端から文字列をセットする
		prContext.DrawString(str, pf, Brushes.Black, leftMargin, yPos)

	End Sub

End Class

■ 関連するドキュメント
Framework 標準印刷処理

posted by at 2009-06-24 18:04 | VB.NET Framework2.0 | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します