|
【Amazon ランキング:ゲーム - Wii U】
|
|
前回プリンタダイアログを使った印刷の仕方を紹介しましたが、実はあのダイアログで部数の部単位で印刷のチェックをつけてもプリンタ設定情報に反映されないことに気づかれたことと思います。
簡単にプリンタ設定ができる点はいいのですがきちんと機能しない部分があるのはちょといただけません。
そこで、標準のプリンタダイアログと同等の機能をもった印刷画面を作ってみようと思います。 |
|
プリンタの列挙 |
まずはパソコンにインストールしてあるプリンタをコンボボックスに列挙してみましょう。インストールしてあるプリンタは PrinterSettings.InstalledPrinters
コレクションを参照することで取得できます。
[VB]
Me.comboPrinter.Items.Clear()
For Each prt As String In PrinterSettings.InstalledPrinters
Me.comboPrinter.Items.Add(prt)
Next
[C#]
this.comboPrinter.Items.Clear();
foreach( string prt in PrinterSettings.InstalledPrinters )
{
this.comboPrinter.Items.Add(prt);
}
|
プリンタのプロパティ表示 |
プリンタのプロパティを表示するメソッドは残念ながら .NET コンポーネントにありません。そこで DllImport でAPIを定義して呼び出すことになります。
[VB]
<DllImport("winspool.drv", EntryPoint:="OpenPrinterW", _
SetLastError:=True, CharSet:=CharSet.Unicode, _
ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
Private Shared Function OpenPrinter(ByVal pPrinterName As String, _
ByRef phPrinter As IntPtr, ByVal pDefault As IntPtr) As Boolean
End Function
<DllImport("winspool.drv", EntryPoint:="ClosePrinter", _
SetLastError:=True, CharSet:=CharSet.Unicode, _
ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
Private Shared Function ClosePrinter(ByVal hPrinter As IntPtr) As Boolean
End Function
<DllImport("winspool.drv", EntryPoint:="DocumentPropertiesW", _
SetLastError:=True, CharSet:=CharSet.Unicode, _
ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
Private Shared Function DocumentProperties(ByVal hWnd As IntPtr, ByVal hPrinter As IntPtr, _
<MarshalAs(UnmanagedType.LPTStr)> ByVal pDeviceName As String, _
ByVal pDevModeOutput As IntPtr, ByVal pDevModeInput As IntPtr, _
ByVal fMode As Integer) As Integer
End Function
[C#]
[DllImport("winspool.drv", EntryPoint = "OpenPrinterW",
SetLastError = true, CharSet = CharSet.Unicode,
ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
private static extern bool OpenPrinter(string pPrinterName,
out IntPtr phPrinter, IntPtr pDefault);
[DllImport("winspool.drv", EntryPoint = "ClosePrinter",
SetLastError = true, CharSet = CharSet.Unicode,
ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
private static extern bool ClosePrinter(IntPtr hPrinter);
[DllImport("winspool.drv", EntryPoint = "DocumentPropertiesW",
SetLastError = true, CharSet = CharSet.Unicode,
ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
static extern int DocumentProperties(IntPtr hwnd, IntPtr hPrinter,
[MarshalAs(UnmanagedType.LPWStr)] string pDeviceName,
IntPtr pDevModeOutput, IntPtr pDevModeInput, int fMode);
上記のようにAPIを定義した後 OpenPrinter ⇒ DocumentProperties ⇒ ClosePrinter の順でAPIを呼び出します。
詳しいな使い方は下記のソースコードを見てください。
|
印刷ダイアログの作成 |
|
印刷用画面を左のように作成します。
ComboBox:[comboPrinter]
|
DropDownStyle |
DropDownList |
Button:[buttonProperty]
Button:[buttonOk]
Button:[buttonCancel]
RadioButton:[radioAll]
RadioButton:[radioCurrent]
RadioButton:[radioSome]
RadioButton:[radioSelect]
NumericUpDown:[updownFrom]
NumericUpDown:[updownTo] NumericUpDown:[updownCopy]
ChecBox:[checkCollate]
|
|
VB[PrinterForm.vb] |
Imports System.Runtime.InteropServices
Imports System.Drawing.Printing
Public Class PrinterForm
' 指定されたプリンタまたはプリントサーバーを識別するハンドルを取得します。
<DllImport("winspool.drv", EntryPoint:="OpenPrinterW", _
SetLastError:=True, CharSet:=CharSet.Unicode, _
ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
Private Shared Function OpenPrinter(ByVal pPrinterName As String, _
ByRef phPrinter As IntPtr, ByVal pDefault As IntPtr) As Boolean
End Function
' 特定のプリンタオブジェクトをクローズします。
<DllImport("winspool.Drv", EntryPoint:="ClosePrinter", _
SetLastError:=True, CharSet:=CharSet.Unicode, _
ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
Private Shared Function ClosePrinter(ByVal hPrinter As IntPtr) As Boolean
End Function
' 特定のプリンタのプリンタ設定プロパティシートを表示します。
<DllImport("winspool.Drv", EntryPoint:="DocumentPropertiesW", _
SetLastError:=True, CharSet:=CharSet.Unicode, _
ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> _
Private Shared Function DocumentProperties(ByVal hWnd As IntPtr, _
ByVal hPrinter As IntPtr, _
<MarshalAs(UnmanagedType.LPTStr)> ByVal pDeviceName As String, _
ByVal pDevModeOutput As IntPtr, ByVal pDevModeInput As IntPtr, _
ByVal fMode As Integer) As Integer
End Function
' fMode 設定値
Private Const DM_OUT_BUFFER As Integer = &H2
Private Const DM_PROMPT As Integer = &H4
Private Const DM_IN_PROMPT As Integer = DM_PROMPT
Private Const DM_IN_BUFFER As Integer = &H8
' メンバ変数
Private _printDoc As PrintDocument = Nothing
' プリンタドキュメントプロパティ
Public Property Document() As PrintDocument
Get
Return _printDoc
End Get
Set(ByVal value As PrintDocument)
_printDoc = value
End Set
End Property
' プリンタセッティングプロパティ
Public ReadOnly Property PrinterSettings() As PrinterSettings
Get
Return _printDoc.PrinterSettings
End Get
End Property
' フォームロード処理
Private Sub PrinterForm_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Load
' 印刷範囲の設定
Me.radioAll.Checked = True
Me.updownFrom.Enabled = False
Me.updownTo.Enabled = False
' ページ範囲の設定
If _printDoc.PrinterSettings.MinimumPage > 0 Then
Me.updownFrom.Minimum = _printDoc.PrinterSettings.MinimumPage
Me.updownTo.Minimum = _printDoc.PrinterSettings.MinimumPage
Else
Me.updownFrom.Minimum = 1
Me.updownTo.Minimum = 1
End If
If _printDoc.PrinterSettings.MaximumPage > 0 Then
Me.updownFrom.Maximum = _printDoc.PrinterSettings.MaximumPage
Me.updownTo.Maximum = _printDoc.PrinterSettings.MaximumPage
Else
Me.updownFrom.Maximum = 100
Me.updownTo.Maximum = 100
End If
If _printDoc.PrinterSettings.FromPage > 0 Then
Me.updownFrom.Value = _printDoc.PrinterSettings.FromPage
Else
Me.updownFrom.Value = 1
End If
If _printDoc.PrinterSettings.ToPage > 0 Then
Me.updownTo.Value = _printDoc.PrinterSettings.ToPage
Else
Me.updownTo.Value = 1
End If
' 部数の設定
updownCopy.Minimum = 1
If _printDoc.PrinterSettings.MaximumCopies > 1 Then
updownCopy.Maximum = _printDoc.PrinterSettings.MaximumCopies
Else
updownCopy.Maximum = 100
End If
updownCopy.Value = 1
' プリンタ一覧をコンボボックスに設定する
Me.comboPrinter.Items.Clear()
For Each prt As String In PrinterSettings.InstalledPrinters
Me.comboPrinter.Items.Add(prt)
Next
Me.comboPrinter.SelectedIndex = 0
End Sub
' プリンタコンボボックス選択イベント
Private Sub comboPrinter_SelectedIndexChanged(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles comboPrinter.SelectedIndexChanged
' プリンタ名設定
_printDoc.PrinterSettings.PrinterName = Me.comboPrinter.Text
End Sub
' プロパティボタンクリックイベント処理
Private Sub buttonProperty_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles buttonProperty.Click
Dim devModeIn As IntPtr = IntPtr.Zero
Dim devModeOut As IntPtr = IntPtr.Zero
Dim hPrinter As IntPtr = IntPtr.Zero
Try
Dim printerName As String = _printDoc.PrinterSettings.PrinterName
' グローバルメモリオブジェクトをロックします。
devModeIn = Marshal.AllocHGlobal(_printDoc.PrinterSettings.GetHdevmode())
devModeOut = Marshal.AllocHGlobal(_printDoc.PrinterSettings.GetHdevmode())
'プリンタのハンドルを取得
If Not OpenPrinter(printerName, hPrinter, IntPtr.Zero) Then
Exit Sub
End If
' プリンタの設定画面表示
If DocumentProperties(Me.Handle, hPrinter, printerName, _
devModeOut, devModeIn, DM_IN_PROMPT Or DM_IN_BUFFER Or DM_OUT_BUFFER) = 1 Then
' OKボタンがクリックされた場合
_printDoc.PrinterSettings.SetHdevmode(devModeOut)
Else
Exit Sub
End If
Finally
' グロバールメモリ開放
Marshal.FreeHGlobal(devModeIn)
Marshal.FreeHGlobal(devModeOut)
ClosePrinter(hPrinter)
End Try
End Sub
' ラジオボタンクリックイベント処理
Private Sub radioButton_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles radioAll.CheckedChanged, _
radioCurrent.CheckedChanged, _
radioSome.CheckedChanged, _
radioSelect.CheckedChanged
' ページ指定が選ばれている場合
If radioSome.Checked Then
updownFrom.Enabled = True
updownTo.Enabled = True
Else
updownFrom.Enabled = False
updownTo.Enabled = False
End If
End Sub
' OKボタンクリックイベント処理
Private Sub buttonOk_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles buttonOk.Click
' ページ情報を設定
Select Case True
Case Me.radioAll.Checked
_printDoc.PrinterSettings.PrintRange = PrintRange.AllPages
Case Me.radioCurrent.Checked
_printDoc.PrinterSettings.PrintRange = PrintRange.CurrentPage
Case Me.radioSome.Checked
' 範囲のチェック
If Me.updownFrom.Value > Me.updownTo.Value Then
MessageBox.Show("ページの範囲をFrom < To となるように指定してください", _
Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning)
Exit Sub
End If
_printDoc.PrinterSettings.PrintRange = PrintRange.SomePages
_printDoc.PrinterSettings.FromPage = Me.updownFrom.Value
_printDoc.PrinterSettings.ToPage = Me.updownTo.Value
Case Me.radioSelect.Checked
_printDoc.PrinterSettings.PrintRange = PrintRange.Selection
End Select
_printDoc.PrinterSettings.Copies = updownCopy.Value
_printDoc.PrinterSettings.Collate = checkCollate.Checked
Me.DialogResult = Windows.Forms.DialogResult.OK
Me.Close()
End Sub
' キャンセルボタンクリックイベント処理
Private Sub buttonCancel_Click_1(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles buttonCancel.Click
Me.DialogResult = Windows.Forms.DialogResult.Cancel
Me.Close()
End Sub
End Class
|
|
C#[PrinterForm.cs] |
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Printing;
using System.Runtime.InteropServices;
namespace Print_CS
{
public partial class PrinterForm : Form
{
// 指定されたプリンタまたはプリントサーバーを識別するハンドルを取得します。
[DllImport("winspool.drv", EntryPoint = "OpenPrinterW",
SetLastError = true, CharSet = CharSet.Unicode,
ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
private static extern bool OpenPrinter(string pPrinterName,
out IntPtr phPrinter, IntPtr pDefault);
// 特定のプリンタオブジェクトをクローズします。
[DllImport("winspool.drv", EntryPoint = "ClosePrinter",
SetLastError = true, CharSet = CharSet.Unicode,
ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
private static extern bool ClosePrinter(IntPtr hPrinter);
// 特定のプリンタのプリンタ設定プロパティシートを表示します。
[DllImport("winspool.drv", EntryPoint = "DocumentPropertiesW",
SetLastError = true, CharSet = CharSet.Unicode,
ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
static extern int DocumentProperties(IntPtr hwnd, IntPtr hPrinter,
[MarshalAs(UnmanagedType.LPWStr)] string pDeviceName,
IntPtr pDevModeOutput, IntPtr pDevModeInput, int fMode);
// fMode 設定値
private const int DM_OUT_BUFFER = 0x2;
private const int DM_PROMPT = 0x4;
private const int DM_IN_PROMPT = DM_PROMPT;
private const int DM_IN_BUFFER = 0x8;
public PrinterForm()
{
InitializeComponent();
// ラジオボタンのクリックイベントをひとつにまとめる
this.radioAll.Click += new EventHandler(radioButton_Click);
this.radioCurrent.Click += new EventHandler(radioButton_Click);
this.radioSome.Click += new EventHandler(radioButton_Click);
this.radioSelect.Click += new EventHandler(radioButton_Click);
}
// メンバ変数
private PrintDocument _printDoc = null;
// プリンタドキュメントプロパティ
public PrintDocument Document
{
get { return _printDoc; }
set { _printDoc = value; }
}
// プリンタセッティングプロパティ
public PrinterSettings PrinterSettings
{
get { return _printDoc.PrinterSettings; }
}
// フォームロード処理
private void PrinterForm_Load(object sender, EventArgs e)
{
// 印刷範囲の設定
this.radioAll.Checked = true;
this.updownFrom.Enabled = false;
this.updownTo.Enabled = false;
// ページ範囲の設定
if (_printDoc.PrinterSettings.MinimumPage > 0)
{
this.updownFrom.Minimum = _printDoc.PrinterSettings.MinimumPage;
this.updownTo.Minimum = _printDoc.PrinterSettings.MinimumPage;
}
else
{
this.updownFrom.Minimum = 1;
this.updownTo.Minimum = 1;
}
if (_printDoc.PrinterSettings.MaximumPage > 0)
{
this.updownFrom.Maximum = _printDoc.PrinterSettings.MaximumPage;
this.updownTo.Maximum = _printDoc.PrinterSettings.MaximumPage;
}
else
{
this.updownFrom.Maximum = 100;
this.updownTo.Maximum = 100;
}
if (_printDoc.PrinterSettings.FromPage > 0)
{
this.updownFrom.Value = _printDoc.PrinterSettings.FromPage;
}
else
{
this.updownFrom.Value = 1;
}
if (_printDoc.PrinterSettings.ToPage > 0)
{
this.updownTo.Value = _printDoc.PrinterSettings.ToPage;
}
else
{
this.updownTo.Value = 1;
}
// 部数の設定
updownCopy.Minimum = 1;
if (_printDoc.PrinterSettings.MaximumCopies > 1)
{
updownCopy.Maximum = _printDoc.PrinterSettings.MaximumCopies;
}
else
{
updownCopy.Maximum = 100;
}
// プリンタ一覧をコンボボックスに設定する
this.comboPrinter.Items.Clear();
foreach (string prt in PrinterSettings.InstalledPrinters)
{
this.comboPrinter.Items.Add(prt);
}
this.comboPrinter.SelectedIndex = 0;
}
// プリンタコンボボックス選択イベント
private void comboPrinter_SelectedIndexChanged(object sender, EventArgs e)
{
// プリンタ名設定
_printDoc.PrinterSettings.PrinterName = this.comboPrinter.Text;
}
// プロパティボタンクリックイベント処理
private void buttonProperty_Click(object sender, EventArgs e)
{
// プリンタ名
string printerName = _printDoc.PrinterSettings.PrinterName;
IntPtr devModeIn = IntPtr.Zero;
IntPtr devModeOut = IntPtr.Zero;
IntPtr hPrinter = IntPtr.Zero;
try
{
// グローバルメモリオブジェクトをロックします。
devModeIn = Marshal.AllocHGlobal(_printDoc.PrinterSettings.GetHdevmode());
devModeOut = Marshal.AllocHGlobal(_printDoc.PrinterSettings.GetHdevmode());
//プリンタのハンドルを取得
if (!OpenPrinter(printerName, out hPrinter, IntPtr.Zero))
{
return;
}
// プリンタの設定画面表示
if (DocumentProperties(this.Handle, hPrinter, printerName,
devModeOut, devModeIn, DM_IN_PROMPT | DM_IN_BUFFER | DM_OUT_BUFFER) == 1)
{
// OKボタンがクリックされた場合
_printDoc.PrinterSettings.SetHdevmode(devModeOut);
}
else
{
return;
}
}
finally
{
// グロバールメモリ開放
Marshal.FreeHGlobal(devModeIn);
Marshal.FreeHGlobal(devModeOut);
ClosePrinter(hPrinter);
}
}
// ラジオボタンクリックイベント処理
void radioButton_Click(object sender, EventArgs e)
{
if (radioSome.Checked)
{
this.updownFrom.Enabled = true;
this.updownTo.Enabled = true;
}
else
{
this.updownFrom.Enabled = false;
this.updownTo.Enabled = false;
}
}
// OKボタンクリックイベント処理
private void buttonOk_Click(object sender, EventArgs e)
{
// ページ情報を設定
if (this.radioAll.Checked)
{
_printDoc.PrinterSettings.PrintRange = PrintRange.AllPages;
}
else if (radioCurrent.Checked)
{
_printDoc.PrinterSettings.PrintRange = PrintRange.CurrentPage;
}
else if (radioSome.Checked)
{
// 範囲のチェック
if (this.updownFrom.Value > this.updownTo.Value)
{
MessageBox.Show("ページの範囲をFrom < To となるように指定してください",
this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
_printDoc.PrinterSettings.PrintRange = PrintRange.SomePages;
_printDoc.PrinterSettings.FromPage = (int)this.updownFrom.Value;
_printDoc.PrinterSettings.ToPage = (int)this.updownTo.Value;
}
else if (radioSelect.Checked)
{
_printDoc.PrinterSettings.PrintRange = PrintRange.Selection;
}
_printDoc.PrinterSettings.Copies = (short)this.updownCopy.Value;
_printDoc.PrinterSettings.Collate = this.checkCollate.Checked;
this.DialogResult = DialogResult.OK;
this.Close();
}
// キャンセルボタンクリックイベント処理
private void buttonCancel_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Cancel;
this.Close();
}
}
}
|
|
印刷フォームの作成 |
印刷用画面 Form1 の PrintDialog を 今回作成した PrintForm に置き換えます。
|
VB[Form1.vb] |
Imports System.Drawing.Printing
Public Class Form1
Private Const MAX_PAGE_COUNT As Integer = 5
' ページ番号、部数
Private _pageNumber As Integer = 0
Private _copyNumber As Integer = 0
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Using doc As PrintDocument = New PrintDocument
Using dlog As PrintForm = New PrintForm
' プリンタオブジェクト設定
dlog.Document = doc
' 印刷可能なページ数を指定する。
dlog.PrinterSettings.MinimumPage = 1
dlog.PrinterSettings.MaximumPage = MAX_PAGE_COUNT
dlog.PrinterSettings.FromPage = 1
dlog.PrinterSettings.ToPage = MAX_PAGE_COUNT
dlog.UseEXDialog
' プリンタダイアログ表示
If dlog.ShowDialog(Me) <> Windows.Forms.DialogResult.OK Then
Return
End If
' 印刷ページ設定
Select Case (dlog.PrinterSettings.PrintRange)
Case PrintRange.AllPages
' すべてのページ
_pageNumber = 1
doc.PrinterSettings.FromPage = 1
doc.PrinterSettings.ToPage = MAX_PAGE_COUNT
Case PrintRange.CurrentPage
' 現在のページ(サンプルとして2ページ目とします)
_pageNumber = 2
doc.PrinterSettings.FromPage = 2
doc.PrinterSettings.ToPage = 2
Case PrintRange.Selection
' 選択した部分(サンプルとして2~3とします)
_pageNumber = 2
doc.PrinterSettings.FromPage = 2
doc.PrinterSettings.ToPage = 3
Case PrintRange.SomePages
' 印刷範囲指定
_pageNumber = dlog.PrinterSettings.FromPage
End Select
End Using
' PrintPage イベントハンドル追加
AddHandler doc.PrintPage, AddressOf doc_PrintPage
' 部数初期化
_copyNumber = 1
' 印刷実行
doc.Print()
End Using
End Sub
' 印刷イベント処理
Private Sub doc_PrintPage(ByVal sender As Object, _
ByVal e As System.Drawing.Printing.PrintPageEventArgs)
' 印刷範囲枠を描画
e.Graphics.DrawRectangle(Pens.Black, e.MarginBounds)
' ページ数印刷
e.Graphics.DrawString(String.Format("{0}ページ", _pageNumber), _
New Font("MSゴシック", 20, FontStyle.Bold, GraphicsUnit.Point), _
Brushes.Black, e.MarginBounds.X, e.MarginBounds.Y)
If e.PageSettings.PrinterSettings.Collate Then
' 部単位で印刷する場合
If _pageNumber < e.PageSettings.PrinterSettings.ToPage Then
e.HasMorePages = True
' ページ番号加算
_pageNumber = _pageNumber + 1
Else
If _copyNumber < e.PageSettings.PrinterSettings.Copies Then
e.HasMorePages = True
' ページ番号初期化
_pageNumber = e.PageSettings.PrinterSettings.FromPage
' 部数加算
_copyNumber = _copyNumber + 1
Else
e.HasMorePages = False
End If
End If
Else
If _copyNumber < e.PageSettings.PrinterSettings.Copies Then
e.HasMorePages = True
' 部数加算
_copyNumber = _copyNumber + 1
Else
If _pageNumber < e.PageSettings.PrinterSettings.ToPage Then
e.HasMorePages = True
' 部数初期化
_copyNumber = 1
' ページ番号加算
_pageNumber = _pageNumber + 1
Else
e.HasMorePages = False
End If
End If
End If
End Sub
End Class
|
|
C#[Form1.cs] |
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Printing;
namespace Print_CS
{
public partial class Form1 : Form
{
private const int MAX_PAGE_COUNT = 5;
// ページ番号、部数
private int _pageNumber = 0;
private int _copyNumber = 0;
public Form1()
{
InitializeComponent();
}
private void Button1_Click(object sender, EventArgs e)
{
using (PrintDocument doc = new PrintDocument())
{
using (PrintForm dlog = new PrintForm())
{
// プリンタオブジェクト設定
dlog.Document = doc;
// 印刷可能なページ数を指定する。
dlog.PrinterSettings.MinimumPage = 1;
dlog.PrinterSettings.MaximumPage = MAX_PAGE_COUNT;
dlog.PrinterSettings.FromPage = 1;
dlog.PrinterSettings.ToPage = MAX_PAGE_COUNT;
// プリンタダイアログ表示
if (dlog.ShowDialog(this) != DialogResult.OK)
return;
// 印刷ページ設定
switch (dlog.PrinterSettings.PrintRange)
{
case PrintRange.AllPages:
// すべてのページ
_pageNumber = 1;
doc.PrinterSettings.FromPage = 1;
doc.PrinterSettings.ToPage = MAX_PAGE_COUNT;
break;
case PrintRange.CurrentPage:
// 現在のページ(サンプルとして 2ページ目とします)
_pageNumber = 2;
doc.PrinterSettings.FromPage = 2;
doc.PrinterSettings.ToPage = 2;
break;
case PrintRange.Selection:
// 選択した部分(サンプルとして 2~3 とします)
_pageNumber = 2;
doc.PrinterSettings.FromPage = 2;
doc.PrinterSettings.ToPage = 3;
break;
case PrintRange.SomePages:
// 印刷範囲指定
_pageNumber = dlog.PrinterSettings.FromPage;
break;
}
}
// PrintPage イベントハンドル追加
doc.PrintPage += new PrintPageEventHandler(doc_PrintPage);
// 部数初期化
_copyNumber = 1;
// 印刷実行
doc.Print();
}
}
// 印刷イベント処理
void doc_PrintPage(object sender, PrintPageEventArgs e)
{
// 印刷範囲枠を描画
e.Graphics.DrawRectangle(Pens.Black, e.MarginBounds);
// ページ数印刷
e.Graphics.DrawString(String.Format("{0}ページ", _pageNumber),
new Font("MS ゴシック", 20, FontStyle.Bold, GraphicsUnit.Point),
Brushes.Black, e.MarginBounds.X, e.MarginBounds.Y);
if (e.PageSettings.PrinterSettings.Collate)
{
// 部単位で印刷する場合
if (_pageNumber < e.PageSettings.PrinterSettings.ToPage)
{
e.HasMorePages = true;
// ページ番号加算
_pageNumber = _pageNumber + 1;
}
else
{
if (_copyNumber < e.PageSettings.PrinterSettings.Copies)
{
e.HasMorePages = true;
// ページ番号初期化
_pageNumber = e.PageSettings.PrinterSettings.FromPage;
// 部数加算
_copyNumber = _copyNumber + 1;
}
else
{
e.HasMorePages = false;
}
}
}
else
{
if (_copyNumber < e.PageSettings.PrinterSettings.Copies)
{
e.HasMorePages = true;
// 部数加算
_copyNumber = _copyNumber + 1;
}
else
{
if (_pageNumber < e.PageSettings.PrinterSettings.ToPage)
{
e.HasMorePages = true;
// 部数初期化
_copyNumber = 1;
// ページ番号加算
_pageNumber = _pageNumber + 1;
}
else
{
e.HasMorePages = false;
}
}
}
}
}
}
|
|
|
※このページで紹介しているサンプルコードについて管理者は動作保障をいたしません※
※サンプルコードを使用する場合は、自己責任でお願いします※
|
【楽天 ランキング:パソコン・周辺機器 - ノートパソコン】
|
|
|
|
このサイトはフリーソフトのMerge HTMLで作成されています。
このサイトはリンクフリーです。
|
ページの先頭に戻る |
Copyright© 2010-2015 Jun.Shiozaki All rights reserved. |
|
|
|