pd.DefaultPageSettings.PaperSize = New PaperSize("B4", 1012, 1433)
↓画像と横罫線メソッド
拡張子:
' ******************************************************' 横罫線を行の真ん中に引く' ******************************************************
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
↓画像と横罫線の呼び出し
拡張子:
PrImage(title, 1, 100, -4)
PrHline(4, 0, 800)
拡張子:
' /////////////////////////////////////////////////////////////////////' 印刷処理' /////////////////////////////////////////////////////////////////////
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