すらすらプログラマーへのお問い合わせ
すらすらのブログ
アクセス数  累計:000,104,621  昨日:000,000,115  本日:000,000,061
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/15
【Amazon ランキング:ゲーム - キッズ・ニンテンドー3DS】

前回印刷ダイアログの使い方を説明しましたが、印刷ダイアログには「印刷範囲」が指定できることに気づいたと思います。
この入力項目はプロパティで使用できるようにできるのですが、実際の印刷ロジックは自分でコーディングしないといけません。ここではそのコーディング例を紹介します。他の印刷処理でもページ管理の部分はさほど変わらないと思いますので参考にしてみてください。
印刷範囲の有効化
印刷範囲を有効化するには PrinterDialog の [AllowSomePages][AllowSelection] プロパティに true を設定します。
[VB]
dlog.AllowCurrentPage = True
dlog.AllowSomePages = True
dlog.AllowSelection = True

[C#]
dlog.AllowCurrentPage = true
dlog.AllowSomePages = true;
dlog.AllowSelection = true;
※AllowCurrentPage は印刷ダイアログの[UseEXDialog]を true にした場合に表示されます。
印刷範囲の設定
印刷範囲を有効化した後は、実際に印刷できる範囲を PrinterSettings に定義しておきます。こうしておくこと印刷できないページが指定された場合にエラーが表示されるようになります。
[VB]
dlog.PrinterSettings.MinimumPage = 1
dlog.PrinterSettings.MaximumPage = MAX_PAGE_COUNT
dlog.PrinterSettings.FromPage = 1
dlog.PrinterSettings.ToPage = MAX_PAGE_COUNT

[C#]
dlog.PrinterSettings.MinimumPage = 1;
dlog.PrinterSettings.MaximumPage = MAX_PAGE_COUNT;
dlog.PrinterSettings.FromPage = 1;
dlog.PrinterSettings.ToPage = MAX_PAGE_COUNT;

選択内容の確認
プリンタダイアログで「すべて」「ページ指定」「選択した部分」のどれが選択されたかを知るには PrinterSetting.PrintRange プロパティを参照します。この値は列挙体になっていますので必要に応じて判定してください。
[VB]
Select Case (dlog.PrinterSettings.PrintRange)
    
Case PrintRange.AllPages
        
' すべてのページ
    Case PrintRange.CurrentPage
        
' 現在のページ
    Case PrintRange.Selection
        
' 選択した部分
    Case PrintRange.SomePages
        
' 印刷範囲指定
End Select

[C#]
switch (dlog.PrinterSettings.PrintRange)
{
    
case PrintRange.AllPages:
        
// すべてのページ
        break;
    
case PrintRange.CurrentPage:
        
// 現在のページ
        break;
    
case PrintRange.Selection:
        
// 選択した部分
        break;
    
case PrintRange.SomePages:
        
// 印刷範囲指定
        break;
}
※PrintRange.CurrentPage は印刷ダイアログの[UseEXDialog]を true にした場合に選択状態にできます。
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 PrintDialog = New PrintDialog
                
' プリンタオブジェクト設定
                dlog.Document = doc

                
' 印刷範囲の指定を有効にする
                dlog.AllowCurrentPage = True
                dlog.AllowSomePages = True
                dlog.AllowSelection = True

                ' 印刷可能なページ数を指定する。
                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)

        
' 注意!!
        '  ヘルプにはCollate プロパティに「部単位」で印刷にチェック状態が設定されるとあるが
        '  実際にはtrue にならないので注意してください。
        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 (PrintDialog dlog = new PrintDialog())
                {
                    
// プリンタオブジェクト設定
                    dlog.Document = doc;

                    
// 印刷範囲の指定を有効にする
                    dlog.AllowCurrentPage = true;
                    dlog.AllowSomePages = 
true;
                    dlog.AllowSelection = 
true;

                    
// 印刷可能なページ数を指定する。
                    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);

            
// 注意!!
            //  ヘルプには Collate プロパティに「部単位」で印刷にチェック状態が設定されるとあるが
            //  実際には true にならないので注意してください。
            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.