閱讀英文

共用方式為


操作說明:使用預覽列印在 Windows Forms 中進行列印

這在 Windows Forms 程式設計中很常見,除了列印服務,還提供預覽列印。 若要將預覽列印服務加入您的應用程式,有一個簡單的方法,那就是使用 PrintPreviewDialog 控制項結合 PrintPage 事件處理邏輯來列印檔案。

使用 PrintPreviewDialog 控制項來預覽文字文件

  1. PrintPreviewDialogPrintDocument和兩個字串加入您的表單。

    private PrintPreviewDialog printPreviewDialog1 = new PrintPreviewDialog();
    private PrintDocument printDocument1 = new PrintDocument();
    
    // Declare a string to hold the entire document contents.
    private string documentContents;
    
    // Declare a variable to hold the portion of the document that
    // is not printed.
    private string stringToPrint;
    
  2. DocumentName 屬性設定為您想要列印的文件,開啟文件,並將文件內容讀取至您之前加入的字串。

    private void ReadDocument()
    {
        string docName = "testPage.txt";
        string docPath = @"c:\";
        printDocument1.DocumentName = docName;
        using (FileStream stream = new FileStream(docPath + docName, FileMode.Open))
        using (StreamReader reader = new StreamReader(stream))
        {
            documentContents = reader.ReadToEnd();
        }
        stringToPrint = documentContents;
    }
    
  3. 就像平常在列印文件一樣,在 PrintPage 事件處理常式中,使用 Graphics 類別的 PrintPageEventArgs 屬性以及檔案內容來計算每一頁的行數,並轉譯文件的內容。 在繪製每一頁之後,請檢查該頁面是否為最後一頁,並且據此設定 HasMorePagesPrintPageEventArgs 屬性。 在 PrintPage 成為 HasMorePages 之前,會持續引發 false事件。 當文件已完成轉譯時,重設要轉譯的字串。 此外,也請確定 PrintPage 事件與其事件處理方法相關聯。

    注意

    如果您已經在應用程式中實作列印,可能已經完成步驟 2 和 3。

    在下列程式碼範例中,會使用事件處理常式,以表單上使用的相同字型來列印 "testPage.txt" 檔案。

    void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
    {
        int charactersOnPage = 0;
        int linesPerPage = 0;
    
        // Sets the value of charactersOnPage to the number of characters
        // of stringToPrint that will fit within the bounds of the page.
        e.Graphics.MeasureString(stringToPrint, this.Font,
            e.MarginBounds.Size, StringFormat.GenericTypographic,
            out charactersOnPage, out linesPerPage);
    
        // Draws the string within the bounds of the page.
        e.Graphics.DrawString(stringToPrint, this.Font, Brushes.Black,
        e.MarginBounds, StringFormat.GenericTypographic);
    
        // Remove the portion of the string that has been printed.
        stringToPrint = stringToPrint.Substring(charactersOnPage);
    
        // Check to see if more pages are to be printed.
        e.HasMorePages = (stringToPrint.Length > 0);
    
        // If there are no more pages, reset the string to be printed.
        if (!e.HasMorePages)
            stringToPrint = documentContents;
    }
    
  4. Document 控制項的 PrintPreviewDialog 屬性設為表單上的 PrintDocument 元件。

    printPreviewDialog1.Document = printDocument1;
    
  5. ShowDialog 控制項上呼叫 PrintPreviewDialog 方法。 您通常會從按鈕的 ShowDialog 事件處理方法來呼叫 Click 。 呼叫 ShowDialog 會引發 PrintPage 事件,並將輸出轉譯至 PrintPreviewDialog 控制項。 當使用者按一下對話方塊中的列印圖示,就會再引發一次 PrintPage 事件,將輸出傳送至印表機,而不是預覽對話方塊。 這就是為什麼在步驟 3 中轉譯程序的最後會重設字串的原因。

    下列程式碼範例顯示針對表單上的按鈕所使用的 Click 事件處理方法。 這個事件處理方法會呼叫方法來讀取文件,並顯示預覽列印對話方塊。

    private void printPreviewButton_Click(object sender, EventArgs e)
    {
        ReadDocument();
        printPreviewDialog1.Document = printDocument1;
    printPreviewDialog1.ShowDialog();
    }
    

範例

using System;
using System.Drawing;
using System.IO;
using System.Drawing.Printing;
using System.Windows.Forms;

namespace PrintPreviewApp
{
    public partial class Form1 : Form
    {
        private Button printPreviewButton;

        private PrintPreviewDialog printPreviewDialog1 = new PrintPreviewDialog();
        private PrintDocument printDocument1 = new PrintDocument();

        // Declare a string to hold the entire document contents.
        private string documentContents;

        // Declare a variable to hold the portion of the document that
        // is not printed.
        private string stringToPrint;

        public Form1()
        {
            this.printPreviewButton = new System.Windows.Forms.Button();
            this.printPreviewButton.Location = new System.Drawing.Point(12, 12);
            this.printPreviewButton.Size = new System.Drawing.Size(125, 23);
            this.printPreviewButton.Text = "Print Preview";
            this.printPreviewButton.Click += new System.EventHandler(this.printPreviewButton_Click);
            this.ClientSize = new System.Drawing.Size(292, 266);
            this.Controls.Add(this.printPreviewButton);
            printDocument1.PrintPage +=
                new PrintPageEventHandler(printDocument1_PrintPage);
        }
        private void ReadDocument()
        {
            string docName = "testPage.txt";
            string docPath = @"c:\";
            printDocument1.DocumentName = docName;
            using (FileStream stream = new FileStream(docPath + docName, FileMode.Open))
            using (StreamReader reader = new StreamReader(stream))
            {
                documentContents = reader.ReadToEnd();
            }
            stringToPrint = documentContents;
        }

        void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
        {
            int charactersOnPage = 0;
            int linesPerPage = 0;

            // Sets the value of charactersOnPage to the number of characters
            // of stringToPrint that will fit within the bounds of the page.
            e.Graphics.MeasureString(stringToPrint, this.Font,
                e.MarginBounds.Size, StringFormat.GenericTypographic,
                out charactersOnPage, out linesPerPage);

            // Draws the string within the bounds of the page.
            e.Graphics.DrawString(stringToPrint, this.Font, Brushes.Black,
            e.MarginBounds, StringFormat.GenericTypographic);

            // Remove the portion of the string that has been printed.
            stringToPrint = stringToPrint.Substring(charactersOnPage);

            // Check to see if more pages are to be printed.
            e.HasMorePages = (stringToPrint.Length > 0);

            // If there are no more pages, reset the string to be printed.
            if (!e.HasMorePages)
                stringToPrint = documentContents;
        }
        private void printPreviewButton_Click(object sender, EventArgs e)
        {
            ReadDocument();
            printPreviewDialog1.Document = printDocument1;
        printPreviewDialog1.ShowDialog();
        }

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

編譯程式碼

這個範例需要:

  • System、System.Windows.Forms、System.Drawing 組件的參考。

另請參閱