うおー。前からまとめてやろうと思ってたんですが、
使ったこと無い上に一気に何個もはじめて使うのはきついー。
MSDN 読むだけでつかれたー。
作ったのはいつも通りごくごく簡単なやつです。
画面を表示したときにインストールされてるプリンタの一覧をセットして
通常使うプリンタを選択し、そのプリンタがサポートする用紙の一覧をセットする。
あとは印刷したり余白かえたり、プレビューしたり、印刷したり。
ぐはー。
■参考文献
PageSetupDialog クラス
PrintDialog クラス
PrintDialog.UseEXDialog Property
PrintDocument クラス
PrintPreviewControl クラス
PrintPreviewDialog クラス
PageSettings クラス
PrinterSettings クラス
Windows フォームにおける印刷のサポート
Windows の通常使うプリンタを取得および設定する方法
■実行画像
とりあえず、PrintPreviewControl

とりあえず、PageSetUpDialog

PageSetUpDialog から プリンタの設定ボタンを押下して出てきた画面。ここのヘルプボタンってどうやって捉えるんだろ?

つぎ、PrintPreviewDialog

さいご、PrintDialog

Imports System.Runtime.InteropServices
Public Class PrintTest
' 現在のページ数
Private m_currentPage As Integer = 0
' 通常使うプリンタを取得
<DllImport("winspool.drv", CharSet:=CharSet.Auto)> _
Private Shared Function GetDefaultPrinter(ByVal pszBuffer As System.Text.StringBuilder, _
ByRef size As Integer) As Boolean
End Function
Private Sub PrintTest_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' 通常使うプリンタを取得する
Dim pszBuffer As System.Text.StringBuilder = New System.Text.StringBuilder(256)
Dim size As Integer = pszBuffer.Capacity
Dim defaultPrinterName As String = String.Empty
If GetDefaultPrinter(pszBuffer, size) Then
defaultPrinterName = pszBuffer.ToString()
End If
'' インストールされているプリンタを ComboBox1 にセットする
With Me.ComboBox1
.DropDownStyle = ComboBoxStyle.DropDownList
For Each printerName As String In System.Drawing.Printing.PrinterSettings.InstalledPrinters
.Items.Add(printerName)
Next
' 通常使うプリンタを選択
If defaultPrinterName <> String.Empty Then .SelectedItem = defaultPrinterName
End With
'' 用紙サイズの一覧をセット
Me.SetPaperSizes()
' デフォルトの用紙サイズを指定
Me.ComboBox2.SelectedItem = Me.PrintDocument1.DefaultPageSettings.PaperSize.PaperName
'' 印刷するドキュメント
AddHandler PrintDocument1.PrintPage, AddressOf Me.PrintPage
' 余白の指定(インチ指定)
Me.PrintDocument1.DefaultPageSettings.Margins = New System.Drawing.Printing.Margins(10, 10, 10, 10)
Me.PrintDocument1.DocumentName = "中さん・ふじこ・えでん"
'' PrintPreviewControl の設定
With Me.PrintPreviewControl1
.Document = Me.PrintDocument1
.AutoZoom = True
' 複数ページある時の 1 列・1 行あたりの数
.Columns = 2
.Rows = 2
' 開始ページ
.StartPage = 1
' アンチエイリアシング機能を使うか否か
.UseAntiAlias = True
End With
End Sub
Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
Me.SetPaperSizes()
Me.SetPrinterAndPaperSize()
End Sub
Private Sub ComboBox2_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox2.SelectedIndexChanged
Me.SetPrinterAndPaperSize()
End Sub
'' PageSetupDialog
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
With Me.PageSetupDialog1
.Document = Me.PrintDocument1
.PrinterSettings = Me.PrintDocument1.PrinterSettings
.PageSettings = Me.PrintDocument1.DefaultPageSettings
' 余白の変更を許可するか否か
.AllowMargins = True
' 印刷の向きの変更を許可するか否か
.AllowOrientation = True
' 給紙の変更を許可するか否か
.AllowPaper = True
' プリンタの変更を許可するか否か
.AllowPrinter = True
' インチ指定ではなくメートル法を使うか否か
.EnableMetric = System.Globalization.RegionInfo.CurrentRegion.IsMetric
' 各余白の最小値(インチ指定)
.MinMargins = New System.Drawing.Printing.Margins(10, 10, 10, 10)
' ヘルプボタンを表示するか否か
.ShowHelp = True
AddHandler .HelpRequest, AddressOf Me.HelpRequest
' ページ設定→プリンタの設定で[ネットワーク]ボタンを表示するか否か
.ShowNetwork = True
End With
If Me.PageSetupDialog1.ShowDialog(Me) = Windows.Forms.DialogResult.OK Then
If Me.ComboBox1.SelectedText <> Me.PageSetupDialog1.PrinterSettings.PrinterName Then
Me.ComboBox1.SelectedItem = Me.PageSetupDialog1.PrinterSettings.PrinterName
End If
If Me.ComboBox2.SelectedItem.ToString() <> Me.PageSetupDialog1.PageSettings.PaperSize.PaperName Then
Me.ComboBox2.SelectedItem = Me.PageSetupDialog1.PageSettings.PaperSize.PaperName
End If
End If
End Sub
'' PrintPreviewDialog
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
' ページ数をリセット
Me.m_currentPage = 0
With PrintPreviewDialog1
.Document = Me.PrintDocument1
' アイコンを表示するか否か
.ShowIcon = True
.Width = 500
.Height = 500
.UseAntiAlias = True
End With
Me.PrintPreviewDialog1.ShowDialog(Me)
End Sub
'' PrintDialog
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
With Me.PrintDialog1
' [現在のページ]オプションボタンを表示するか否か
.AllowCurrentPage = True
' [ファイルへ出力]チェックボックスを表示するか否か
.AllowPrintToFile = True
' [ファイルへ出力]チェックボックスの値
.PrintToFile = False
' [選択した部分]を表示するか否か
.AllowSelection = True
' [ページ指定]を表示するか否か
.AllowSomePages = True
.Document = Me.PrintDocument1
.PrinterSettings = Me.PrintDocument1.PrinterSettings
' ヘルプボタンを表示するか否か。UseEXDialog を True にすると Win2000 以前は無視されるらしい
' でも XPSP2 でも無視された?
.ShowHelp = True
AddHandler .HelpRequest, AddressOf Me.HelpRequest
' [ネットワーク]ボタンを表示するか否か。UseEXDialog を True にすると Win2000 以前は無視されるらしい
' でも XPSP2 でも無視された?
' UseEXDialog に関係なく表示されないんですけど...?
.ShowNetwork = True
' Windows XP style で表示するか否からしい(規定値:True)
' http://msdn2.microsoft.com/en-US/library/system.windows.forms.printdialog.useexdialog.aspx
.UseEXDialog = False
End With
If Me.PrintDialog1.ShowDialog(Me) = Windows.Forms.DialogResult.OK Then
' ページ数をリセット
Me.m_currentPage = 0
Me.PrintDocument1.Print()
End If
End Sub
' 描画処理
Private Sub PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs)
Me.m_currentPage += 1
Select Case Me.m_currentPage
Case 1
e.Graphics.DrawImage(My.Resources.中さん, e.MarginBounds)
e.HasMorePages = True ' 次のページあり
Case 2
e.Graphics.DrawImage(My.Resources.ふじこちゃん, e.MarginBounds)
e.HasMorePages = True ' 次のページあり
Case 3
e.Graphics.DrawImage(My.Resources.えでんさん, e.MarginBounds)
e.HasMorePages = True ' 次のページあり
Case 4
e.Graphics.DrawString("これでおわりですよー", Me.Font, Brushes.Red, 100.0F, 100.0F)
e.HasMorePages = False ' 次のページなし
End Select
End Sub
' 用紙サイズの一覧を ComboBox2 にセット
Private Sub SetPaperSizes()
Dim ps As System.Drawing.Printing.PrinterSettings = Me.GetPrinterSettings()
With Me.ComboBox2
.Items.Clear()
.DropDownStyle = ComboBoxStyle.DropDownList
For Each paperSize As System.Drawing.Printing.PaperSize In ps.PaperSizes
.Items.Add(paperSize.PaperName)
Next
.SelectedIndex = 0
End With
End Sub
' ComboBox1 の選択値を PrinterSettings 型に変換して返却
Private Function GetPrinterSettings() As System.Drawing.Printing.PrinterSettings
Dim ps As System.Drawing.Printing.PrinterSettings = New System.Drawing.Printing.PrinterSettings()
ps.PrinterName = DirectCast(Me.ComboBox1.SelectedItem, String)
Return ps
End Function
' ComboBox で選択した値を PrintDocument にセット
Private Sub SetPrinterAndPaperSize()
Dim printerSettings As System.Drawing.Printing.PrinterSettings = Me.GetPrinterSettings()
Dim paperSize As System.Drawing.Printing.PaperSize = Nothing
For Each ps As System.Drawing.Printing.PaperSize In printerSettings.PaperSizes
If ps.PaperName = DirectCast(Me.ComboBox2.SelectedItem, String) Then
paperSize = New System.Drawing.Printing.PaperSize(ps.PaperName, ps.Width, ps.Height)
Exit For
End If
Next
With Me.PrintDocument1
.PrinterSettings = Me.GetPrinterSettings()
.DefaultPageSettings.PaperSize = paperSize
End With
End Sub
Private Sub HelpRequest(ByVal sender As Object, ByVal e As EventArgs)
MessageBox.Show("sender:" & sender.ToString() & " HelpRequest")
End Sub
End Class