2.5 案例分析5 使用打印

2.5.1 案例描述

本节介绍在应用程序中如何将数据输出到打印机,以及程序中使用打印设置的基本方法。

2.5.2 案例分析

PrintDocument类的使用,打印设置和预览功能的实现。

2.5.3 案例实现与技巧

① 首先,运行Visual Studio 2005,创建名为PrintApp的Windows应用程序。

② 向窗体拖曳一个MenuStrip控件,一个PrintDocument控件,一个PrintDialog控件和一个PrintPreviewDialog控件。

③ 将MenuStrip控件命名为file,在file菜单下添加三个下拉菜单,Text属性分别为“打印设置”、“打印预览”、“打印”。

④ 添加一个下拉菜单其Text属性为“-”,作为分隔线。

⑤ 添加下拉菜单“退出”。

⑥ 在设计视图中,修改printDialog1和printPreviewDialog1控件的Document属性为“printDocument1”。

⑦ 修改“文件”菜单的name属性为“fileToolStripMenuItem”,下拉菜单“打印设置”、“打印预览”和“打印”的name属性分别为“pageSetupToolStripMenuItem”、“printPreviewToolStripMenuItem”和“printToolStripMenuItem”。

⑧ 向窗体添加一个RichTextBox控件,在属性“窗口”中修改属性“Dock”为“Fill”,使RichTextBox控件填充满这个窗体。

⑨ 在“打印设置”菜单上双击,在打开的事件响应程序中添加如下代码:

printDialog1.ShowDialog();

⑩ 在“打印预览”菜单上双击,在打开的事件响应程序中添加如下代码:

try
{
    printPreviewDialog1.ShowDialog();
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message,"打印出错",MessageBoxButtons.OK,Message BoxIcon.Error);
}

⑪ 在“打印”菜单上双击,在打开的事件响应程序中添加如下代码:

try
{
    printDocument1.Print();
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message,"打印出错",MessageBoxButtons.OK,Message BoxIcon.Error);
}

⑫ 转换到Form1的设计窗口,选中printDocument1控件,在右下方属性窗口中添加响应PrintPage事件的方法,如图2-12所示。

图2-12 修改控件属性

⑬ 在方法中添加如下代码:

Graphics g = e.Graphics; //获得绘图对象
float linesPerPage = 0; //页面的行号
float yPosition = 0; //绘制字符串的纵向位置
int count = 0; //行计数器
float leftMargin = e.MarginBounds.Left; //左边距
float topMargin = e.MarginBounds.Top; //上边距
string line = null;// 行字符串
StringReader lineReader= new StringReader(richTextBox1.Text);
Font printFont = this.richTextBox1.Font; //当前的打印字体
SolidBrush myBrush = new SolidBrush(Color.Black);//刷子
linesPerPage = e.MarginBounds.Height / printFont.GetHeight(g);//每页可打印的行数
//逐行的循环打印一页
while(count < linesPerPage && ((line=lineReader.ReadLine()) != null))
{
    yPosition = topMargin + (count * printFont.GetHeight(g));
    g.DrawString(line,printFont,myBrush,leftMargin,yPosition,new StringFormat());
    count++;
}
if(line != null)
    e.HasMorePages = true;
else
    e.HasMorePages = false;

⑭ 在程序开头添加如下引用:

using System.IO;
using System.Draw;

⑮ 程序运行结果如图2-13所示。

⑯ 未检测到打印机设备,程序抛出异常被捕获,如图2-14所示。

图2-13 程序运行结果(一)

图2-14 程序运行结果(二)