c#教程之列印和預覽列印

來源:互聯網
上載者:User

標籤:

4.1      列印和預覽列印

列印和預覽列印是一個編輯器必須具有的功能,本節介紹實現列印和預覽列印的方法。一般要實現如下功能表項目:列印、預覽列印、版面設定。

4.8.1PrintDocument類

PrintDocument組件是用於完成列印的類,其常用屬性、方法和事件如下:
l  屬性DocumentName:字串類型,記錄列印文檔時顯示的文檔名(例如,在列印狀態對話方塊或印表機隊列中顯示)。
l  方法Print:開始文檔的列印。
l  事件BeginPrint:在調用Print方法後,在列印文檔的第一頁之前發生。
l  事件PrintPage:需要列印新的一頁時發生。
l  事件EndPrint:在文檔的最後一頁列印後發生。
若要列印,首先建立PrintDocument組件的對象。然後使用版面設定對話方塊PageSetupDialog設定頁面列印方式,這些設定作為要列印的所有頁的預設設定。使用列印對話方塊PrintDialog設定對文檔進行列印的印表機的參數。在開啟兩個對話方塊前,首先設定對話方塊的屬性Document為指定的PrintDocument類對象,修改的設定將儲存到PrintDocument組件對象中。第三步是調用PrintDocument.Print方法來實際列印文檔。當調用該方法後,引發下列事件:BeginPrint、PrintPage、EndPrint。其中每列印一頁都引發PrintPage事件,列印多頁,要多次引發PrintPage事件。完成一次列印,可以引發一個或多個PrintPage事件。
程式員應為這3個事件編寫事件處理函數。BeginPrint事件處理函數進行列印初始化,一般設定在列印時所有頁的相同屬性或共用的資源,例如所有頁共同使用的字型、建立要列印的檔案流等。PrintPage事件處理函數負責列印一頁資料。EndPrint事件處理函數進行列印善後工作。這些處理函數的第2個參數System.Drawing.Printing.PrintEventArgs e提供了一些附加資訊,主要有:
l e.Cancel:布爾變數,設定為true,將取消這次列印工作。
l e.Graphics:所使用的印表機的裝置環境,參見第五章。
l e.HasMorePages:布爾變數。PrintPage事件處理函數列印一頁後,仍有資料未列印,退出事件處理函數前設定HasMorePages=true,退出PrintPage事件處理函數後,將再次引發PrintPage事件,列印下一頁。
l e.MarginBounds:列印範圍的大小,是Rectangle結構,元素包括左上方座標:Left和Top,寬和高:Width和Height。單位為1/100英寸。
l e.MarginBounds:列印紙的大小,是Rectangle結構。單位為1/100英寸。
l e.PageSettings:PageSettings類對象,包含用對話方塊PageSetupDialog設定的頁面列印方式的全部資訊。可用協助查看PageSettings類的屬性。
下邊為這3個事件編寫事件處理函數,具體步驟如下:
(1)    在最後一個using語句之後增加語句:
using System.IO;
using System.Drawing.Printing;
(2)    本例列印或預覽RichTextBox中的內容,增加變數:StringReader streamToPrint=null。如果列印或預覽檔案,改為:StreamReader streamToPrint,流的概念參見第六章。增加列印使用的字型的變數:Font printFont。
(3)    放PrintDocument控制項到表單,屬性name為printDocument1。
(4)    為printDocument1增加BeginPrint事件處理函數如下:
private void printDocument1_BeginPrint(object sender,
System.Drawing.Printing.PrintEventArgs e)
{   printFont=richTextBox1.Font;//列印使用的字型
streamToPrint=new StringReader(richTextBox1.Text);//列印richTextBox1.Text
}//如預覽檔案改為:streamToPrint=new StreamReader("檔案的路徑及檔案名稱");
(5)    printDocument1的PrintPage事件處理函數如下。streamToPrint.ReadLine()讀入一段資料,可能列印多行。本事件處理函數將此段資料列印在一行上,因此方法必須改進。
private void printDocument1_PrintPage(object sender,
System.Drawing.Printing.PrintPageEventArgs e)
{   float linesPerPage=0;//記錄每頁最大行數
    float yPos=0;//記錄將要列印的一行資料在垂直方向的位置
    int count=0;//記錄每頁已列印行數
    float leftMargin=e.MarginBounds.Left;//左邊距
    float topMargin=e.MarginBounds.Top;//頂邊距
    string line=null;//從RichTextBox中讀取一段字元將存到line中
    //每頁最大行數=一頁紙列印範圍的高度/一行字元的高度
    linesPerPage=e.MarginBounds.Height/printFont.GetHeight(e.Graphics);
    //如果當前頁已列印行數小於每頁最大行數而且讀出資料不為null,繼續列印
    while(count<linesPerPage&&((line=streamToPrint.ReadLine())!=null))
    {   //yPos為要列印的當前行在垂直方向上的位置
yPos=topMargin+(count*printFont.GetHeight(e.Graphics));
        e.Graphics.DrawString(line,printFont,Brushes.Black,
leftMargin,yPos,new StringFormat());//列印,參見第五章
        count++;//已列印行數加1
    }
    if(line!=null)//是否需要列印下一頁
        e.HasMorePages=true;//需要列印下一頁
    else
        e.HasMorePages=false;//不需要列印下一頁
}
(6)    為printDocument1增加EndPrint事件處理函數如下:
private void printDocument1_EndPrint (object sender,
System.Drawing.Printing.PrintEventArgs e)
{   if(streamToPrint!=null)
        streamToPrint.Close();//釋放不用的資源
}

