ソース掲示板




すべてから検索

キーワード   条件 表示 現行ログ 過去ログ トピックス 名前 本文

  メンテナンス 前画面に戻る

対象スレッド 件名: 【VB.NET】印刷処理サンプル
名前: lightbox
処理選択
パスワード

件名 【VB.NET】印刷処理サンプル
名前 lightbox
コメント
@HTML
<TABLE class="LboxTable" border="0" cellspacing="1" bgcolor="#000000">
<TR class="LboxTr"><TH class="LboxTh" bgcolor="#C0C0C0" nowrap></TH><TH class="LboxTh" bgcolor="#C0C0C0" nowrap>列名</TH><TH class="LboxTh" bgcolor="#C0C0C0" nowrap>型値</TH><TH class="LboxTh" bgcolor="#C0C0C0" nowrap>型定数</TH><TH class="LboxTh" bgcolor="#C0C0C0" nowrap>型名</TH><TH class="LboxTh" bgcolor="#C0C0C0" nowrap>最大桁</TH><TH class="LboxTh" bgcolor="#C0C0C0" nowrap>精度</TH><TH class="LboxTh" bgcolor="#C0C0C0" nowrap>主キー</TH><TH class="LboxTh" bgcolor="#C0C0C0" nowrap>デフォルト</TH><TH class="LboxTh" bgcolor="#C0C0C0" nowrap>型説明</TH></TR>
<TR class="LboxTr"><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>1</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>社員コード</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>130</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>adWChar</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>VARCHAR</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>4</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>1</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>Null で終了する Unicode 文字列</TD></TR>
<TR class="LboxTr"><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>2</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>氏名</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>130</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>adWChar</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>VARCHAR</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>50</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>Null で終了する Unicode 文字列</TD></TR>
<TR class="LboxTr"><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>3</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>フリガナ</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>130</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>adWChar</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>VARCHAR</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>50</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>Null で終了する Unicode 文字列</TD></TR>
<TR class="LboxTr"><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>4</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>所属</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>130</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>adWChar</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>VARCHAR</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>4</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>Null で終了する Unicode 文字列</TD></TR>
<TR class="LboxTr"><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>5</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>性別</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>3</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>adInteger</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>INT</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>10</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>4 バイトの符号付き整数</TD></TR>
<TR class="LboxTr"><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>6</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>作成日</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>7</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>adDate</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>DATETIME</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>日付値</TD></TR>
<TR class="LboxTr"><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>7</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>更新日</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>7</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>adDate</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>DATETIME</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>日付値</TD></TR>
<TR class="LboxTr"><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>8</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>給与</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>3</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>adInteger</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>INT</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>10</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>4 バイトの符号付き整数</TD></TR>
<TR class="LboxTr"><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>9</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>手当</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>3</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>adInteger</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>INT</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>10</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>4 バイトの符号付き整数</TD></TR>
<TR class="LboxTr"><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>10</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>管理者</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>130</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>adWChar</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>VARCHAR</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>4</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>Null で終了する Unicode 文字列</TD></TR>
<TR class="LboxTr"><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>11</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>生年月日</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>7</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>adDate</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>DATETIME</TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap></TD><TD class="LboxTd" bgcolor="#FFFFFF" nowrap>日付値</TD></TR>
</TABLE>

@HEND
↓ブラウザでダウンロード
http://lightbox.on.coocan.jp/r205/2008/DB_ACCESS_CLASS_PRINT.lzh

↓テスト用仮想印刷ドライバ( PrimoPDF )
http://www.xlsoft.com/jp/products/primopdf/index.html

↓改造用帳表設計書
http://winofsql.sakura.ne.jp/doc/excel/print_spec.xls

↓印刷で使用している画像
http://lightbox.on.coocan.jp/image/title.png

http://lightbox.cocolog-nifty.com/photos/app/printsample2.jpg


↓B4 設定
@DIV
pd.DefaultPageSettings.PaperSize = New PaperSize("B4", 1012, 1433)
@END

↓画像と横罫線メソッド
@DIV
' ******************************************************
' 横罫線を行の真ん中に引く
' ******************************************************
Private Sub PrHline(ByVal row As Integer, ByVal x As Integer, _
ByVal size As Integer)

	Dim yPos As Integer = 0
	yPos = _
	  topMargin + (row - 1) * pf.GetHeight(prContext) + _
	   pf.GetHeight(prContext) / 2
	prContext.DrawLine(Pens.Black, _
	 leftMargin + x, _
	 yPos, _
	 leftMargin + x + size, _
	 yPos)

End Sub

' ******************************************************
' 画像
' ******************************************************
Private Sub PrImage(ByVal title As Image, ByVal row As Integer, _
   ByVal x As Integer, ByVal offset As Integer)

	Dim yPos As Integer = 0
	yPos = topMargin + (row - 1) * pf.GetHeight(prContext)
	prContext.DrawImage(title, x + leftMargin, yPos + offset)

End Sub
@END

↓画像と横罫線の呼び出し
@DIV
PrImage(title, 1, 100, -4)
PrHline(4, 0, 800)
@END


@DIV
' /////////////////////////////////////////////////////////////////////
' 印刷処理
' /////////////////////////////////////////////////////////////////////
Imports System.Drawing.Printing
Imports lightbox.control

