すらすらプログラマーへのお問い合わせ
すらすらのブログ
アクセス数  累計:000,125,017  昨日:000,000,099  本日:000,000,039
Loading
印刷
.NET プログラミング
プロパティグリッド
印刷
リストボックス
スレッド
リストビュー
インストーラー
やってみよう!

できるVisual Studio 2015 Windows /Android/iOS アプリ対応

独習C# 第3版

VisualBasic2013パーフェクトマスター (Perfect Master SERIES)

プログラミング.NET Framework 第4版 (Microsoft Press)

VisualBasic2013逆引き大全555の極意

猫でもわかるWindowsプログラミング 第4版 (猫でもわかるプログラミング)

VisualC#2013逆引き大全555の極意

印刷ダイアログ③ 最終更新:2010/07/22
【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(); 
foreachstring 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 IntegerAs 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 IntegerAs 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.