4.8.2列印設定對話方塊控制項PageSetupDialog

Windows表單的PageSetupDialog控制項是一個版面設定對話方塊,用於在Windows應用程式中設定列印頁面的詳細資料,對話方塊的外觀4.8.2。

圖4.8.2
使用者使用此對話方塊能夠設定紙張大小(類型)、紙張來源、縱向與橫向列印、上下左右的頁面邊界等。在開啟對話方塊前,首先設定其屬性Document為指定的PrintDocument類對象,用來把版面設定儲存到PrintDocument類對象中。為文字編輯器增加版面設定功能的具體步驟如下:
(7)    為檔案頂級功能表項目的快顯功能表增加功能表項目:版面設定。
(8)    放PageSetupDialog控制項到表單,屬性name為pageSetupDialog1。
(9)    為版面設定功能表項目增加單擊事件處理函數如下:
private void menuItem5_Click(object sender,System.EventArgs e)
{   pageSetupDialog1.Document=printDocument1;
pageSetupDialog1.ShowDialog();
}
(10)開啟對話方塊pageSetupDialog1後,如果單擊了確定按鈕,PageSetupDialog對話方塊中所做的的版面設定被儲存到PrintDocument類對象printDocument1中,如果單擊了取消按鈕,不儲存這些修改,維持原來的值。當調用PrintDocument.Print方法來實際列印文檔時,引發PrintPage事件,該事件處理函數的第二個參數e提供了這些設定資訊。

4.8.3預覽列印

PrintPreviewDialog類可以在螢幕上顯示PrintDocument的列印效果,既預覽列印。實現預覽列印的具體步驟如下:
(11)為檔案頂級功能表項目的快顯功能表增加功能表項目:預覽列印。
(12)放PrintPreviewDialog控制項到表單,屬性name為printPreviewDialog1。
(13)為預覽列印功能表項目增加單擊事件處理函數如下:
private void menuItemPrintView_Click(object sender,System.EventArgs e)
{   printPreviewDialog1.Document=printDocument1;
printPreviewDialog1.ShowDialog();
}
(14)編譯,運行,輸入若干字元,實驗一下預覽的效果,預覽的效果4.8.3。

圖4.8.3

4.8.4用列印對話方塊PrintDialog實現列印

PrintDialog組件是類庫中預先定義的對話方塊,用來設定對文檔進行列印的印表機的參數,包括印表機名稱、要列印的頁(全部列印或指定頁的範圍)、列印的份數以及是否列印到檔案等。在開啟對話方塊前,首先設定其屬性Document為指定的PrintDocument類對象,開啟PrintDialog對話方塊後,修改的設定將儲存到PrintDocument類的對象中。PrintDialog對話方塊的外觀4.8.4。

圖4.8.4
增加列印功能的具體步驟如下:
(15)放PrintDialog控制項到表單內容Name=printDialog1。
(16)為檔案頂級功能表項目的快顯功能表增加功能表項目:列印。
(17)為列印功能表項目增加單擊事件處理函數如下:(不能列印?)
private void menuItemPrint_Click(object sender, System.EventArgs e)
{   printDialog1.Document=printDocument1;
    if(printDialog1.ShowDialog(this)==DialogResult.OK)
        printDocument1.Print();
}
(18)編譯,運行,輸入若干字元,實驗一下列印效果。

c#教程之列印和預覽列印

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.