Partial Class MAIN

	' 印刷処理の実体
	Private pd As New PrintDocument()
	' 印刷用フォント( 文書は指定がなければ明朝 )
	Public pf As Font = New Font("MS 明朝", 12)
	' 1ページに印刷可能な行数
	Private pMax As Integer = 20
	' ページカウンタ
	Private pCnt As Integer = -1
	' /////////////////////////////////////////
	' ※※※ 次に印字する行 ※※※
	' /////////////////////////////////////////
	Private pRow As Integer = Nothing

	' 印刷用の SQL
	Private Query As String = ""

	' ページの情報
	Private topMargin As Integer
	Private leftMargin As Integer
	Private prContext As System.Drawing.Graphics
	Private title As Image = New Bitmap("..\..\title.png")

	' ******************************************************
	' 印刷の呼び出し
	' ******************************************************
	Private Sub 印刷ToolStripMenuItem_Click(ByVal sender As System.Object, _
	 ByVal e As System.EventArgs) Handles 印刷ToolStripMenuItem.Click

		' 初回のみの処理
		If pRow = Nothing Then
			pRow = 0
			AddHandler pd.PrintPage, AddressOf pd_PrintPage
			preview.Document = pd
		End If

		' ダイアログの大きさ
		preview.Width = 800
		preview.Height = 600

		' 倍率
		preview.PrintPreviewControl.Zoom = 1

		' DB 接続
		If Not db.Connect() Then
			MessageBox.Show("DB接続に失敗しました    ", _
			"エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)
			Return
		End If

		' ///////////////////////////////
		' 開始
		' ///////////////////////////////
		' 【印刷設定】横向き
		pd.DefaultPageSettings.Landscape = True
		' 【印刷設定】マージン
		pd.DefaultPageSettings.Margins = New Margins(20, 20, 20, 20)
		'pd.DefaultPageSettings.PaperSize = New PaperSize("B4", 1012, 1433)

		Query = "select 社員コード,氏名,フリガナ,所属,性別,作成日,更新日"
		Query += ",iif(isnull(給与),0,給与) as 給与,iif(isnull(手当),0,手当) as 手当"
		Query += ",管理者,生年月日 from 社員マスタ"

		Try
			preview.ShowDialog()
		Catch ex As Exception
			LboxText.MessageOk("Windows の印刷サービスが起動しているか確認して下さい")
			Application.Exit()
		End Try

		db.Close()

	End Sub


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

		' ページ内で印字可能な行数
		Dim linesPerPage As Integer = 0
		' 印字する為の y 座標
		Dim yPos As Integer = 0
		' 左側余白
		leftMargin = e.MarginBounds.Left
		' 上側余白
		topMargin = e.MarginBounds.Top
		prContext = e.Graphics

		' 余白を除いた高さをフォントの高さで割る
		linesPerPage = e.MarginBounds.Height / pf.GetHeight(e.Graphics)


		' 初回のみ select 実行
		If pCnt = -1 Then
			If Not db.QueryAndRead(Query) Then
				db.Close()
				PrString(1, 0, "対象データが存在しませんでした")
				e.HasMorePages = False
				Return
			End If
			pCnt = 0
		End If

		' ******************************************************
		' ページのタイトル
		' ******************************************************
		pCnt += 1

		' 画像をタイトルとして印字
		PrImage(title, 1, 100, -4)
		' ページカウンタ
		PrString(1, 700, "page:" + pCnt.ToString())
		' 列タイトル
		PrString(3, 0, "CD")
		PrString(3, 40, "氏名")
		PrString(3, 140, "フリガナ")
		PrString(3, 320, "     給与")
		PrString(3, 400, "     手当")
		' 横罫線
		PrHline(4, 0, 800)
		pRow = 5

		' ******************************************************
		' ページの明細
		' ******************************************************
		Do While pRow <= pMax
			PrString(pRow, 0, db.GetValue("社員コード"))
			PrString(pRow, 40, db.GetValue("氏名"))
			PrString(pRow, 140, db.GetValue("フリガナ"))
			PrString(pRow, 320, NumberFormat(db.GetValue("給与"), 9))
			PrString(pRow, 400, NumberFormat(db.GetValue("手当"), 9))
			If Not db.Read() Then
				' 全てのページが終了
				e.HasMorePages = False
				pCnt = -1	' 次に備えて、ページの初期化
				Return
			End If
			' 1 行カウントアップ
			pRow += 1
		Loop

		' ******************************************************
		' 次のページの準備
		' ******************************************************
		' 次ページ有り
		e.HasMorePages = True


	End Sub

	' ******************************************************
	' 文字列を指定位置から印字
	' ******************************************************
	Private Sub PrString(ByVal row As Integer, ByVal x 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 + x, yPos)

	End Sub

	' ******************************************************
	' 数値編集 + 右寄せ用のサイズ指定
	' ******************************************************
	Private Function NumberFormat(ByVal num As Integer, _
	ByVal size As Integer) As String

		Dim ret As String = String.Format("{0:#,0}", num)
		ret = ret.PadLeft(size)
		Return ret

	End Function

	' ******************************************************
	' 横罫線を行の真ん中に引く
	' ******************************************************
	Private Sub PrHline(ByVal row As Integer, ByVal x As Integer, _
	ByVal size As Integer)

		Dim yPos As Integer = 0
		yPos = _
		  topMargin + (row - 1) * pf.GetHeight(prContext) + _
		   pf.GetHeight(prContext) / 2
		prContext.DrawLine(Pens.Black, _
		 leftMargin + x, _
		 yPos, _
		 leftMargin + x + size, _
		 yPos)

	End Sub

	' ******************************************************
	' 画像
	' ******************************************************
	Private Sub PrImage(ByVal title As Image, ByVal row As Integer, _
	   ByVal x As Integer, ByVal offset As Integer)

		Dim yPos As Integer = 0
		yPos = topMargin + (row - 1) * pf.GetHeight(prContext)
		prContext.DrawImage(title, x + leftMargin, yPos + offset)

	End Sub

End Class
@END